gpt4 book ai didi

android - Kotlin 看不懂 ViewModelProviders.of(activity ? : fragment)

转载 作者:IT老高 更新时间:2023-10-28 13:47:08 26 4
gpt4 key购买 nike

在我的 Fragment 中,我使用 ViewModelProviders 初始化了一个 ViewModel。如果不是 null,我希望它采用它的 Activity,否则采用它自己(Fragment)。

private val viewModel: MainViewModel by lazy {
ViewModelProviders.of(activity ?: this).get(MainViewModel::class.java)
}

None of the following functions can be called with the arguments supplied.

  • of(Fragment) defined in androidx.lifecycle.ViewModelProviders
  • of(FragmentActivity) defined in androidx.lifecycle.ViewModelPro

似乎该语言不允许我调用冲突的方法签名(在 of(Activity)of(Fragment) 之间。(这可能是可以理解的,也许编译器只能引用一种方法,并且不能在同一行上同时链接到这两种方法。)是这样吗?

我现在必须使用

    activity?.let {
ViewModelProviders.of(it).get(MainViewModel::class.java)
} ?: run {
ViewModelProviders.of(this).get(MainViewModel::class.java)
}

有没有更好的方法?

最佳答案

是的,这是 compiler ambiguity,因为您同时传递 activitythis (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.
}
}
}

关于android - Kotlin 看不懂 ViewModelProviders.of(activity ? : fragment),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52811685/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com