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)
    }
}
相关推荐
阿巴斯甜7 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker7 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95278 小时前
Andorid Google 登录接入文档
android
黄林晴10 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android