gpt4 book ai didi

android - 如何手动清除特定的 View 模型?

转载 作者:行者123 更新时间:2023-12-04 07:10:17 26 4
gpt4 key购买 nike

据我了解,当我们在 fragment 中调用此代码时,我们将有一个来自 Activity ViewModelStore 的 View 模型实例:

viewModel = ViewModelProviders.of(activity!!).get(SharedViewModel::class.java)

当 fragment 结束其生命周期时,此 View 模型的实例将存在于 ViewModelStore 中,直到 Activity 被销毁。 ViewModelStore 有一个 clear() 方法,但它会清除其中的所有 View 模型。有什么方法可以清除特定的 ViewModel?

另一种解决方案是将 ViewModel 范围限定为父 fragment ,但是我们如何通过 ViewModelProviders.of() 在另一个 fragment 中初始化 ViewModel?我应该将 fragment 或 View 模型实例传递给下一个 fragment 吗?

最佳答案

有一种方法可以清除特定的 ViewModel您应该在其中创建 ViewModel 的实例具有自定义的实例 key如下所述,为了清除它,您应该创建另一个实例(具有不同的 ViewModel 类,例如 EmptyViewModel 类)但具有相同的 key .

ShopFragment 类:

class shopFragment : BaseFragment() {

fun getViewModel() : ShopViewModel {
return ViewModelProviders.of(activity!!).get(ShopViewModel.KEY, ShopViewModel::class.java)
}

fun clearViewModel() {
ViewModelProviders.of(activity!!).get(ShopViewModel.KEY, EmptyViewModel::class.java)
}

// Fragment logic ...

}

ShopViewModel 类:
class ShopViewModel(application: Application) : AndroidViewModel(application) {

companion object {
const val KEY = "ShopViewModel"
}

// view model logic ...

}

EmptyViewModel 是一个虚拟的 ViewModel 类:
class EmptyViewModel() : ViewModel() {
// A dummy view model!
}

魔法正在发生在内部 ViewModelProvider androidx.lifecycle类(class)依赖,当您查看 get() 时,就会发现这里的技巧。 ViewModelProvider 的功能检索您以前的 ViewModel 的类实例并将其与 EmptyViewModel 进行比较类,因为它们不一样,它运行 mViewModelStore.put(key, viewModel); :
public class ViewModelProvider {
//...
public <T extends ViewModel> T get(@NonNull String key, @NonNull Class<T> modelClass) {
ViewModel viewModel = mViewModelStore.get(key);

if (modelClass.isInstance(viewModel)) {
//noinspection unchecked
return (T) viewModel;
} else {
//noinspection StatementWithEmptyBody
if (viewModel != null) {
// TODO: log a warning.
}
}

viewModel = mFactory.create(modelClass);
mViewModelStore.put(key, viewModel);
//noinspection unchecked
return (T) viewModel;
}
// ...
}

如下文 ViewModelStore androidx.lifecycle 类依赖性, put()方法将检索 ShopViewModel并清除它,并替换 EmptyViewModel实例。
public class ViewModelStore {
//...
final void put(String key, ViewModel viewModel) {
ViewModel oldViewModel = mMap.put(key, viewModel);
if (oldViewModel != null) {
oldViewModel.onCleared();
}
}
//...
}

关于android - 如何手动清除特定的 View 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55092532/

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