Android 多个模块中的 DataBinding 自定义适配器

Android DataBinding custom adapter in multiple modules

上下文

我有 3 个模块:ABappapp依赖于AA依赖于B.

自定义数据绑定适配器在 B

app -> A -> B

所有模块都启用了数据绑定以及 kapt 插件。

plugins {
    kotlin("kapt")
}

android {
    dataBinding.isEnabled = true
}

问题

假设我有以下绑定适配器函数:

@BindingAdapter("fontWeight")
fun TextView.setFontWeight(family: String)

app中,我可以将其用作扩展函数,但不能将其用作自定义绑定适配器。

textView.setFontWeight("bold") // It works

<TextView
  app:fontWeight='@{"bold"}' // It doesn't work

有趣的是,如果我使 app 模块直接依赖于 B,那么绑定适配器会按预期工作。

app -> B

有什么问题吗?你有什么想法?提前致谢。

更新

当我从 build.gradle.kts 中删除这行代码时,它可以正常工作,但我无法弄清楚发生了什么。

flavorDimensions("dimension")

productFlavors {
    create("dev")
    create("staging")
    create("production")

    forEach { flavor ->
        with(flavor) {
            dimension = "dimension"
            versionCode = generateVersionCode(name)
            versionName = generateVersionName(name)

            if (name != "production") {
                applicationIdSuffix = ".$name"
            }
        }
    }
}

我认为这是 implementationapi 在 gradle 中的区别。 当您对 A 使用 implementation 并且可以使用该模块时,当使用 api 时,您的应用程序依赖于 A 及其所有依赖项,例如 B.

问题是我在 AndroidManifest.xml 中为模块 A 和模块 B 使用了相同的包名称。

<!-- AndroidManifest.xml in Module A -->
<manifest package="co.riiid.santa.design" />

<!-- AndroidManifest.xml in Module B -->
<manifest package="co.riiid.santa.design" />

更改模块 B 的包名称解决问题。

<!-- Append "components" at the end -->
<manifest package="co.riiid.santa.design.components" />

没想到会出问题..


我不确定为什么会导致这个问题,但这是我的猜测:

注释处理工具kapt为每个启用了数据绑定的模块生成一个classDataBinderMapperImpl。结果 class 位于 AndroidManifest.xml

中指定的包中

因此,如果存在包名相同的模块,就会发生冲突。