Airbnb EpoxyModel не работает в функциональных модулях / проектах библиотеки в Android
EpoxyModels не компилируются при использовании внутренних функциональных модулей приложения Android.
@EpoxyModelClass(layout = R.layout.layout_foo) //an annotation argument must be a compile-time constant here
abstract class FooModel : EpoxyModelWithHolder<FooModel.FooHolder>()
{
...
...
class FooHolder : BaseEpoxyHolder()
{
val textViewTitle: TextView by bind((R.id.textViewTitle))
//bind is the method borrowed from [here](https://github.com/airbnb/epoxy/blob/963ef0fd850bd379da7b0be6a2ada25d01ae0ee7/kotlinsample/src/main/java/com/airbnb/epoxy/kotlinsample/helpers/KotlinEpoxyHolder.kt#L20)
}
}
Приведенный выше код жалуется на то, что "аргумент аннотации должен быть константой времени компиляции" для строки layout = R.layout.layout_foo.
Опять же, исходя из документации, похоже, что масляный нож необходимо использовать для библиотечных проектов (функциональные модули в некоторой степени являются своего рода библиотечным проектом), которые будут генерировать классы R2 на основе этого
Ниже приведен модифицированный код с Butterknife, который также я считаю излишним. Не уверен, почему я не смог просто выполнить findviewbyId.
ModelClass(layout = R2.layout.layout_foo)
abstract class FooModel : EpoxyModelWithHolder<FooModel.FooHolder>() {
@EpoxyAttribute
lateinit var fooDto: Foo
override fun bind(holder: FooHolder) {
holder.textViewTitle.text = fooDto.title
}
class FooHolder : BaseEpoxyHolder() {
@BindView(R2.id.textViewTitle) lateinit var textViewTitle: TextView
}
}
Ниже приведена ошибка, исходящая от зрителя с ножом для масла.
kotlin.UninitializedPropertyAccessException: свойство lateinit textViewTitle не было инициализировано
Оценил вашу помощь.
1 ответ
Как сказано в:
https://github.com/airbnb/epoxy/issues/819
Возникла проблема с использованием этой аннотации в библиотечном проекте.
На данный момент вы можете использовать:
@EpoxyModelClass
abstract class MyModel : EpoxyModelWithHolder<MyHolder>() {
override fun getDefaultLayout(): Int {
return R.layout.my_layout
}
}