如何禁用 Kotlin Android 扩展插件生成合成视图属性

Posted

技术标签:

【中文标题】如何禁用 Kotlin Android 扩展插件生成合成视图属性【英文标题】:How to disable the generating of synthetic view properties by the Kotlin Android extensions plugin 【发布时间】:2019-06-08 14:19:53 【问题描述】:

Kotlin android Extensions 插件为每个视图生成静态属性,并使用我的应用布局文件中的 ID,如 the documentation 中所述。

我想禁用此功能,因为我们使用 DataBinding 而不是 Kotlin 合成视图属性,有时我会不小心导入它们;它还为我们不使用的东西增加了额外的构建开销。

无法禁用 Android 扩展插件,因为我们使用的是同一个插件完成的 Parcelize 功能。

【问题讨论】:

对于意外导入问题,一种缓解方法是在“设置”>“编辑器”>“常规”>“自动导入”中编辑您的 Android Studio 设置,并添加到排除的包列表中。 【参考方案1】:

androidExtensions DSL 中有一个features 属性,允许您提供要启用的功能列表。目前,只有两个可用,parcelizeviews。要禁用合成视图属性,请将其添加到您的 build.gradle

android 
   // ...


androidExtensions 
    features = ["parcelize"]

来源:https://github.com/JetBrains/kotlin/blob/6bef27e1e889b17ae84dd2ff99881727f13ac3e5/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/AndroidComponentRegistrar.kt#L57

【讨论】:

谢谢,这几乎完全有效,我唯一的问题是它仍然会生成合成类。但如果你尝试编译应用程序,它就会失败。 这对我来说没有任何改变,在 Android Studio 3.4 上。对合成对象的引用仍然可以编译和运行。 这适用于我在 Android Studio 3.5.3 上。请注意,androidExtensions 是***闭包,这意味着它超出了 android 闭包。 这对我在 Android Studio 4.0 Beta 5 上不起作用,即使作为***闭包也是如此。它仍在生成合成属性 @kyhule 如果我们也不使用 parcelize 怎么办? features = [] 就够了吗?【参考方案2】:

现在,android-extensions 插件是 discontinued,因此最好的解决方案是通过从您的 build.gradle 中删除 apply plugin: 'kotlin-android-extensions' 来删除此插件。

我们应该使用ViewBinding 或DataBinding,而不是合成。

如第一个链接中所述,如果您还使用 parcelizer,只需将 android-extensions 插件更改为 kotlin-parcelize 并将导入语句 import kotlinx.android.parcel.Parcelize 更改为 import kotlinx.parcelize.Parcelize 即可。

有关从 android-extensions 迁移到 JetPack here 的更多信息。

【讨论】:

以上是关于如何禁用 Kotlin Android 扩展插件生成合成视图属性的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Kotlin 错误链接到 Android Studio 中的源?

kotlin-android-extensions插件被废弃--解决办法

无法将 Kotlin Android 扩展添加到我的项目

Android-Kotlin-配置/入门

谷歌发布 Android KTX 预览版:提供相应 API 层,让Kotlin开发更简洁

如何启用被禁用的Chrome第三方插件