Android Kotlin - 从另一个ViewModel继承ViewModel

3
我已经创建了一个应用程序结构,其中包含BaseActivity和BaseViewModel。所有其他活动/视图模型都必须扩展这些基类。我这样做是因为我需要在任何活动中调用一些方法(例如showInfo()方法)。
当我在BaseViewModel中更新LiveData并在BaseActivity中观察它时,一切正常。但是当我在子ViewModel(例如UsersViewModel)中更新该LiveData时,仅使用BaseActivity观察它将不起作用。
当我想要通过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")
     }
}
1个回答

0
只是通过将UserViewModel扩展为BaseViewModel,并不意味着它们共享同一个实例。根据您的需求,我认为您需要一个可以在多个活动之间共享实例的ViewModel,这样当您在Activity A上更新ViewModel时,您可以观察到Activity B上的变化,以此类推。
这就是SharedViewModel发挥作用的地方。您需要为所有活动实现一个sharedViewModel。
private val baseViewModel: BaseViewModel by sharedViewModel()

参考资料:https://doc.insert-koin.io/#/koin-android/viewmodel?id=shared-viewmodel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接