以下代码显示了一个委托:
override val vm: MyViewModel by viewModel()
inline fun <reified T : ViewModel> LifecycleOwner.viewModel(
key: String? = null,
name: String? = null,
noinline parameters: ParameterDefinition = emptyParameterDefinition()
) = viewModelByClass(T::class, key, name, null, parameters)
当您拥有by viewModel
viewModel()是否会导致调用内联函数并将其返回值分配给变量vm?
答案 0 :(得分:1)
inline
函数仅创建MyViewModel
的新实例,然后将getter / setter委托给它。在您的代码中,inline
函数是必需的,因为它使用了您在其中使用的reified
类型的参数
viewModelByClass(T::class, key, name, null, parameters) // note the T::class
此行会发生什么:
override val vm: MyViewModel by viewModel()
是通过调用MyViewModel
创建viewModel()
并将其Property
分配给vm
字段。 by
关键字通过Operator Overloading起作用。在这种情况下,有问题的运营商为:
operator fun getValue(thisRef: R, property: KProperty<*>): T
和
public operator fun setValue(thisRef: R, property: KProperty<*>, value:
如果您在任何类中实现这些功能,您都可以将其用作属性委托。
如果您想进一步澄清,我已经在here上对此主题进行过详细介绍。