我有这个代码用于在屏幕上收听 bloc。
late MyBloc myBloc;
@override
void initState() {
print('inside init state');
super.initState();
myBloc = BlocProvider.of<MyBloc>(context);
myBloc.stream.listen((state) {
if (state is MyAddCompletedState) {
print('listening to bloc');
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我添加一个事件,它将打印一次监听 bloc 。如果我转到另一个屏幕并返回到同一屏幕,它将打印两次“listening to bloc”。看来我的第一次聆听仍然活跃。接下来,我尝试关闭我的处置块,认为它会停止第一次监听。这样,当我回到屏幕时,它将进行新的监听,但会出现错误:错误状态:调用 close 后无法添加新事件。我尝试对此进行研究,并提到要处置该块,但它不再具有该语法。请帮助我在更改屏幕后如何正确关闭或停止监听。谢谢!
//this is found on my screen
late MyBloc myBloc;
@override
void initState() {
print('inside init state');
super.initState();
myBloc = BlocProvider.of<MyBloc>(context);
myBloc.stream.listen((state) {
if (state is MyAddCompletedState) {
print('listening to bloc');
}
}
}
@override
void dispose() {
myBloc.close();
// myBloc.dispose(); --> I saw some tutorial to use this but it doesn't work
super.dispose();
}
Run Code Online (Sandbox Code Playgroud)
这是我的 main.dart 上:
return FutureBuilder(
future: InitFirst.instance.initialize(),
builder: (context, AsyncSnapshot snapshot) {
return MultiBlocProvider(
providers: [
BlocProvider<MyBloc>(
create: (context) => MyBloc(
authenticationRepository: authenticationRepository,
userDataRepository: userDataRepository,
),
),
...
Run Code Online (Sandbox Code Playgroud)
这是我触发事件的部分。该事件运行后,stream.listen 将被触发。但每次我访问我的屏幕时它都会被触发多次。
myBloc.add(MyAddEvent(
selectedName,
selectedCount);
Run Code Online (Sandbox Code Playgroud)
附加说明:此事件正在触发 Firebase 中的更新,我需要检查它是否已完成,这就是我执行 stream.listen 的原因。
如果 Bloc 中使用的 Stream 在不使用时不断被调用,您可能需要考虑在cancel()覆盖中终止 Stream dispose()。尝试这个
late MyBloc myBloc;
late StreamSubscription mSub;
@override
void initState() {
print('inside init state');
super.initState();
myBloc = BlocProvider.of<MyBloc>(context);
mSub = myBloc.stream.listen((state) {
if (state is MyAddCompletedState) {
print('listening to bloc');
}
}
}
@override
void dispose() {
mSub.cancel();
super.dispose();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8507 次 |
| 最近记录: |