“kotlin-android-extensions” Gradle 插件已被弃用。

73

使用Gradle版本6.2和Android Studio版本4.0.1时,我收到了有关 Kotlin-android-extention 的弃用消息。是否有人知道如何修复它?


嗨,Ali。Kotlin-android-extension已被弃用,你应该考虑使用view binding。请查看博客以获取有关它的详细说明和反模式viewbinding - Chetan Gupta
嗨@ChetanGupta,感谢您的评论。是的,您说得对。我按照答案所示做了,现在它对我来说运行良好。 - Yoshimitsu
1
请按照此文档进行操作 - https://developer.android.com/topic/libraries/view-binding/migration - Ranjithkumar
12个回答

78

根据谷歌文档,Kotlin Android Extensions已经被弃用。

Kotlin Android Extensions已经被弃用,这意味着不再支持使用Kotlin合成来进行视图绑定。

对于那些想知道什么是synthetic的人,我应该说,使用Kotlin可以通过在Gradle中添加'kotlin-android-extensions'来实现访问UI视图ID的简单方式。

  • 如果您的应用程序使用Parcelable,则可以使用'kotlin-parcelize'代替'kotlin-android-extensions'
  • 如果您的应用程序使用Kotlin Synthetics进行视图绑定,请使用此指南迁移到Jetpack ViewBindingData Binding

你知道在代码中绝对需要更换合成材料的截止日期吗? - natansalda
1
@natansalda 我没有找到任何具体的日期。这主要取决于您的Android Studio版本。 - Yoshimitsu
2
自从2022年4月以来,这个扩展就停止工作了。 - UNREAL

40

现在已经过时

  • 从插件中删除'Kotlin-android-extensions'。(用于Kotlin合成方式访问UI元素)

  • 添加以下内容以使用view binding方式访问UI元素。

android {
   ...
   buildFeatures {
       viewBinding true
   }
}
  • 如果您的应用程序包含 Parcelable,请添加'kotlin-parcelize'插件,以使用一种简单的方式通过将@Parcelize注释添加到类来创建可包裹对象。

  • 您可以查看Google指南了解此更新的详细信息。


    19

    由于"kotlin-android-extensions"现已弃用,因此最好使用视图绑定。

    为此,请在build.gradle文件中的android块下编写以下代码以启用视图绑定。

    buildFeatures {
        viewBinding true
    } 
    

    然后在活动文件中使用视图绑定功能

    首先声明一个全局变量用于绑定,如下:

    private lateinit var binding:ActivityMainBinding
    

    这里的ActivityMainBinding是一个自动生成的类

    然后在OnCreate()方法中编写以下代码

    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
    

    8
    最新的Kotlin工作版本为1.7.21。

    6
    在我看来,使用这个插件仍然比介绍的方法更好,我们只需要注意ID。 因为2017年发布了Android Kotlin扩展Gradle插件,其中包括Kotlin Synthetics。对于每个布局文件,Kotlin Synthetics会创建一个自动生成的类,其中包含您的视图-就是这么简单。 你只需要在Gradle文件中导入这个插件,然后直接引用视图引用变量即可。 它内部调用findViewById只有一次,并且缓存它。 这样很方便,很有趣,那么为什么它被弃用呢?让我们分析一下。 优点 没有样板代码 - 只需在Gradle文件中配置一次,Kotlin Synthetics将自动为您生成一个类,准备好供您使用。 类型安全 - 所有视图都是从已知其类型的布局文件中选择的。 缺点 部分空安全性 - 通常情况下是空安全的,因为所有视图必须存在于布局文件中才能生成。但是,如果您有基于配置的多个布局文件,其中一些布局文件中存在某些视图而在某些布局文件中不存在怎么办?在这种情况下,您必须手动检查空值。 污染命名空间 - 您可以在不同的布局中拥有相同的视图ID,您可能会意外地导入其他布局的视图,这将在运行时引发NullPointerException。 只能使用Kotlin - Kotlin Synthetics只能与Kotlin一起使用。它们不支持Java。仍有一些项目是用Java编写的,并且可能尚未完全迁移到Kotlin,因此Kotlin Synthetics可能不是在项目中获取ViewIds的一致方法。 由于这些问题,Kotlin Synthetics现在已被弃用。 现在轮到你决定是否像我一样仍然想使用这个插件,如果你想避免使用过时的方法,你必须避免使用被弃用的方法。

    2

    以上答案是正确的,但是如果你从项目中删除 'kotlin-android-extensions',那么使用kotlin的合成方式访问视图属性就不可能了,所以你需要迁移到使用view binding,按照Google的这篇指南进行迁移: 链接


    1
    谷歌提供了一种新的视图绑定方式,而不是使用 'kotlin-android-extensions'。 在应用程序模块的 build.gradle 中添加以下插件。
        android {
        ...
        buildFeatures {
            viewBinding true
        }
    }
    

    0

    如已经声明的那样,Kotlin Synthetics已被弃用,应该被View Binding替代。在我的情况下,我想引入View Binding并逐渐从Kotlin Synthetics迁移。在一个项目中可以同时使用两者,只需要记住不要更新Kotlin版本 - 我在4.1.21上遇到了构建错误,所以需要降级到1.4.10

    还要记得从已经迁移到使用View Binding的类(通常是activity/fragment)中删除Kotlin Synthetics导入。


    0
    启用视图绑定。要在使用该功能的模块中启用它,请将以下内容添加到您的 build.gradle 文件中。
       android {
        buildFeatures {
           viewBinding true
        }
        }
    

    然后将此代码添加到您的主活动中。
    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
    }
    

    binding.objectID.text = "Text "
    

    0
    以下步骤有助于管理片段的视图绑定:
    1. 从插件中移除 'Kotlin-android-extensions'。
    2. 在你的 app/build.gradle 中添加以下代码:
      android {
           ...
           buildFeatures {
               viewBinding true
           }
       }
      
    3. 然后在你的 Fragment 中添加以下代码:
    class HomeFragment : Fragment() { 主页片段类:Fragment() {
    private lateinit var binding: FragmentHomeBinding
    private lateinit var viewModel: HomeViewModel
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = FragmentHomeBinding.inflate(layoutInflater)
    }
    
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        viewModel = ViewModelProvider(this)[HomeViewModel::class.java]
        binding = FragmentHomeBinding.inflate(inflater, container, false)
    
        binding.txtVw.text = menuItem.title
        binding.imgVwIcon.setImageResource(menuItem.iconId)
    
        return binding.root
    }
    

    }


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接