Рекомендуемый способ использования Flutter, Bloc и Firestore состоит в том, чтобы слой репозитория предоставлял поток данных из Firestore, который может быть подписан с помощью Bloc in Bloc Constructor (или любой другой функции; см. Это пример ).
Затем, основываясь на изменениях в потоке, отправляет события, когда вы получаете новые данные из Firestore в потоке. Блок может обрабатывать инициируемое событие отправки, чтобы аналогичным образом изменять состояние приложения, когда изменения в пользовательском интерфейсе вызывают изменение состояния.
class SampleBloc extends Bloc<SampleEvent, SampleState> {
final FirestoreRepo _firestoreRepo;
StreamSubscription<?> _firestoreStreamSubscription;
SampleBloc({@required FirestoreData firestoreData})
: assert(firestoreRepo != null),
_firestoreRepo = firestoreRepo;
// instead of '_mapXEventToState', the subscription can also be wired in 'SampleBloc' constructor function.
Stream<TimerState> _mapXEventToState(XEvent xEvent) async* {
// Runs a dispatch event on every data change in Firestore
_firestoreStreamSubscription = _firestoreRepo.getDataStream().listen(
(data) {
dispatch(YEvent(data: data));
},
);
}
Ссылка:
Комментарий 1 и Комментарий 2 от Феликса Ангелова ( felangel ), создателя библиотеки flutter_bloc в Bloc Gitter Chat