android - Android Kotlin - 从另一个 ViewModel 继承一个 VIewModel
问题描述
我用 BaseActivity 和 BaseViewModel 在应用程序中创建了一个结构。所有其他活动/视图模型必须使用此基类进行扩展。我这样做是因为我需要在任何活动中调用一些方法(如 showInfo() 方法)。
当我在 BaseViewModel 中更新 LiveData 并在 BaseActivity 中观察它时一切正常。但是,当我仅在 BaseActivity 观察的情况下更新子 ViewModel(例如 UsersViewModel)中的 LiveData 时,它将不起作用。
当我想通过 ViewModel 在任何活动中调用一些基本方法时,我应该怎么做?
open class BaseActivity : AppCompatActivity() {
//inject viewModel with Koin
private val baseViewModel: BaseViewModel by viewModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
baseViewModel.actionShowInfo.observe(this, Observer {
showInfo(it)
}
}
protected fun showInfo(message: String) {
AlertDialog.Builder(this)
.setMessage(message)
.setPositiveButton(R.string.ok, null)
.show()
}
}
open class BaseViewModel : ViewModel() {
private val actionShowInfo = MutableLiveData<String>()
init {
actionShowInfo.postValue("some base info") //showInfo() in BaseActivity will be called
}
}
class UsersActivity : BaseActivity() {
private val usersViewModel: UsersViewModel by viewModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(
}
}
class UsersViewModel: BaseViewModel {
init {
//showInfo() in BaseActivity will not be called
actionShowInfo.postValue("some info")
}
}
解决方案
仅仅通过扩展 UserViewModel 你的 BaseViewModel,并不意味着它共享同一个实例。根据您的要求,我认为您需要一个可以将其实例共享给多个 Activity 的 ViewModel,这样当您在 Activity A 上更新 ViewModel 时,您可以观察到 Activiy B 上的变化,依此类推。
这就是 SharedViewModel 来拯救的地方。您需要为所有活动实现 sharedViewModel。
private val baseViewModel: BaseViewModel by sharedViewModel()
参考:https ://doc.insert-koin.io/#/koin-android/viewmodel?id=shared-viewmodel
推荐阅读
- c# - 无法访问已释放的对象。\r\n对象名称: 'ApplicationUserManager'
- javascript - Laravel 循环遍历模型孩子而不重复
- php - Yii2 使用 yii2-formwizard 保存表格数据
- java - 为什么 Collections::addAll 比 ArrayList::addAll 慢但比 LinkedList::addAll 快?
- sql-server - 如何将聚集索引扫描转换为聚集索引搜索
- informatica-powercenter - 如何将值从一张表传递到映射变量或映射表达式?
- django - 多对多字段更改过多的 api 调用
- python - '_' 在这里做什么?
- regex - 无法使用日志轮换从选定的日志文件中搜索字符串
- c# - Unity 变换点返回错误值