gpt4 book ai didi

java - 重写 ViewModelStore

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:22 25 4
gpt4 key购买 nike

是否可以为 ViewModelProviders 提供一次自己的 ViewModelStore 实现来代替默认实现?

更准确地说,我有兴趣向 ViewModelStore 添加 fun clear(vm: ViewModel)(或使用索引或类似的东西)功能,这样我就可以清除我选择的单个 View 模型,而不仅仅是使用内置的 ViewModelStore#clear:

public final void clear() {
for (ViewModel vm : mMap.values()) {
vm.onCleared();
}
mMap.clear();
}

清除所有 View 模型。

最佳答案

首先,我认为您应该考虑这样做,因为那是架构组件库的实现细节。调整用例以匹配 ViewModel 的 API 公开的指南/契约(Contract)后,您很可能应该想出更好的解决方案。

尽管如此,让我们研究一下这样做的可能性。

下面是代码,我们应该使用它来获得 ViewModel 实现:

val viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)

这段代码的结果是,它将创建一个 HolderFragment 的实例。 ,这是一个保留的 fragment ,并将其附加到 this 的 fragment 管理器(可能是 FragmentActivity 的 fragment 管理器或 Fragment' s child fragment manager ).

HolderFragment 将添加 HolderFragment.HOLDER_TAG , 因此我们能够从 fragment 管理器中获取该 fragment 的实例。

val holderFragment = supportFragmentManager.findFragmentByTag("android.arch.lifecycle.state.StateProviderHolderFragment") as HolderFragment

它是 HolderFragment,它创建了一个 ViewModelStore 实例和 keeps that instance as a private field .该字段存在一个 getter,但不存在一个 setter,这意味着“替换”该对象的唯一方法是使用反射。

但在此之前,让我们尝试编写一个 ViewModelStore 类的自定义实现:

class MyViewModelStore : ViewModelStore() {

private val mMap = HashMap<String, ViewModel>()

internal fun put(key: String, viewModel: ViewModel) {
val oldViewModel = mMap.put(key, viewModel)
oldViewModel?.onCleared() // COMPILATION ERROR -> Cannot access 'onCleared': it is protected/*protected and package*/ in 'ViewModel'
}

internal operator fun get(key: String): ViewModel? {
return mMap[key]
}

override fun clear() {
for (vm in mMap.values) {
vm.onCleared() // COMPILATION ERROR -> Cannot access 'onCleared': it is protected/*protected and package*/ in 'ViewModel'
}
mMap.clear()
}

}

不幸的是,我们不能这样做,因为 ViewModel#onCleared() has a protected package access ,这使得我们无法在 android.arch.lifecycle 包之外调用它。同样,我们可以使用反射来做到这一点(但这有多好?)。

尽管(我)没有建议,但似乎也无法做到(不使用反射)。

关于java - 重写 ViewModelStore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49739337/

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