Создание слушателей Firestore в магазине mobx (трепетание) - PullRequest
0 голосов
/ 27 января 2020

В настоящее время я работаю над приложением флаттера, используя firestore и mobx. Я использую mobx для поддержания пользовательского интерфейса в актуальном состоянии и выполняю вызовы API для firestore (поэтому поток данных - firestore -> mobx store -> UI). Я хочу настроить слушателей на прослушивание изменений в реальном времени в коллекции пожарных. В идеале, я хотел бы настроить этот слушатель в mobx, но я не уверен, как это будет работать - является ли магазин mobx подходящим местом для прослушивания изменений в firestore? Меня беспокоит то, что в хранилище mobx нет метода dispose, в котором я мог бы отсоединить слушателей. Мне интересно, является ли это приемлемым способом обновления переменных в моем хранилище (и, следовательно, косвенно) пользовательского интерфейса, или мне нужно переключиться на модель BLoC / stream. Будем весьма благодарны за любые общие советы по этой проблеме (т. Е. Лучший способ прослушивать обновления пожарных хранилищ в реальном времени и распространять изменения в пользовательском интерфейсе)!

1 Ответ

1 голос
/ 28 января 2020

Я не использую флаттер, но думаю, что он не должен сильно отличаться.

Вот пример того, как я слушаю изменения профиля пользователя в моем приложении.

class UserModel {
  @observable id = ''

  updateDetails (userUpdate) {
    // update observable properties
  }

  destroy () {
    // Call destroy to remove listener
    if (this.stopWatch) {
      this.stopWatch()
    }
  }

  init () {
    // firestore onSnapshot returns a disposer, keep it on the instance
    this.stopWatch = fdb.collection('users').doc(this.id).onSnapshot((doc) => {
      if (doc.exists) {
        this.updateMyDetails(doc.data())
      }
    })
  }

  constructor ({id}) {
    // ...
    this.id = id
  }
}

const user = new UserModel({id: 'firestoreId')})
user.init()

// then any observer, like your UI, is listening to changes of the userModel data

//...

user.destroy() // for example when the user signs out.

Обратите внимание, что вы можете прослушивать изменения вне модели, если хотите разделить эти проблемы, вместо использования этой функции инициализации.

Если вам интересно, почему я проверяю if (doc.exists), это потому, что Firestore не будет отправить вам любую ошибку, если документ не существует. (как http 404). Вы должны справиться с этим самостоятельно.

...