Flutter_bloc получает обновленные данные из магазина без события пользовательского интерфейса - PullRequest
3 голосов
/ 28 марта 2019

Я использую флаттер для обмена данными о пожарных хранилищах с нескольких устройств.

Если я использую StreamBuilder, все работает нормально, но мне не нравится смешивать бизнес-логику с пользовательским интерфейсом.Я бы предпочел использовать BLOC в качестве шаблона с использованием плагина flutter_bloc.

introducir la descripción de la imagen aquí

Но flutter_bloc работает следующим образом:

Шаги:

  1. Событие ------------------------> Новые данные, НО НОВОГО СОБЫТИЯ UI

  2. Асинхронный запрос

  3. Асинхронный ответ

  4. Состояние (mapEventToState) -------> ¿Как получитьновое состояние?

Поскольку у меня нет «события пользовательского интерфейса», поскольку данные хранилища обновляются с другого устройства, я не могу обновить состояние.

Я могиспользуйте что-то вроде этого в конструкторе блока:

  Stream<QuerySnapshot> query;
  QuedadaBloc(){
    query = Firestore.instance.collection('my_collection').snapshots();
    query.listen((datos){  
      dispatch(Fetch()); // send fictitious UI event
    });
  }

Но я думаю, что это неправильный путь.

¿Любое предложение?

Большое спасибо.

* 1 042 * J.Пабло.

1 Ответ

2 голосов
/ 19 июня 2019

Рекомендуемый способ использования 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

...