0

我在使用 Flutter_bloc 注册BlocListener遇到问题

我有 3 个小部件,比如说Widget1Widget2Widget3。在作为初始路由的 Widget1 中,我已经为 SnackBar 注册了BlocListener

class Widget1 extends StatelessWidget{
  Widget build(BuildContext context) {
    return  BlocListener<SnackbarBloc, SnackbarState>(
      listener: (context, state) {
        if (state is SnackbarSuccess) {
          Scaffold.of(context).showSnackBar(SnackBar(
            content: Text('${state.message}'),
            backgroundColor: Colors.green,
          ));
        }
        if (state is SnackbarError) {
          Scaffold.of(context)..showSnackBar(SnackBar(
            content: Text('${state.message}'),
            backgroundColor: Colors.red,
          ));
        }
      },
      child: Container();
    )
  }
}

所以当我创建我的 Widget1 时,我注册了我的 SnackBarListener。在我的应用程序中,我有一个 NavigationBloc 和 Listener 用于处理导航,例如:

BlocListener<NavigationBloc, NavigationState>(
  listener: (context, state) {
    if (state is Widget1) {
      Navigator.of(context).pushNamed('/widget1');
    }
    if (state is Widget2) {
      Navigator.of(context).pushNamed('/widget2');
    }
    if (state is Widget3) {
      Navigator.of(context).pushNamed('/widget3');
    }

  },
)

有一次我将页面更改为 Widget2,然后使用 NavigationBloc 返回 Widget1,然后使用 Navigator.of(context).pushNamed('/widget1'); Widget1 中的snackBar 监听器被重新注册,所以如果我尝试打开我的snackbar 函数:

Scaffold.of(context).showSnackBar(SnackBar(
  content: Text('${state.message}'),
  backgroundColor: Colors.green,
));

为了更清楚,我创建了一个要点,这是我的问题的一个例子

https://gist.github.com/loreberti89/a916d03ed20ea10484fae3cb001964cf

被调用两次,然后是 3 次,依此类推。

我应该如何处理这些情况?

4

0 回答 0