Android Studio 不同的Fragment使用同一个ViewModel里的数据遇到的问题

        众所周知,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修改数据了!

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值