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)
    }
}
相关推荐
折翅鵬5 小时前
Android史诗级网络优化实践总结
android·网络
赏金术士7 小时前
Android 项目模块化与 Feature 组件实践
android·kotlin·模块化
summerkissyou198711 小时前
Android-UI-获取屏幕尺寸的方法
android·ui
用户860225046747211 小时前
Kotlin 函数式编程入门与实践指南
android
最爱睡觉睡觉睡觉13 小时前
CSS → Flutter 对照手册
android·前端
xingpanvip13 小时前
星盘接口开发文档:马盘次限盘接口指南
android·开发语言·python·php·lua
用户261904985615714 小时前
JUnit4 完整配置流程
android
用户261904985615714 小时前
JaCoCo 完整配置流程
android
QING61815 小时前
Android面试 —— 八股文之app启动流程
android·面试·app
海鸥-w15 小时前
python(fastapi) 实现更新,新增,删除接口
android·python·fastapi