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)
    }
}
相关推荐
37手游移动客户端团队7 分钟前
招聘-高级安卓开发工程师
android·客户端
用户41659673693551 小时前
WebView 请求异常排查操作手册
android·前端
Kapaseker2 小时前
学不动了,入门 Compose Styles API
android·kotlin
墨狂之逸才19 小时前
Android TV WebView 遥控器按键处理:从全透传到白名单
android
plainGeekDev1 天前
MVC 写法 → MVVM
android·java·kotlin
恋猫de小郭1 天前
Flutter Patchwork,不用 Fork 改依赖包源码的第三方工具
android·前端·flutter
三少爷的鞋1 天前
“结构化”这个词,本质上就是——把混乱的东西变成有组织、有规则、有边界的东西
android
方白羽2 天前
Android Gradle 缓存与文件目录深度解析
android·gradle·android studio
曲幽2 天前
Termux里的二进制和脚本,到底怎么运行才不踩坑?Termux-service 保活妙招!
android·termux·nohup·services·wake-lock
plainGeekDev2 天前
单例模式 → object 声明
android·java·kotlin