android-fragments 为两个片段创建了两次Android Viewmodel

ifsvaxew  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(118)

我有一个视图模型,它应该在两个片段之间共享。这两个片段在一个导航图中,在每个片段中,我这样做是为了引用视图模型:

private val viewModel: MyViewModel by navGraphViewModels(R.id.my_nav_graph)

据我所知,这将保持视图模型与导航图的生命周期,而且一切都很好。
但我注意到,当我从第一个片段切换到第二个片段时,视图模型中的init方法再次运行,如果我打印出视图模型的名称,则在加载第一个片段时会得到一个示例,而在加载第二个片段时会得到另一个名称(类似于MyViewModel@e7e7690的格式)。
现在,视图模型对于两个片段工作得很好,数据是共享的,但是我担心的是,可能还有另一个视图模型在后台徘徊,它不会被正确地删除。(),但在已销毁()只在片段被销毁时调用一次,这意味着其中一个订阅者仍然是注册的,因此,如果视图模型创建了两次并且没有正确处理,这将是一个问题。

7hiiyaii

7hiiyaii1#

我不熟悉您示例化视图模型的方式,但我想分享我示例化视图模型的方式,因为我通常使用导航图方法来确保我有一个绑定到导航图生命周期的单个示例。为了示例化视图模型,以下代码将出现在片段的方法中:

val myNavController: NavController = NavHostFragment.findNavController(this) // "this" is your fragment
    val myViewModelStoreOwner: ViewModelStoreOwner = myNavController.getViewModelStoreOwner(R.id.my_nav_graph)
    val myViewModelProvider = ViewModelProvider(myViewModelStoreOwner) // If you use a ViewModelFactory, you can pass it here as the second parameter.
    val myViewModel: MyViewModel = myViewModelProvider.get(MyViewModel::class.java)

如果给定的导航图上的片段不存在,这将确保示例化单个视图模型。如果存在,它将检索该片段。一旦堆栈中不再存在与导航图绑定的片段,视图模型将被销毁。

相关问题