Android Пользовательский адаптер DataBinding в нескольких модулях - PullRequest
1 голос
/ 18 февраля 2020

Контекст

У меня есть 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"
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Проблема в том, что я использовал одинаковое имя пакета в 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

Package structure for reference

Следовательно, если существуют модули с одинаковым именем пакета, возникает конфликт.

0 голосов
/ 19 февраля 2020

Я думаю, что это будет разница implementation и api в Gradle. Когда вы используете implementation для A и вы можете использовать эти модули, а когда используете api, ваше приложение зависит от A и всех его зависимостей, таких как B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...