Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Kotlin-从另一个VIewModel继承VIewModel_Android_Kotlin_Android Livedata_Android Viewmodel - Fatal编程技术网

Android Kotlin-从另一个VIewModel继承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在任何活动中调用一些基本方

我在应用程序中创建了一个带有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()
参考: