Bloc如何收听流并发出状态
Posted
技术标签:
【中文标题】Bloc如何收听流并发出状态【英文标题】:How can Bloc listen to stream and emit state 【发布时间】:2022-01-11 13:31:04 【问题描述】:在我的 Flutter 应用中,我使用 flutter_bloc 进行状态管理。
有问题的bloc
使用repository
。 repository
订阅一个 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如何收听流并发出状态的主要内容,如果未能解决你的问题,请参考以下文章
Flutter - Bloc 仅在状态未扩展 Equatable 时发出状态