Android 多个模块中的 DataBinding 自定义适配器
Android DataBinding custom adapter in multiple modules
上下文
我有 3 个模块:A
、B
和 app
。 app
依赖于A
,A
依赖于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"
}
}
}
}
我认为这是 implementation
和 api
在 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
中指定的包中
因此,如果存在包名相同的模块,就会发生冲突。
上下文
我有 3 个模块:A
、B
和 app
。 app
依赖于A
,A
依赖于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"
}
}
}
}
我认为这是 implementation
和 api
在 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
因此,如果存在包名相同的模块,就会发生冲突。