【问题标题】:Observing streams using Cubit (BLoC library)?使用 Cubit(BLoC 库)观察流?
【发布时间】:2021-05-06 11:02:00
【问题描述】:

TL;DR:有没有办法使用Cubit而不是BLoC来监听流并发出状态?

我正在为 Flutter 使用 BLoC 库,我们使用 Cubits 进行状态管理。到目前为止,一切都可以正常进行交互以获取数据或保存数据,但现在我需要使用流。在我的情况下,这意味着观看来自FirebaseFirestore 的快照。

如果有办法观察Cubit 的流,我尝试搜索互联网,而不是使用BLoC,但大多数结果都指向BLoC。我在另一个项目中使用过BLoC,所以我知道如何使用它来观察流,但如果有办法,我想使用Cubit

这是我在 FireStore 中观察到的代码示例:

@override
  Stream<Either<Failure, List<MTalk>>> watchTalk() async* {
    const path ='path/to/talks';
    yield* firestore
        .collection(path)
        .snapshots()
        .map(
          (snap) => right<Failure, List<MTalk>>(
            snap.docs
                .map(
                    (documentSnapshot) => MTalk.fromFirestore(documentSnapshot))
                .toList(),
          ),
        )
        .onErrorReturnWith((e) {
      if (e is FirestoreException) {
        return left(RetrieveFailure(message: e.message));
      } else {
        return left(UnknownFailure(message: e.toString()));
      }
    });
  }
}

使用BLoC 时,只要调用watchTalk() 返回数据,就可以简单地使用async*yield 返回状态,因为mapEventToState() 也是一个产生State 的流。对于Cubit,我们使用emit(MyState) 来获取UI 中的状态,并且函数不是Stream 类型。我想知道的是我们是否可以使用Cubit 来处理流。

【问题讨论】:

标签: flutter bloc


【解决方案1】:

如果有人像我一样感到困惑,这很简单。您可以在 cubit 上调用 listen 并在每次从流中获取值时发出状态。这是我使用DataConnectionChecker 监听网络连接变化的代码示例:

///Listens to the connectivity of
Future<void> listenToConnectivity() async {
  if (_internetStream != null) {
    await _internetStream.cancel();
  }
  _internetStream = repo.isConnectedToInternet().listen((result) {
    result.fold(
      (failure) => _processFailure(failure: failure),
      (isConnected) {
        if (isConnected) {
          emit(const SessionState.connected());
        } else {
          emit(const SessionState.disconnected());
        }
      },
    );
  });
}

【讨论】:

    猜你喜欢
    • 2023-02-20
    • 2021-05-23
    • 2021-01-06
    • 2021-12-23
    • 2020-11-17
    • 1970-01-01
    • 2021-06-24
    • 2023-01-05
    • 1970-01-01
    相关资源
    最近更新 更多