【发布时间】:2021-06-03 15:25:32
【问题描述】:
我遵循 Google 建议的 one-single-activity 应用模式,所以如果我想在 Fragments 之间共享数据,我必须共享一个 ViewModel,其所有者必须是父级Activity。 所以,问题就变成了,因为我只想在两个 Fragment 之间共享数据,独立于其他 Fragment。
假设我有MainFragment、CreateItemFragment 和ScanDetailFragment。因此,从第一个导航到 CreateItemFragment,每当我按下按钮时,我导航到 ScanDetailFragment 以扫描条形码,因此,通过 ViewModel 内的 LiveData 对象,我可以将扫描的值返回到 CreateItemFragment一旦 ScandDetailFragment 完成。当我决定取消项目的创建时,问题就出现了:我回到“MainFragment”,因为 ViewModel 的所有者是 Activity 的生命周期,一旦我再次进入 CreateItemFragment,之前扫描的值仍然存在。
有没有办法重置 ViewModel?
【问题讨论】:
-
我建议您不要共享相同的视图模型,而是在片段之间传递数据。这直接解决了您的问题,没有复杂的逻辑,并且更符合单一责任原则(每个视图模型处理自己的视图)。作为替代覆盖 onBackPressed() 并在转换到上一个片段之前重置视图模型。
-
但是,Viewmodels 不是也旨在在不同视图之间共享数据吗?否则我不知道如何将数据从片段 C 传递回 B...以及如何重置视图模型?
-
视图模型是特定视图的模型,因此在不同视图之间共享单个视图模型会破坏视图模型的目的,并且会在视图中进行更改和逻辑 -模型比必要的复杂(您的问题是不必要的复杂性的一个例子)。您可以使用导航组件 (this is how I do it) 在片段之间传递数据。要重置视图模型,只需创建一个
reset()方法并从片段中调用它。
标签: android android-fragments android-livedata android-viewmodel android-navigation