【发布时间】:2019-03-19 14:00:01
【问题描述】:
在我的Fragment 中,我使用ViewModelProviders 初始化ViewModel。
如果不是null,我希望它使用它的Activity,否则它自己(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) 和of(Fragment) 之间。(这可能是可以理解的,也许编译器必须只引用一种方法并且不能在同一行链接到两者.) 是这样吗?
我现在必须使用
activity?.let {
ViewModelProviders.of(it).get(MainViewModel::class.java)
} ?: run {
ViewModelProviders.of(this).get(MainViewModel::class.java)
}
有没有更好的方法?
【问题讨论】:
-
是的,java 也不允许这样做,因为选择了方法重载at compile time,Kotlin 的字节码受到相同的限制,尽管它们可以在后台生成您的解决方法代码。只有当有一种方法可以采用
Activity和Fragment的公共超类型时,它才会起作用,例如Context。如果你经常这样做,添加一个?稍微短一点:activity.let { it?.let { ViewModelProviders.of(it) } ?: ViewModelProviders.of(this) }.get(ViewModel::class.java)
标签: android kotlin android-viewmodel viewmodelproviders