gpt4 book ai didi

android - 如何编写扩展函数来在 Kotlin 中实例化 AndroidViewModel?

转载 作者:行者123 更新时间:2023-12-02 12:01:26 26 4
gpt4 key购买 nike

有人为 Fragment 编写了两个扩展函数(代码 A2)和 FragmentActivity实例化一个 ViewModel ,效果很好,可以看到 Code A1 和 Code A3。
我希望为 Fragment 写两个扩展函数(代码 B2)和 FragmentActivity实例化一个 AndroidViewModel ,你可以看到代码B1和代码B3,我该怎么办?谢谢!
代码 A1

class HomeViewModel_A(private val mDBVoiceRepository: DBVoiceRepository) :  ViewModel() {

}
代码 A2
inline fun <reified T : ViewModel> Fragment.getViewModel(noinline creator: (() -> T)? = null): T {
return if (creator == null)
ViewModelProvider(this).get(T::class.java)
else
ViewModelProvider(this, BaseViewModelFactory(creator)).get(T::class.java)
}

inline fun <reified T : ViewModel> FragmentActivity.getViewModel(noinline creator: (() -> T)? = null): T {
return if (creator == null)
ViewModelProvider(this).get(T::class.java)
else
ViewModelProvider(this, BaseViewModelFactory(creator)).get(T::class.java)
}
代码 A3
class FragmentHome : Fragment() {
private val mHomeViewModel_A by lazy {
getViewModel {
HomeViewModel_A(provideRepository(mContext))
}
}

}
代码 B1
class HomeViewModel_B(application: Application,private val mDBVoiceRepository: DBVoiceRepository) :  AndroidViewModel(application)  {

}
代码 B2
?
代码 B3
class FragmentHome : Fragment() {
private val mHomeViewModel_B by lazy {
?
}
}

最佳答案

Ktx Fragments 库已经有一个函数可以简洁地创建一个惰性代理来检索 View 模型:Fragment.viewModels()FragmentActivity.viewModels() .
这些对 ViewModel 和 AndroidViewModel 都适用,具有默认构造函数(分别为空或 Application 参数),或者您可以使用尾随 lambda 来返回 View 模型工厂。你会像这样使用它:

class FragmentHome : Fragment() {
private val mHomeViewModel_B: MyViewModel by viewModels()
}
或者
class FragmentHome : Fragment() {
private val mHomeViewModel_B: MyViewModel by viewModels { getMyViewModelFactory() }
}
获得与 中相同的东西A2 ,你可以包装这个函数让它为你建立一个工厂:
@Suppress("UNCHECKED_CAST")
inline fun <reified VM : ViewModel> Fragment.viewModelFactory(crossinline creator: () -> VM): Lazy<VM> {
return viewModels {
object : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return creator() as T
}
}
}
}

关于android - 如何编写扩展函数来在 Kotlin 中实例化 AndroidViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64103427/

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