【问题标题】:Does an instance of a SharedViewmodel never dies?SharedViewmodel 的实例永远不会消亡吗?
【发布时间】:2020-06-11 19:02:02
【问题描述】:

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

现在,我的 10 个片段中有两个需要通信,我使用这里给出的示例

https://developer.android.com/topic/libraries/architecture/viewmodel.html#sharing

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()),视图模型的实例是否会保持活动状态,直到我完成包含此 Fragments 的 MainActivity?因为现在我不再需要那个 viewmodel 实例了,但是根据文档所说,这个实例将从包含这些片段的 Activity 中保留

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

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

【问题讨论】:

    标签: android android-fragments kotlin android-architecture-components android-viewmodel


    【解决方案1】:

    现在,如果 MasterFragment 和 DetailFragment 死掉(两者都执行 popBackStack()),视图模型的实例是否会保持活动状态,直到我完成包含此 Fragments 的 MainActivity ?

    正确。虽然碰巧只有两个片段使用它,但 ViewModel 的范围仅限于活动。

    我的意思是,它将重用我与已弹出片段一起使用的实例,在其中我需要额外处理此视图模型中所有数据的删除或重置,而不是获取新的新视图模型。

    那么也许你不应该使用activityViewModels()。例如,您可以将这两个片段隔离到一个嵌套的导航图中,并设置一个作用于该图的视图模型。

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

    ViewModel 系统不知道什么是或不是“依赖于它”。这一切都基于提供它的ViewModelStorethe ViewModelStoreOwneractivityViewModels() 将活动用作ViewModelStoreOwner,因此ViewModelStore 中的视图模型与活动相关联。

    【讨论】:

    • 非常感谢@CommonsWare,最后一个问题,我们是否初始化了视图模型的嵌套图?像 activityViewModels 但使用 nestGraphViewModel 或者我们如何连接两个这样的片段。我的意思是,我需要创建一个单独的活动来只交流两个片段,这有点过头了做一个简单的交流
    • @CoffeeBreak:“我们是否为视图模型初始化了嵌套图?” ——对不起,我不明白这个问题。 “像 activityViewModels 但使用nestGraphViewModel 或者我们如何连接两个这样的片段” - 有a navGraphViewModels() 属性委托,但假设您的片段是通过导航组件显示的。 “我需要创建一个单独的活动来交流两个片段”——AFAIK,这不是必需的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2011-10-25
    相关资源
    最近更新 更多