了解“ by”作为代表的工作方式

时间:2019-09-10 05:12:51

标签: kotlin

以下代码显示了一个委托:

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?

1 个答案:

答案 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上对此主题进行过详细介绍。