Android, 关于ViewModel的一些使用小技巧。

情景

app使用了navigation组件,用一个Activity装载了多个Fragment,通过Fragment间的跳转来实现页面间的切换。

当 界面有A fragment 跳转到 B fragment时, 会将部分参数字段传递给Fragment, 同时Fragment会将拿到的字段告知 viewModel, 让viewmodel 拿着参数字段去请求调用下一层…等等,用于获取到界面所需要的数据,比如是服务器remote数据,或者是本地Local数据。

当数据获取成功后,会回调通知viewmodel, viewmodel再对 livedata或者 stateflow等可监听状态进行修改。

当状态一旦修改, view层就能够对状态进行监听并收集到最新的状态数据, 然后再进行UI的控件的刷新。

这样一整个流程就结束了。

但是你肯定也发现了一个问题,一个较为严重的问题。

就是Fragment是可以重建销毁的,比如横屏转竖屏等,这就导致了 Fragment生命周期会重新走一遍, 比如onCreate等方法。 而这些方法如果持有viewmodel的引用, 意味着就会触发viewmodel相应的方法,导致已有的UI状态被再次初始化,从而发生UI状态丢失的问题。

解决方法

  1. 重写ViewModelProvider.Factory, 在viewmodel的构造函数中传入 View层 (A fragment跳转到B fragment时携带的参数)初始化参数,并在初始化块中拿着参数去获取数据。

  1. 或者在Viewmodel初始化块init{}中,发送事件,通知view层, view层对事件监听, 收集到事件后,将A fragment 跳转到 Bfragment 携带的参数 告诉viewmodel, viewmodel拿到参数后。。。。之后步骤就和上面的流一样了。

这样写的好处时, viewmodel 生命周期要长于fragment, 所以无论fragment重建销毁多少次,viewmodel始终保存着 fragment的状态数据, 同时fragment的数据初始化操作也只会在viewModel初始化时执行一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值