MyApp должен содержать объект User во всем контексте , Действия A, B, C'xml используют этот объект User, когда A редактирует пользователя, я хочу B и C notifyChange, как решить эту проблему с привязкой данных, живыми данными и viewModel?
Раньше я заставлял User.class расширять BaseObservable, но POJO будет очень проблематичным и не должен быть нулевым, иногда User может быть нулевым, например, не входить в систему. Теперь я перехожу на использование LiveData, делаю Pojo простым и не расширяю BaseObservable, но когда A edit, B и C не работают, я думаю, мне нужно, чтобы ABC использовал один и тот же экземпляр viewModel в памяти, но это вызовет триггер viewModel onClear () много раз.
Это не так ужасно, как предполагает это сообщение в блоге, но ViewModel содержит некоторые ловушки для неосторожных. Ваш вопрос трудно понять, но похоже, что вы попали в одну из этих ловушек.
@Jeel Vankhede, я обнаружил, что решение ViewModelFactory в github.com/googlesamples/android-architecture-components/iss ues /… viewModel onCleared () может срабатывать три раза или больше
Если вы хотите использовать общую модель представления для действий ABC, рекомендуется сохранить их как 3 фрагмента в одном действии, создать модель представления этого действия, которая может использоваться всеми тремя фрагментами A, B и C.
Также то, что вы пытаетесь достичь с помощью действий, выглядит следующим образом: предположим, вы выполнили некоторую операцию в действии A, если вы хотите, чтобы действия B и C получали уведомление о них, тогда они должны быть запущены, чтобы получать уведомления, что не будет происходит, поэтому вместо этого вы должны использовать Intent или Bundle для передачи необходимой информации при запуске действия.
Обновлено
Есть и другие способы достижения аналогичной функциональности, например,
Это позволит вам иметь доступ к состоянию на уровне приложения, доступ к которому может быть получен любым действием или фрагментом.
Android State от Evernote больше не поддерживается.
Другой способ - иметь один одноэлементный репозиторий для хранения ваших пользовательских данных, и каждая модель представления может иметь этот репозиторий и совместно использовать одни и те же данные между действиями.
На основании этой части документации: https://developer.android.com/topic/libraries/architecture/livedata#extend_livedata
The fact that LiveData objects are lifecycle-aware means that you can share them between multiple activities, fragments, and services. To keep the example simple, you can implement the LiveData class as a singleton as follows:
Вы можете создать синглтон для своей модели представления, как я сделал здесь:
companion object{
private lateinit var instance: ViewModelProfile
@MainThread
fun getInstance(userId: String): ViewModelProfile{
instance = if (::instance.isInitialized) instance else ViewModelProfile(userId)
return instance
}
}
Затем я вызываю его и получаю экземпляр примерно так:
val profileVModel = ViewModelProfile.getInstance(user.uid)
Вы можете настроить
ViewModelFactoryдля использования одноцветной модели ViewModel.