LiveData和Fragment重复触发数据回调BUG

当使用LiveData和Fragment结合时,发现切换Fragment后再次回到原Fragment,LiveData会重复触发数据回调。原因是Fragment生命周期与LiveData的活跃状态不匹配。解决办法是限制ViewModel的作用范围,确保每个Fragment有自己的ViewModel,或者使用SingleLiveEvent防止重复发送数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Bug还原

在Activity中保存一个ViewModel,使用Navigation组件和Fragment实现页面的切换,AFragment获取Activity的ViewModel并注册LiveData数据为观察者,此时使用setValue让AFragment收到一次LiveData数据,然后切换到BFragment(AFragment销毁),之后切回AFragment,会发现重新注册LiveData数据,AFragment再次收到LiveData数据。

图示

原因分析

LiveData 官网介绍

官方介绍LiveData会一直向活跃的应用组件观察者发送数据,而使用Naviagtion组件时,博主实现的方案导致了每次切换页面都会重走一次Fragment的生命周期,也就是处于“STARTED 或 RESUMED 状态”,导致了从其他页面切换回来之后,会触发LiveData的数据回调。
这里其实是博主对于ViewModel的生命周期理解不够透彻,在AFragment中调用Activity中的ViewModel,导致ViewModel中的LiveData会一直给Fragment发送数据。

解决方案

  1. 合理管理ViewModel的范围,虽然ViewModel
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CheatGZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值