我正在使用 Flutter、Firebase Firestore 和 bloc 模式编写应用程序。
当应用程序打开时,我想从 firestore 数据库中加载一些书籍,为此我定义了以下 bloc 代码:
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
。
我应该怎么做才能调度其他事件?
谢谢!