Я не использую флаттер, но думаю, что он не должен сильно отличаться.
Вот пример того, как я слушаю изменения профиля пользователя в моем приложении.
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). Вы должны справиться с этим самостоятельно.