众所周知,ViewModel有个LiveData可以为Activity提供数据持久化,所以我们可以在多个Fragment中绑定同一个ViewModel来实现对有同一个数据的反复操作。道理很简单,但是我遇到了一个坑,就是当我在一个Fragment对ViewModel的数据进行修改,然后跳到另一个Fragment,结果发现另一个Fragment并没有保存我对ViewModel的数据修改,他显示的还行初始化的数据,但是他们确实绑定的是同一个ViewModel,代码如下:
var myViewModel:MyViewModel = ViewModelProvider(this).get(MyViewModel::class.java)
·在我的努力百度和AI帮助下,我最终发现了问题所在:
使用 this
获取 ViewModel 实例会使得每个 Fragment 都有自己的 ViewModel 实例,这种方式是在 Fragment 内部获取 ViewModel 实例,使用的是 Fragment 自身的生命周期来管理 ViewModel。这意味着,只要 Fragment 处于活动状态(即未被销毁),ViewModel 就会保持存在。当 Fragment 被销毁和重新创建时,ViewModel 实例也会被销毁和重新创建。因此,不同 Fragment 中使用 this
获取的 ViewModel 实例是独立的,它们不会共享数据。
使用我们应该使用另一个 requireActivity()
这种方式在 Fragment 中获取 ViewModel 实例时,使用的是宿主 Activity 的生命周期来管理 ViewModel 的生命周期。这意味着,当宿主 Activity 被销毁时(例如设备旋转导致的配置变化),ViewModel 会随之销毁并重新创建,但在同一个 Activity 生命周期内的不同 Fragment 将会共享同一个 ViewModel 实例。这种方式适用于需要在多个 Fragment 之间共享数据的场景。
所以最后的代码应该是
var myViewModel:MyViewModel = ViewModelProvider(requireActivity()).get(MyViewModel::class.java)
这样就可以愉快地在不同的Fragment修改数据了!