Как использовать Viewmodel Singleton для деятельности?
MyApp нужно хранить объект User во всем контексте ,A,B,C activity'xml используют этот объект User, когда A редактируют пользователя, я хочу B и C notifyChange, как решить эту проблему с привязкой данных, liveata и viewModel?
Раньше я заставлял User.class расширять BaseObservable, но POJO будет очень хлопотным и не должен быть нулевым, иногда User может быть нулевым, например не входить в систему. Теперь я изменяю, чтобы использовать LiveData, сделать Pojo простым и не расширять BaseObservable, но когда редактирование A, B и C не работают, я думаю, что мне нужно, чтобы ABC использовал один и тот же экземпляр viewModel в памяти, но это вызовет триггер onClear() viewModel.
2 ответа
Другой способ - создать один одноэлементный репозиторий для хранения пользовательских данных, и каждая модель представления может иметь этот репозиторий и совместно использовать одни и те же данные между действиями.
На основе этой части документации:https://developer.android.com/topic/libraries/architecture/livedata
Тот факт, что объекты LiveData учитывают жизненный цикл, означает, что вы можете совместно использовать их между несколькими действиями, фрагментами и службами. Чтобы не усложнять пример, вы можете реализовать класс LiveData как синглтон следующим образом:
Вы можете создать синглтон для своей модели представления, как я сделал здесь:
companion object{
private lateinit var instance: ViewModelProfile
fun getInstance(userId: String): ViewModelProfile{
instance = if(::instance.isInitialized) instance else ViewModelProfile(userId)
return instance
}
}
Затем я вызываю его и получаю экземпляр примерно так:
val profileVModel = ViewModelProfile.getInstance(user.uid)
Если вы хотите разделить общую ViewModel между действиями ABC, то предлагается сохранить их как 3 фрагмента в одном действии, создать ViewModel этого действия, которое можно разделить между всеми тремя фрагментами A, B и C.
То, что вы пытаетесь достичь с помощью действий, выглядит следующим образом: предположим, что вы выполнили какую-то операцию в действии A, если вы хотите, чтобы действия B и C получали уведомления о них, тогда они должны быть запущены для получения уведомлений, что не будет происходит, поэтому вместо этого вы должны использовать Intent
или же Bundle
передавать необходимую информацию, когда деятельность начинается.
обновленный
Есть и другие способы достижения подобного рода функциональности, такие как,
Это позволит вам иметь доступ к состоянию приложения на уровне приложения, к которому может обратиться любая активность или фрагмент