Bloc如何收听流并发出状态

Posted

技术标签:

【中文标题】Bloc如何收听流并发出状态【英文标题】:How can Bloc listen to stream and emit state 【发布时间】:2022-01-11 13:31:04 【问题描述】:

在我的 Flutter 应用中,我使用 flutter_bloc 进行状态管理。

有问题的bloc 使用repositoryrepository 订阅一个 websocket,新数据被添加到一个流中。

问题: 我的集团听流:

InvestmentClubBloc(
    required this.investmentClubRepository
  ) : super(InvestmentClubLoading()) 
    onChangeSubscription = investmentClubRepository.onNewMessage.listen(
      (event) 
        emit(NewMessageState(event); // <-- The member "emit" can only be used within 'package:bloc/src/bloc.dart' or in test
      ,
    );
  

问题是emit 不起作用(我收到警告“成员“emit”只能在 'package:bloc/src/bloc.dart' 或测试中使用”)

bloc 如何监听流并根据流事件发出新状态?

【问题讨论】:

你使用哪个flutter_bloc 版本? flutter_bloc: ^8.0.0 请在下面查看我的答案。 谢谢你的好问题 【参考方案1】:

你应该在eventHandler中使用emit,使用下面的代码来完成你的任务:

abstract class Event 

class DemoEvent extends Event 

var fakeStream =
    Stream<int>.periodic(const Duration(seconds: 1), (x) => x).take(15);

class DemoBloc extends Bloc<Event, int> 
  DemoBloc() : super(0) 
    fakeStream.listen((_) 
      // add your event here
      add(DemoEvent());
    );
    on<DemoEvent>((_, emit) 
      // emit new state
      emit(state + 1);
    );
  

【讨论】:

澄清一下:即使我们在 bloc 中侦听流,bloc 也应该向自身添加事件?我确实认识到这个解决方案会起作用,但它似乎有很多开销代码。 代码基于您的用例。如果你有一个流,也许StreamBuilder 可以满足你的要求,但是你不需要 bloc。

以上是关于Bloc如何收听流并发出状态的主要内容,如果未能解决你的问题,请参考以下文章

不再发出 Bloc 初始状态

Flutter - Bloc 仅在状态未扩展 Equatable 时发出状态

Flutter bloc emmitInOrder 不会发出初始状态,但会发出

冻结的 BLoC - 产量不会向小部件发出状态更改

使用 Flutter bloc_test 测试特定状态

我正在借助 bloc(cubit)创建异步计数器应用程序,每次计数器返回 0 时我都会发出加载状态