我有一个应用程序,它有一个主活动和碎片依赖于它,所以这是正常的。
现在,我的10个片段中的两个需要进行通信,我使用了这里给出的例子。
https:/developer.android.comtopiclibrariesarchitectureviewmodel.html#分享。
class SharedViewModel : ViewModel() {
val selected = MutableLiveData<Item>()
fun select(item: Item) {
selected.value = item
}
}
class MasterFragment : Fragment() {
private lateinit var itemSelector: Selector
// Use the 'by activityViewModels()' Kotlin property delegate
// from the fragment-ktx artifact
private val model: SharedViewModel by activityViewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
itemSelector.setOnClickListener { item ->
// Update the UI
}
}
}
class DetailFragment : Fragment() {
// Use the 'by activityViewModels()' Kotlin property delegate
// from the fragment-ktx artifact
private val model: SharedViewModel by activityViewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
model.selected.observe(viewLifecycleOwner, Observer<Item> { item ->
// Update the UI
})
}
}
现在,如果MasterFragment和DetailFragment死了(都做了一个popBackStack()),这个viewmodel的实例是否会保持活动状态,直到我完成包含这些片段的MainActivity?因为现在我不需要那个viewmodel实例了,但是根据文档说,这个实例将从包含这些碎片的Activity中保留下来。
这不是我想要的片段之间的通信,因为现在该视图模型的新实例将与我过去创建的相同,我的意思是,它将重复使用我与已经弹出的片段一起使用的实例,其中我将需要额外处理删除或重置该视图模型内的所有数据,而不是获得一个新的视图模型。
当堆栈中不再有依赖于它的碎片时,它是否以这种方式工作或该实例自动死亡?
现在,如果MasterFragment和DetailFragment死了(两个都做了一个popBackStack()),这个Viewmodel的实例是否会保持活跃,直到我完成包含这个Fragments的MainActivity为止?
正确。当你的碎片中只有两个使用它时,那 ViewModel
的范围是活动。
我的意思是,它会重用我使用的已经弹出的片段的实例,在这个实例中,我需要额外处理删除或重置这个viewmodel里面的所有数据,而不是得到一个新的viewmodel。
那么也许你不应该使用 activityViewModels()
. 例如,你可以将这两个片段隔离到一个嵌套的导航图中,并设置一个viewmodel范围到该图中。
当堆栈中不再有依赖它的片段时,它是以这种方式工作还是该实例自动死亡?
这个 ViewModel
系统不知道什么是 "依赖",什么是 "不依赖"。这一切都基于 ViewModelStore
和 的 ViewModelStoreOwner
以此来供应它。activityViewModels()
将该活动作为 ViewModelStoreOwner
因此,视图模型在该 ViewModelStore
是与活动挂钩的。