Потоковое ожидание и блокирование других событий с помощью Bloc in Flutter при загрузке снимков Firebase - PullRequest
1 голос
/ 20 марта 2019

Я пишу приложение, используя Flutter, Firebase Firestore и шаблон блока.

Когда приложение открывается, я хочу загрузить несколько книг из базы данных firestore, для этой цели я определил следующий код блока:

class EditorBloc extends Bloc<BookEvent, BooksState> {

  @override
  BooksState get initialState => BooksLoading();

  EditorBloc();

  Stream<BooksState> _loadBooks() async* {
    final CollectionReference bookPostRef = Firestore.instance.collection('books');
    try {
      Stream<QuerySnapshot> stream = bookPostRef.snapshots();
      await for (QuerySnapshot querySnapshot in stream) {
        List<Book> remoteBooks = List();
        for (var documentSnapshot in querySnapshot.documents) {
          remoteBooks.add(Book.fromDocumentSnapshot(documentSnapshot));
        }
        yield BooksLoaded(remoteBooks);
        // If I return here I can dispatch more events but not all the snapshots will be processed
      }
    } catch (_) {
      yield BooksNotLoaded();
    }
  }

  Stream<BooksState> _saveBooks(Gym gym, Sector sector, BookHistory booksHistory) async* {
    // Some code
  }

  Stream<BooksState> _addBooks(Gym gym, Sector sector, BookHistory booksHistory) async* {
    // Some code
  }

  @override
  Stream<BooksState> mapEventToState(BooksState currentState, BookEvent event) async* {

    if (event is LoadBooks) {
      yield* _loadBooks(event.gym, event.sector);
    } else if(event is SaveBooks) {
      yield BooksLoading();
      yield* _saveBooks(event.gym, event.sector, event.booksHistory);
    } else if (event is AddBook) {
      yield* _addBooks(gym, sector, booksHistory)
    }
  }
}

При запуске приложения я использую следующий код для загрузки коллекции книг:

myBloc.dispatch(LoadBooks());

И я получаю уведомление, когда книги загружаются, но если я отправляю другуюсобытие, подобное этому:

myBloc.dispatch(AddBook(newBook));

Событие никогда не обрабатывается, потому что EditorBloc все еще ожидает другие снимки в методе _loadBooks.

Что я должен сделать, чтобы иметь возможностьотправлять другие события?

Спасибо!

...