Android Activity 之间共享的 ViewModel

Android Activity 之间共享的 ViewModel

  • 提供一个 Application 作用域的 ViewModel 去实现
  • 要尽量避免被滥用
  • 按需考虑加数据销毁、资源释放的逻辑

AppSharedViewModel

kotlin 复制代码
class AppSharedViewModel: ViewModel() {
    var testLiveData = MutableLiveData(0)
}
kotlin 复制代码
class AppApplication : Application(), ViewModelStoreOwner {
    companion object {
        private lateinit var sInstance: AppApplication
        fun getInstance() = sInstance
    }

    override fun onCreate() {
        super.onCreate()
        sInstance = this
    }

    private val appSharedViewModelStore by lazy {
        ViewModelStore()
    }

    override fun getViewModelStore(): ViewModelStore {
        return appSharedViewModelStore
    }
}
kotlin 复制代码
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //使用
        val appSharedViewModel = ViewModelProvider(AppApplication.getInstance())[AppSharedViewModel::class.java]
    }

让 AppSharedViewModel 继承自 AndroidViewModel

kotlin 复制代码
class AppSharedViewModel(application: Application) : AndroidViewModel(application) {
    var testLiveData = MutableLiveData(0)
}
  • 方案1

改写 ViewModel 创建获取的地方传入 AndroidViewModelFactory 实例

kotlin 复制代码
val appSharedViewModel = ViewModelProvider(
            AppApplication.getInstance(),
            ViewModelProvider.AndroidViewModelFactory.getInstance(AppApplication.getInstance())
        )[AppSharedViewModel::class.java]
  • 方案2

改写 Application 实现 HasDefaultViewModelProviderFactory 接口,因为 ViewModelProvider 构造方法里有调用 ViewModelProvider.AndroidViewModelFactory.defaultFactory 方法传入 ViewModelStoreOwner 去判断处理 HasDefaultViewModelProviderFactory 接口的逻辑

kotlin 复制代码
class AppApplication : Application(), ViewModelStoreOwner, HasDefaultViewModelProviderFactory {
    companion object {
        private lateinit var sInstance: AppApplication
        fun getInstance() = sInstance
    }

    override fun onCreate() {
        super.onCreate()
        sInstance = this
    }

    private val appSharedViewModelStore by lazy {
        ViewModelStore()
    }
    
    override fun getViewModelStore(): ViewModelStore {
        return appSharedViewModelStore
    }

    override fun getDefaultViewModelProviderFactory(): ViewModelProvider.Factory {
        return ViewModelProvider.AndroidViewModelFactory.getInstance(this)
    }
}
相关推荐
每次的天空1 小时前
Android第十一次面试flutter篇
android·flutter·面试
renxhui3 小时前
Android 性能优化(四):卡顿优化
android·性能优化
二流小码农3 小时前
鸿蒙开发:UI界面分析利器ArkUI Inspector
android·ios·harmonyos
CYRUS_STUDIO4 小时前
FART 精准脱壳:通过配置文件控制脱壳节奏与范围
android·安全·逆向
小疯仔4 小时前
使用el-input数字校验,输入汉字之后校验取消不掉
android·开发语言·javascript
墨狂之逸才4 小时前
Data Binding Conversion 详解
android
iceBin5 小时前
uniapp打包安卓App热更新,及提示下载安装
android·前端
杨充5 小时前
高性能图片优化方案
android
墨狂之逸才5 小时前
BindingAdapter名称的对应关系、命名规则和参数定义原理
android
hellokai5 小时前
ReactNative介绍及简化版原理实现
android·react native