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 实现 Tab 点击切换(TabLayout + ViewPager2)
android·java·android studio
一条上岸小咸鱼4 小时前
Kotlin 控制流(二):返回和跳转
android·kotlin
Jasonakeke4 小时前
【重学 MySQL】九十二、 MySQL8 密码强度评估与配置指南
android·数据库·mysql
Mertrix_ITCH4 小时前
在 Android Studio 中修改 APK 启动图标(2025826)
android·ide·android studio
荏苒追寻4 小时前
Android OpenGL基础1——常用概念及方法解释
android
人生游戏牛马NPC1号5 小时前
学习 Android (十七) 学习 OpenCV (二)
android·opencv·学习
恋猫de小郭5 小时前
谷歌开启 Android 开发者身份验证,明年可能开始禁止“未经验证”应用的侧载,要求所有开发者向谷歌表明身份
android·前端·flutter
用户095 小时前
Gradle声明式构建总结
android
用户096 小时前
Gradle插件开发实践总结
android
Digitally16 小时前
如何将视频从安卓设备传输到Mac?
android·macos