Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何在Flatter StreamBuilder中使用hasData、hasError和ConnectionState处理snapshot.data_Flutter_Dart_Flutter Layout - Fatal编程技术网

Flutter 如何在Flatter StreamBuilder中使用hasData、hasError和ConnectionState处理snapshot.data

Flutter 如何在Flatter StreamBuilder中使用hasData、hasError和ConnectionState处理snapshot.data,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我不确定如何处理颤振StreamBuilder。我发现了3个案例,并想知道哪一个会比其他任何原因更好。或者,除了这些案件,是否还有更好的处理方法 另外,ConnectionState.active和ConnectionState.done之间有什么区别?我是否应该等待使用快照.data直到连接状态.done(案例1或案例2) 案例1: return StreamBuilder( builder: (context, snapshot) { if (snapsh

我不确定如何处理颤振StreamBuilder。我发现了3个案例,并想知道哪一个会比其他任何原因更好。或者,除了这些案件,是否还有更好的处理方法

另外,ConnectionState.activeConnectionState.done之间有什么区别?我是否应该等待使用快照.data直到连接状态.done案例1案例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;
      },
    );
    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;
      },
    );
    return StreamBuilder(
      builder: (context, snapshot) {
        if (snapshot.hasError) return Text('Error');
        if (!snapshot.hasData) return CircularProgressIndicator();
        return Text('${snapshot.data}');
      },
    );
案例2:

    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;
      },
    );
    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;
      },
    );
    return StreamBuilder(
      builder: (context, snapshot) {
        if (snapshot.hasError) return Text('Error');
        if (!snapshot.hasData) return CircularProgressIndicator();
        return Text('${snapshot.data}');
      },
    );
案例3:

    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;
      },
    );
    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;
      },
    );
    return StreamBuilder(
      builder: (context, snapshot) {
        if (snapshot.hasError) return Text('Error');
        if (!snapshot.hasData) return CircularProgressIndicator();
        return Text('${snapshot.data}');
      },
    );
根据它的状态,活动和完成之间的区别在于
ConnectionState.active
:是尚未完成但返回至少一个值的流,
ConnectionState.done
:它已终止您正在处理的异步计算/事务


关于你什么时候应该等待的问题,这取决于你正在进行的计算类型

通常情况下,
ConnectionState.active
更需要注意,因为您正在处理一个流,这意味着数据可能会更新,并且应用程序的状态也应该更新

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


要了解如何处理
StreamBuilder
QuerySnapshot
查看如果连接状态为无以改善用户体验,请显示一条消息。如果连接状态完成,请检查snapshot.hasData和display小部件是否正确,或者错误是否再次显示消息。“活动”和“等待”可用于显示指示器或任何您喜欢的内容。活动表示(基本)连接处于活动状态。感谢您的评论。我认为检查snapshot.hasData和ConnectionState是一样的,只是粒度问题,所以我不知道ConnectionState.done是否完成,我仍然需要检查snapshot.hasData。另一件事是只有当ConnectionState.done时,我才应该访问snapshot.data,或者当ConnectionState.active也处于活动状态时,我还可以将snapshot.data与小部件一起使用?