监听 bloc 被多次调用

int*_*syo 7 flutter bloc

我有这个代码用于在屏幕上收听 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 的原因

Gre*_*nsy 9

如果 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)

  • 这实际上就是我正在努力寻找的。一种取消我之前的“监听”的方法。多谢。现在它正在按照我的预期工作。 (2认同)