Как использовать синглтон viewmodel для действий?

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 () много раз.

Вы можете настроить ViewModelFactory для использования одноцветной модели ViewModel.

Jeel Vankhede 29.10.2018 06:40

Это не так ужасно, как предполагает это сообщение в блоге, но ViewModel содержит некоторые ловушки для неосторожных. Ваш вопрос трудно понять, но похоже, что вы попали в одну из этих ловушек.

StackOverthrow 29.10.2018 06:40

@Jeel Vankhede, я обнаружил, что решение ViewModelFactory в github.com/googlesamples/android-architecture-components/iss‌ ues /… viewModel onCleared () может срабатывать три раза или больше

candrwow 29.10.2018 07:08
5
3
5 260
3

Ответы 3

Если вы хотите использовать общую модель представления для действий ABC, рекомендуется сохранить их как 3 фрагмента в одном действии, создать модель представления этого действия, которая может использоваться всеми тремя фрагментами A, B и C.

Также то, что вы пытаетесь достичь с помощью действий, выглядит следующим образом: предположим, вы выполнили некоторую операцию в действии A, если вы хотите, чтобы действия B и C получали уведомление о них, тогда они должны быть запущены, чтобы получать уведомления, что не будет происходит, поэтому вместо этого вы должны использовать Intent или Bundle для передачи необходимой информации при запуске действия.

Обновлено

Есть и другие способы достижения аналогичной функциональности, например,

  • Автобус событий
  • Субъекты RxJava (см. это)
  • Состояние Android от Evernote (см. это)

Это позволит вам иметь доступ к состоянию на уровне приложения, доступ к которому может быть получен любым действием или фрагментом.

Android State от Evernote больше не поддерживается.

wesley franks 03.08.2020 17:36

Другой способ - иметь один одноэлементный репозиторий для хранения ваших пользовательских данных, и каждая модель представления может иметь этот репозиторий и совместно использовать одни и те же данные между действиями.

На основании этой части документации: 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)

Другие вопросы по теме