Android 跨Activity(Fragment)共享ViewModel无反射实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 跨Activity(Fragment)共享ViewModel无反射实现相关的知识,希望对你有一定的参考价值。

参考技术A 在 第一版 实现中使用到了基于注解的方式去标记作用域,再通过反射注入对象的方式实现,这种方式不仅效率低使用也不太灵活,有个很大的弊端无法使用自定义ViewModelFactory。

所以在第二版优化中将抛弃注解反射的方式,实现灵感来源于fragment-ktx中的viewModles()扩展方法。由第一版中所讲到的共享原理可知我们只需要保证从同一个Stroe中去获取ViewModel,那么同类型的ViewModel被获取到时始终都会时同一个。

首先我们需要引入扩展包:

并且在App模块中的Gradle配置虚拟机版本,否则无法使用内连函数

使用扩展方法配合Lazy实现viewModel注入,此种实现方式特点可感知生命周期,如果同一个key标记的viewModel界面都被销毁了则会自动清除ViewModelStore不会导致内存泄漏问题。

复制ShareViewModel.kt文件到项目中

使用方式,使用懒加载的方式并传入分组key即可,相同的key会共享同一个ViewModelStore对象。

运行查看多个界面间对象地址是否相同

当然我们可以自己通过定义ViewModelProvider.Fractory的方式来决定创建那些VIewModel以及对ViewModel进行构造穿参。
如果没有传入ViewModelProvider.Fractory内部会使用默认的工厂进行创建ViewModel.

项目地址: https://github.com/LucasDevelop/CustomView . 中的View model 案例

以上是关于Android 跨Activity(Fragment)共享ViewModel无反射实现的主要内容,如果未能解决你的问题,请参考以下文章

android Fragment

Fragment 使用详解

Fragmen直接来回切换deno

Android实现Fragment跨Activity回调通信

Android实现Fragment跨Activity回调通信

Android jetpack架构组件Lifecycle实战与源码解析