我的项目出了点问题.问题是,当我推送并转到另一个页面并运行BlocProvider以在该页面中运行阻塞函数时,后台堆栈中BlocListener也会运行,因为它与后台阻塞相同.如何阻止后台堆栈/页面中的块侦听器运行?

我导航到的下一个页面是一个普通的有状态窗口小部件类,带有一个用于获取更新数据的刷新指示器.然而,在应用程序打开或登录时,主页上用于获取初始数据的相同阻止函数似乎也被调用.

我try 在后台的块侦听器内的函数中使用if(context.mount)来阻止它们,以防它们不在焦点上.但是它对我不起作用,if条件中的代码仍然在运行.

在这种情况下,如何阻止后台堆栈/页面中的块侦听器运行?

推荐答案

我有一个类似的情况下,前一段时间,和替代的解决方案是发挥周围的路由.

您可以使用ModalRoute中的isCurrent属性来确定上下文路由是否是导航器上的最顶层路由.

将其作为条件放置在后台/主页中的侦听器代码中,以防止在当前页面被其他页面、通道或覆盖阻止时代码执行.

BlocListener(
  listener: (context, state) async {
    final route = ModalRoute.of(context);
    final isCurrentRoute = route?.isCurrent ?? false;
    if (isCurrentRoute) {
      // your listener code moved here
      // this code will run only if the 
      // current page is the top route
    }
  },
  child: ...,
),

这比创建页面标志变量或重构块本身要干净得多.

Flutter相关问答推荐

Flutter在创建时为提供者调用初始化函数

如何在Flutter 屏幕中添加箭头形状

Flutter 中的面向对象模式

无法让Riverpod Stream发出新值

如何在2024年使用Ffltter将用户数据保存在云FireStore中?

脚本具有不受支持的MIME类型(';Text/html';).(messaging/failed-service-worker-registration)

如何确定Flutter 中的文本 colored颜色 ?

如何在 Flutter 中以背景 colored颜色 制作圆圈的一部分

Flutter http 请求获取 null

点击按钮后重新启动定时器

更改底部导航栏下方 Flutter Snackbar 的位置

如何将此文本按钮剪辑在堆栈中的圆形头像上方?

小部件堆栈未显示顶层

Flutter/Riverpod 创建复杂对象的副本,其值在某处发生变化

Riverpod 在使用冻结副本更新状态时触发重建,即使没有任何更改

Flutter Serverpod 在示例项目上返回 400 错误

Flutter 如何使用 ClipPath 编辑容器的顶部?

运行Flutter 测试时出现 FirebaseAppPlatform.verifyExtends 错误

Firebase Firestore 查询

Flutter Bloc Todo 示例 - 收听存储库中的单个 todo