flutter - BLoC 中的逻辑应该如何触发一次性 UI 警报,例如对话框或 snackbar ?

标签 flutter dart bloc

当使用 BLoC 模式将业务逻辑与 View 隔离时(没有 bloc library ),当某些异步逻辑在 BLoC 中完成时,我们如何触发一次性 UI 调用(如显示 snackbar 或警报对话框)?例如,如果网络请求失败,我们希望显示一个对话框,通知用户无法获取某些数据。

我探索过的选项是:

  • 在小部件的构建方法中使用 StreamBuilder 来监听来自 bloc 的事件,并在 StreamBuilder 的构建方法中显示对话框。 这种方法的问题在于 StreamBuilderbuild 方法实际上不会在这里构建任何东西。我们只是要求 Flutter 显示一个对话框。我们可以返回一些不可见的“假”小部件只是为了让 Flutter 开心,但这真的很糟糕。
  • 使小部件有状态。在 initState 中,订阅来自 BLoC 的错误流,并在监听器中显示对话框。 这里我们保持逻辑/ View 的解耦,但据我所知,这个选项甚至不可行,因为我们没有显示对话框所需的 BuildContext
  • 当小部件调用 BLoC 上的某些逻辑,这可能会导致应触发对话框的更改,传入显示对话框的回调。 在这里列出的选项中,我更喜欢这个。逻辑和 View 仍然非常独立,但感觉有点奇怪。 BLoC 模式中的数据流通常纯粹是“小部件 -> 通过接收器或函数的 BLoC”和“通过流的 BLoC -> 小部件”。在执行某些逻辑后,让小部件要求 BLoC 调用回调(将数据与其一起传回)是违反此模式的。

  • 我一直在避免使用 bloc 库(为了保持简单,以及其他原因)。但是,它似乎确实以其 BlocListener 的形式提供了解决此问题的方法。在保持BLoC核心原则的情况下,有没有简单的方法可以解决这个问题?

    最佳答案

    我只是在研究这个确切的问题。这是我的解决方案 - 它属于第 2 类:

    class CurrencyStreamListener extends StatefulWidget {
      final Stream<CurrencyNotification> notificationStream;
      final Widget child;
      CurrencyStreamListener({this.notificationStream, this.child});
    
      @override
      _CurrencyStreamListenerState createState() => _CurrencyStreamListenerState();
    }
    
    class _CurrencyStreamListenerState extends State<CurrencyStreamListener> {
      @override
      void initState() {
        widget.notificationStream.listen((CurrencyNotification data) {
          if (data is NotificationOfIncrease) {
            Scaffold.of(context).showSnackBar(
              SnackBar(
                duration: Duration(seconds: 1),
                content: Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text('Earned Currency'),
                  ],
                ),
              ),
            );
          }
        });
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return widget.child;
      }
    }
    

    这样我就可以在我可以访问 Bloc 流的任何地方嵌套这个小部件,所以可能在某些 Provider 或 Consumer 类下。

    关于flutter - BLoC 中的逻辑应该如何触发一次性 UI 警报,例如对话框或 snackbar ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59992327/

    相关文章:

    dart - 如何从自定义元素中导入自定义聚合物元素?

    flutter - Dart 2.6和Flutter,升级依赖关系

    dart - StreamBuilder 抛出 Dirty State 说 Invalid Arguments

    flutter - 在提供者初始化时调用将来的方法

    flutter - 对小部件的 State 对象调用 setState()

    flutter - 如何在Flutter中创建自定义反向导航

    dart - 在Dart(2.0.0-dev.62.0)中调用通用函数

    flutter - 如何创建一个 BlocListener 来监听 flutter 中的所有页面并访问 MaterialApp 上下文?

    Flutter:BLoC 包 - bloc 提供者

    firebase - 如何从 flutter 中的 firestore 文档字段获取数据?