单activity设计模式下,在一小部分fragment中实现共享viewmodel的一种思路

最近试单列activity设计模式,有一个需求就是要求fragment a跳到fragment b,然后在b处理完数据后,吧数据拿回afragment显示
在这里插入图片描述
大体是这样,正常人肯定会想,直接fragment间传递参数,不就完事了,多简单?但我是啥?我不是正常人,我要霍霍它,所以我想将fragment a的生命周期棒一个在activity中,然后在fragmentb中如果需要的话,从activity中拿就行了,因为想进入b,必须先通过a,所以理论上来讲不需要担心空指针异常问题,上代码
在baseFragment中添加

    //   保存生命周期,以便后用
    public fun setFragmentLife() {
        if (requireActivity() is BaseActivity) {
            (requireActivity() as BaseActivity).fragmentLife = this

        }
    }

    //    将上次保存的fragment生命周期拿过去
    public fun getSaveFragmentLife(): ViewModelStoreOwner? {
        if (requireActivity() is BaseActivity) {
            return if ((requireActivity() as BaseActivity).fragmentLife != null) {
                (requireActivity() as BaseActivity).fragmentLife
            } else {
                this
            }
        }
        return this
    }
    override fun onDestroy() {

        super.onDestroy()
        //把暂时保存的生命周期给清理掉
        val a = requireActivity()
        if (a != null && a is BaseActivity) {
        //直接判断是不是就行,如果a.fragmentlife为null这个判断不会报错,会返回false
            if (a.fragmentLife == this) {
                a.fragmentLife = null
            }
        }
    }

在baseactivity中添加

    public var fragmentLife: ViewModelStoreOwner? = null

当需要用到时,fragment a中添加:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setFragmentLife()
    }

然后在fragment a和b中需要用到viewmodel的地方,都使用

var viewmodel=ViewModelProvider(getSaveFragmentLife()!!, ViewModelProvider.NewInstanceFactory()).get(
                    {你的viewmodel}::class.java
                )

另外,对于activity内存被挤爆自杀时,也不保存的这个生命周期丢失,我在我的手机上试了似乎可行,如果有bug可以评论区里讨论一下

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值