我有3个模块:A
,B
和app
。 app
取决于A
,A
取决于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"
}
}
}
}
问题是我在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
“ >>
因此,如果有些模块具有相同的程序包名称,则会发生冲突。
我认为这是implementation
和api
的差异。当您将implementation
用于A时,您可以使用该模块;当您使用api
时,您的应用程序依赖于A及其所有依赖项,例如B。