禁用Kotlin合成绑定在使用Android数据绑定时。

8
我正在学习这个 Android/Kotlin/KTX 的优达学城课程。在“关于我”应用程序中介绍了数据绑定,而安卓团队似乎建议不要使用 KTX 绑定。因此,我想选择前者而不是后者。
然而,事情并不像预期的那样进行。以下是我面临的奇怪问题:
  1. 第一次尝试时,我无法使Android Studio识别任何R.id.viewName ID。输入R.id.会给我各种选项,例如R.id.action_bar,但没有来自我的活动。在某个时间点,这个问题解决了。
  2. 编辑器抱怨未解决的数据绑定类引用,直到我构建它为止(例如lateinit var binding: ActivityMainBinding)。实际上,我认为需要多次构建,可能是由于我在其他地方搞砸了(见下文)。
  3. 每个视图ID仍然被生成为包含该ID视图对象的全局变量。也就是说,如果我有一个名为doneButton的按钮,我可以通过导入它来在代码中引用它作为合成doneButton。我假设这意味着对象总是在运行时构建,即使我不打算使用它们。如何让这些KTX样式的绑定消失?

这是我的构建gradle:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.3.31'
    repositories {
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()

    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

这是我的模块 Gradle:

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.android.aboutme"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {
        enabled = true
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

在网上搜索生成数据绑定类的方法时,我发现需要在gradle.properties中包含以下行(可能需要)

android.databinding.enableV2=true

我在这样做之后进行了重建,然后,类终于构建成功了。因此,我准备向Udacity发送反馈意见,但我决定最好确保我真正理解了是什么修复了问题。所以,在成功运行程序后,我删除了上述gradle.properties行,清理并重新构建了项目。令我惊讶的是,它仍然构建和运行。
因此,我不知道是什么修复了问题或如何解决下一个项目中的这些问题。
我还希望防止实例化所有全局KTX绑定类,但我仍然对如何做到这一点毫无头绪。 另一个SO答案声称提供了两种解决生成绑定类问题的方法,但给出的解决方案是针对2016年和2017年的,而上述gradle文件目前正在工作(生成绑定类),尽管没有实施那些解决方案,因此显然有一种更新的方法。
感谢您提供的任何帮助!(哦,我还应该提到,我使用的是完全更新的Android Studio版本3.4。) 更新 1: 我正在取得一些进展。似乎 Android Studio 3.4 代码编辑器是唯一无法识别生成的数据绑定类的东西。在重新构建后,这些类再次被识别,但在清理后就会失去识别。我还不确定这种理解是否解决了我所有的问题...

更新 2: 这是(至少部分)Android Studio 的一个 bug,已在三月份修复,即将发布 Canary 7 版本。


1
关于禁用Kotlin合成访问器,您可以尝试https://dev59.com/kVQJ5IYBdhLWcg3wSTx1#55643236。 “虽然Android团队似乎不建议使用KTX绑定” - 谷歌既没有认可也没有反对它(例如,请参见[此处](https://old.reddit.com/r/androiddev/comments/ala9p2/why_kotlinx_synthetic_is_no_longer_a_recommended/efdvpkg/))。 - CommonsWare
谢谢。我找不到那个SO问题,但答案没有改变任何东西。 - Joe Lapp
5
如果您没有使用@Parcelize或依赖它的内容,那么您可以删除apply plugin: 'kotlin-android-extensions',因为这个插件会生成合成访问器。 - CommonsWare
成功了!我猜Kotlin扩展没有太多需要注意的地方,是吧?我想知道为什么Android Studio 3.4默认将它们添加到项目中。 - Joe Lapp
你找到了如何禁用Kotlin合成的答案吗?我也想在我的项目中禁用它们,因为它们会导致各种运行时错误。 - IgorGanapolsky
抱歉 @IgorGanapolsky,我没有进一步了解这个问题,现在我正在编写一个Flutter应用程序。 - Joe Lapp
1个回答

0
为了禁用 Kotlin Synthetic 访问,请从应用级别的 build.gradle 文件中删除插件 kotlin-android-extensions。该插件会生成合成导入。

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