【问题标题】:How to handle snapshot.data with hasData, hasError, and ConnectionState in Flutter StreamBuilder如何在 Flutter StreamBuilder 中使用 hasData、hasError 和 ConnectionState 处理 snapshot.data
【发布时间】:2020-01-25 14:22:14
【问题描述】:

我不确定如何处理 Flutter StreamBuilder。我找到了 3 个案例,并且想知道哪一个会比其他的更好。或者,除了这些情况,还有其他更好的处理方式。

另外,ConnectionState.activeConnectionState.done 有什么区别?我是否应该使用 snapshot.data 等到 ConnectionState.doneCase 1Case 2)。

案例 1:

    return StreamBuilder(
      builder: (context, snapshot) {
        if (snapshot.hasError) return Text('Error');
        switch (snapshot.connectionState) {
          case ConnectionState.none:
          case ConnectionState.waiting:
            return CircularProgressIndicator();
          case ConnectionState.active:
          case ConnectionState.done:
            return Text('${snapshot.data}');
        }
        return null;
      },
    );

案例 2:

    return StreamBuilder(
      builder: (context, snapshot) {
        if (snapshot.hasError) return Text('Error');
        switch (snapshot.connectionState) {
          case ConnectionState.none:
          case ConnectionState.waiting:
          case ConnectionState.active:
            return CircularProgressIndicator();
          case ConnectionState.done:
            return Text('${snapshot.data}');
        }
        return null;
      },
    );

案例 3:

    return StreamBuilder(
      builder: (context, snapshot) {
        if (snapshot.hasError) return Text('Error');
        if (!snapshot.hasData) return CircularProgressIndicator();
        return Text('${snapshot.data}');
      },
    );

【问题讨论】:

  • 如果连接状态没有改善用户体验,显示一条消息。如果连接状态已完成,请检查 snapshot.hasData 是否显示小部件或错误是否再次显示消息。活动和等待可用于显示指标或您喜欢的任何内容。活动意味着(基本)连接处于活动状态。
  • 感谢您的评论。我以为检查snapshot.hasData和ConnectionState只是粒度问题,所以我不知道如果ConnectionState.done,我仍然需要检查snapshot.hasData。另一件事是只有在ConnectionState.done时,我应该访问snapshot.data,或者我也可以在ConnectionState.active时使用snapshot.data和Widget?

标签: flutter dart flutter-layout


【解决方案1】:

根据Flutter Docs,它指出活动和完成之间的区别在于 ConnectionState.active :是尚未完成但至少返回一个值的流,
ConnectionState.done:它已经终止了你正在处理的异步计算/事务。


关于您应该何时等待的问题,这取决于您正在进行的计算类型。

通常ConnectionState.active 更重要,因为您正在处理一个流,这意味着数据可以更新并且您的应用程序的状态也应该更新。

您可以使用ConnectionState.done 确保您已获取数据并终止异步连接。

要了解如何处理StreamBuilderQuerySnapshot,请查看Firebase for Flutter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-25
    • 2019-11-29
    • 2019-04-09
    • 2020-03-12
    • 1970-01-01
    • 2020-10-03
    • 2021-05-17
    相关资源
    最近更新 更多