2

我正在使用 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

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

谢谢!

4

1 回答 1

0

解决此问题的一种方法是在 Future 中收听 Stream。一旦 Future 完成,您就可以开始其他事件。

Future<bool> whenFinishLoading(Stream<BooksState> source) async {
  await for (value in source) {
    // Define a condition expecting a value from Stream
    if (value) { 
      return value;
    }
  }
  return false;
}

然后,您可以使用 FuturewhenFinishLoading(Stream<BookState>)等待它完成以启动下一个 Stream 事件。

于 2021-12-01T15:07:59.080 回答