0

我正在使用Epoxy libraryon Android

我很好奇的是为什么当类型不匹配时parameteroflambda expression不会出错。

listener是以 alambda expression作为参数的Int typea。

listener(addDetailClicked)工作正常。

不应该listener(Int)吗?或listener({ i -> addDetailClicked(i) })

实际上,即使我编写了代码,我也不知道它为什么会起作用。

这怎么可能?

模型

@EpoxyModelClass(layout = R.layout.item_routine)
abstract class EpoxyRoutineModel() : EpoxyModelWithHolder<EpoxyRoutineModel.Holder>() {
    @EpoxyAttribute
    var workout: String = "see"

    @EpoxyAttribute
    var curPos: Int = 0

    @EpoxyAttribute
    lateinit var listener: (Int) -> Unit // this

    override fun bind(holder: Holder) {
        holder.workout.text = workout
        holder.add_btn.setOnClickListener {
            listener(curPos)
        }
    }
}

控制器

class RoutineItemController(
    private val addDetailClicked: (Int) -> Unit)
    : EpoxyController() {
    private var routineItem : List<RoutineItem>? = emptyList()

    override fun buildModels() {
        var i:Int =0
        routineItem?.forEach {
            when(it) {
               is RoutineItem.RoutineModel ->
                   EpoxyRoutineModel_()
                       .id(i++)
                       .curPos(i++)
                       .workout("d")
                       .listener(addDetailClicked) // why? listener(Int) or listener({ i -> addDetailClicked(i) })
                       .addTo(this)
           }

        }
    }
}

分段

class WriteRoutineFragment : Fragment() {
    private var _binding : FragmentWriteRoutineBinding? = null
    private val binding get() = _binding!!
    private lateinit var epoxyController : RoutineItemController
    private val vm : WriteRoutineViewModel by viewModels { WriteRoutineViewModelFactory() }

    override fun onCreateView(inflater: LayoutInflater,
                              container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        _binding = FragmentWriteRoutineBinding.inflate(inflater, container, false)

        epoxyController = RoutineItemController(::addDetail)
        binding.rv.adapter = epoxyController.adapter
        binding.rv.itemAnimator = null

        return binding.root

    }
    private fun addDetail(pos: Int) {
        vm.addDetail2(pos)
    }
}
4

1 回答 1

1

我相信您错过了EpoxyRoutineModel_包含在EpoxyRoutineModel. 例如,EpoxyRoutineModel.curPosis 类型Int,因此EpoxyRoutineModel_.curPos()声明为:

fun curPos(Int): EpoxyRoutineModel_

(或类似的)

同样,EpoxyRoutineModel.listeneris 类型为(Int) -> Unit,因此EpoxyRoutineModel_.listener()声明为:

fun listener((Int) -> Unit): EpoxyRoutineModel_

listener()接收另一个函数(它本身接收 )的函数也是如此Int。所以我们可以addDetailClicked在那里提供。

于 2021-10-18T20:36:12.283 回答