Android Kotlin - наследовать VIewModel от другой ViewModel - PullRequest
0 голосов
/ 05 февраля 2020

Я создал структуру в приложении с BaseActivity и BaseViewModel. Все остальные виды деятельности / viewModels должны быть расширены этими базовыми классами. Я сделал это, потому что мне нужно вызывать некоторые методы в любой деятельности (например, метод showInfo ()).

Когда я обновляю LiveData в BaseViewModel и наблюдаю его в BaseActivity, все работает хорошо. Но когда я обновляю эти LiveData в дочернем ViewModel (например, UsersViewModel) только с 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 голосов
/ 05 февраля 2020

Простое расширение UserViewModel вашей BaseViewModel не означает, что он использует один и тот же экземпляр. Исходя из ваших требований, я думаю, что вам нужен ViewModel, который может поделиться своим экземпляром с несколькими действиями, чтобы при обновлении ViewModel в действии A вы могли наблюдать изменения в Activiy B и т. Д.

Это где SharedViewModel прийти на помощь. Вам необходимо реализовать sharedViewModel для всей вашей деятельности.

private val baseViewModel: BaseViewModel by sharedViewModel()

Ссылка: https://doc.insert-koin.io/# / koin-android / viewmodel? Id = shared-viewmodel

...