在我的里面Fragment
我初始化一个ViewModel
using ViewModelProviders
。
我想让它采取它的Activity
if not null
,否则本身(Fragment
).
private val viewModel: MainViewModel by lazy {
ViewModelProviders.of(activity ?: this).get(MainViewModel::class.java)
}
无法使用提供的参数调用以下函数。
- of(Fragment) 在 androidx.lifecycle.ViewModelProviders 中定义
- of(FragmentActivity) 在 androidx.lifecycle.ViewModelPro 中定义
看来该语言不允许我调用冲突的方法签名(之间of(Activity)
and of(Fragment)
。 (这可能是可以理解的,也许编译器必须仅引用一种方法,而不能在同一行上链接到这两种方法。)是这样吗?
我现在必须使用
activity?.let {
ViewModelProviders.of(it).get(MainViewModel::class.java)
} ?: run {
ViewModelProviders.of(this).get(MainViewModel::class.java)
}
有更好的方法吗?
是的,它就是编译器歧义,因为你正在通过activity
& this (fragment instance)
同时有不同的实现ViewModelProviders
.
另一种方法要做到这一点是通过使用when
条件如下,(虽然你的做法也不错):
private val viewModel: MainViewModel by lazy {
return@lazy when {
activity != null -> {
ViewModelProviders.of(activity as FragmentActivity).get(MainViewModel::class.java) // you can either pass activity object
}
else -> {
ViewModelProviders.of(this).get(MainViewModel::class.java) // or pass fragment object, both are not possible at same time.
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)