【问题标题】:How can Bloc listen to stream and emit stateBloc如何收听流并发出状态
【发布时间】: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
  • 请在下面查看我的答案。
  • 谢谢你的好问题

标签: flutter bloc flutter-bloc


【解决方案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。
猜你喜欢
  • 2020-03-26
  • 2020-12-16
  • 2022-06-26
  • 2021-05-10
  • 2021-06-27
  • 2020-12-09
  • 2021-02-01
  • 2021-02-17
  • 1970-01-01
相关资源
最近更新 更多