Android Kotlin-从另一个VIewModel继承VIewModel
我在应用程序中创建了一个带有BaseActivity和BaseViewModel的结构。所有其他活动/视图模型必须使用此基类进行扩展。我这样做是因为我需要在任何活动中调用一些方法(比如showInfo()方法) 当我在BaseViewModel中更新LiveData并在BaseActivity中观察它时,一切都很好。但是,当我在子视图模型(例如UsersViewModel)中仅使用BaseActivity更新LiveData时,它将不起作用 当我想通过ViewModel在任何活动中调用一些基本方法时,我应该怎么做Android Kotlin-从另一个VIewModel继承VIewModel,android,kotlin,android-livedata,android-viewmodel,Android,Kotlin,Android Livedata,Android Viewmodel,我在应用程序中创建了一个带有BaseActivity和BaseViewModel的结构。所有其他活动/视图模型必须使用此基类进行扩展。我这样做是因为我需要在任何活动中调用一些方法(比如showInfo()方法) 当我在BaseViewModel中更新LiveData并在BaseActivity中观察它时,一切都很好。但是,当我在子视图模型(例如UsersViewModel)中仅使用BaseActivity更新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")
}
}
开放类BaseActivity:AppCompatActivity(){
//使用Koin注入viewModel
private val baseViewModel:baseViewModel by viewModel()
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
baseViewModel.actionShowInfo.observe(此,观察者{
showInfo(it)
}
}
受保护的娱乐节目信息(消息:字符串){
AlertDialog.Builder(此)
.setMessage(消息)
.setPositiveButton(R.string.ok,null)
.show()
}
}
打开类BaseViewModel:ViewModel(){
private val actionShowInfo=MutableLiveData()
初始化{
将调用BaseActivity中的actionShowInfo.postValue(“某些基本信息”)//showInfo()
}
}
类UsersActivity:BaseActivity(){
private val usersViewModel:usersViewModel by viewModel()
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(
}
}
类UsersViewModel:BaseViewModel{
初始化{
//将不调用BaseActivity中的showInfo()
actionShowInfo.postValue(“一些信息”)
}
}
仅通过扩展UserViewModel您的BaseViewModel,并不意味着它共享同一个实例。根据您的要求,我认为您需要一个ViewModel,它可以将其实例共享给多个活动,以便在活动a上更新ViewModel时,您可以观察到活动B上的更改,依此类推
这就是SharedViewModel的作用所在。您需要为所有活动实现SharedViewModel
private val baseViewModel: BaseViewModel by sharedViewModel()
参考: