Kotlin 不理解 ViewModelProviders.of(activity ?:fragment)

2024-06-28

在我的里面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(使用前将#替换为@)

Kotlin 不理解 ViewModelProviders.of(activity ?:fragment) 的相关文章

随机推荐