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

问题描述 投票:1回答:2

上下文

我有3个模块:ABappapp取决于AA取决于B

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

app -> A -> B

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

plugins {
    kotlin("kapt")
}

android {
    dataBinding.isEnabled = true
}

问题

假设我具有以下绑定adpater函数:

@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"
            }
        }
    }
}
android android-databinding
2个回答
1
投票

问题是我在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为每个已启用数据绑定的模块生成一个类DataBinderMapperImpl。结果类位于包中在AndroidManifest.xml

中指定的类中

“用于参考的打包结构”“ >>

因此,如果有些模块具有相同的程序包名称,则会发生冲突。


0
投票

我认为这是implementationapi的差异。当您将implementation用于A时,您可以使用该模块;当您使用api时,您的应用程序依赖于A及其所有依赖项,例如B。

© www.soinside.com 2019 - 2024. All rights reserved.