SharedViewmodel的实例永远不会死吗?

问题描述 投票:1回答:1

我有一个应用程序,它有一个主活动和碎片依赖于它,所以这是正常的。

现在,我的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中保留下来。

这不是我想要的片段之间的通信,因为现在该视图模型的新实例将与我过去创建的相同,我的意思是,它将重复使用我与已经弹出的片段一起使用的实例,其中我将需要额外处理删除或重置该视图模型内的所有数据,而不是获得一个新的视图模型。

当堆栈中不再有依赖于它的碎片时,它是否以这种方式工作或该实例自动死亡?

android android-fragments kotlin android-architecture-components android-viewmodel
1个回答
1
投票

现在,如果MasterFragment和DetailFragment死了(两个都做了一个popBackStack()),这个Viewmodel的实例是否会保持活跃,直到我完成包含这个Fragments的MainActivity为止?

正确。当你的碎片中只有两个使用它时,那 ViewModel 的范围是活动。

我的意思是,它会重用我使用的已经弹出的片段的实例,在这个实例中,我需要额外处理删除或重置这个viewmodel里面的所有数据,而不是得到一个新的viewmodel。

那么也许你不应该使用 activityViewModels(). 例如,你可以将这两个片段隔离到一个嵌套的导航图中,并设置一个viewmodel范围到该图中。

当堆栈中不再有依赖它的片段时,它是以这种方式工作还是该实例自动死亡?

这个 ViewModel 系统不知道什么是 "依赖",什么是 "不依赖"。这一切都基于 ViewModelStoreViewModelStoreOwner 以此来供应它。activityViewModels() 将该活动作为 ViewModelStoreOwner因此,视图模型在该 ViewModelStore 是与活动挂钩的。

© www.soinside.com 2019 - 2024. All rights reserved.