2

EpoxyModel 在使用 Android App 的内部功能模块时不编译。

@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 尚未初始化

4

1 回答 1

10

如中所述:

https://github.com/airbnb/epoxy/issues/819#issuecomment-576728923

在库项目上使用该注释存在问题。

目前您可以使用:

@EpoxyModelClass
abstract class MyModel : EpoxyModelWithHolder<MyHolder>() {

    override fun getDefaultLayout(): Int {
        return R.layout.my_layout
    }
}
于 2020-01-21T22:16:48.627 回答