【问题标题】:Android DataBinding custom adapter in multiple modules多个模块中的Android DataBinding自定义适配器
【发布时间】:2020-02-19 17:48:48
【问题描述】:

上下文

我有 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"
            }
        }
    }
}

【问题讨论】:

  • @JeelVankhede 我试过了。它没有帮助。

标签: android android-databinding


【解决方案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中指定的包中

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的回答,但我已经尝试过了,但没有帮助。我设法解决了这个问题,并在下面发布了解决方案。 ?
    猜你喜欢
    • 2018-01-15
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2011-02-05
    • 2021-03-15
    • 1970-01-01
    相关资源
    最近更新 更多