- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
是否可以为 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/
是否可以为 ViewModelProviders 提供一次自己的 ViewModelStore 实现来代替默认实现? 更准确地说,我有兴趣向 ViewModelStore 添加 fun clear(v
由于这个新的 ViewModelProvider api(ViewModelProviders 已弃用),我感到非常困惑 与新的更改一样,也有新的构造函数(源代码)。 #1 public ViewMo
在 google 示例中指出,要在 fragment 之间进行通信,您可以使用作用域为 Activity 的 ViewModel。这种方法的问题在于,ViewModel 将持续到 Activity 被
我正在尝试创建一个叠加层并将 View 附加到 WindowManager,我已经通过创建一个实现 Lifecycle/ViewModelStore/SavedStateRegistry Owner
我是一名优秀的程序员,十分优秀!