在加载Firebase快照时使用Flutter中的Bloc流式等待并阻止其他事件

时间:2019-03-20 18:07:05

标签: firebase dart flutter bloc

我正在使用Flutter,Firebase Firestore和bloc模式编写应用程序。

打开应用程序后,我想从firestore数据库中加载一些书籍,为此,我定义了以下块代码:

@Consumes(MediaType.JSON_APPLICATION)
@DeleteMapping(value = "/delete")

在应用程序启动时,我使用以下代码加载书籍集:

@DeleteMapping(value = "/delete", consumes = MediaType.JSON_APPLICATION)

当书籍加载完毕后,我会收到通知,但是如果我调度了另一个这样的事件:

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)); 方法中的其他快照,因此事件从未得到处理。

我该怎么做才能调度其他事件?

谢谢!

0 个答案:

没有答案