首页 > 解决方案 > Flutter FutureBuilder hasData 和 connectionState

问题描述

文章Fetch data from the internet显示了FutureBuilder处理snapshot.

FutureBuilder<Post>(
  future: post,
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return Text(snapshot.data.title);
    } else if (snapshot.hasError) {
      return Text("${snapshot.error}");
    }

    // By default, show a loading spinner.
    return CircularProgressIndicator();
  },
);

这似乎还不够扎实。难道不会有snapshot.connectionStateis ConnectionState.donebut bothsnapshot.hasDatasnapshot.hasErrorare both 的情况false吗?null未来可以作为其结果合法地返回。上面的代码片段会无限期地错误地显示加载指示器,不是吗?

标签: flutterfuture

解决方案


根据文件,snapshot.hasData

返回此快照是否包含非空数据值。

即使异步计算成功完成,如果计算没有返回非空值,这也可能是错误的。例如,即使 Future 成功完成,它也会以 null 值完成。

因此,snapshot.hasData将在接收空值时返回 false,从而确认您在问题中的想法。

snapshot.hasError

返回此快照是否包含非空错误值。

如果异步计算的最后一个结果是失败,这总是正确的。

当服务器以指示失败的状态(例如 404、500 以及伴随快照的错误对象或从操作返回的任何内容)响应时,将获得非空错误值

snapshot.hasError在失败的请求或从未发出请求的情况下(在没有网络或网络不佳的情况下)并且响应具有非空值(将有一个错误对象附加到快照时ConnectionState.DONE)真;即完成时),

snapshot.hasData为假表示ConnectionState.DONE为真且snapshot.hasDatanull(包括操作的预期结果为 type 的情况void

您的问题的答案取决于由于服务器端发生的某些事情而导致请求错误时是否将错误对象附加到服务器的响应中。如果请求失败,则响应中总会附加一个错误对象,因为由于网络不良而从未发出请求。

如果错误对象为 null,则 LoadingIndicator 将无限显示


推荐阅读