flutter - 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.connectionState
is ConnectionState.done
but bothsnapshot.hasData
和snapshot.hasError
are both 的情况false
吗?null
未来可以作为其结果合法地返回。上面的代码片段会无限期地错误地显示加载指示器,不是吗?
解决方案
根据文件,snapshot.hasData
返回此快照是否包含非空数据值。
即使异步计算成功完成,如果计算没有返回非空值,这也可能是错误的。例如,即使 Future 成功完成,它也会以 null 值完成。
因此,snapshot.hasData
将在接收空值时返回 false,从而确认您在问题中的想法。
返回此快照是否包含非空错误值。
如果异步计算的最后一个结果是失败,这总是正确的。
当服务器以指示失败的状态(例如 404、500 以及伴随快照的错误对象或从操作返回的任何内容)响应时,将获得非空错误值
snapshot.hasError
在失败的请求或从未发出请求的情况下(在没有网络或网络不佳的情况下)并且响应具有非空值(将有一个错误对象附加到快照时ConnectionState.DONE
)真;即完成时),
snapshot.hasData
为假表示ConnectionState.DONE
为真且snapshot.hasData
为null
(包括操作的预期结果为 type 的情况void
)
您的问题的答案取决于由于服务器端发生的某些事情而导致请求错误时是否将错误对象附加到服务器的响应中。如果请求失败,则响应中总会附加一个错误对象,因为由于网络不良而从未发出请求。
如果错误对象为 null,则 LoadingIndicator 将无限显示
推荐阅读
- php - Laravel 关系设计
- facebook - 如何在一个页面中创建facebook多个按钮
- authentication - lighttpd - 根据在 ssl 协商期间发现的客户端证书 CN 的值拒绝连接。(ssl.verifyclient)
- c++ - 字符串和在 C++ 中获取输入的方法
- google-apps-script - Google Apps 脚本 - 在函数之间传递的变量显示为未定义
- c++ - 调试多个 GDB 文件
- c - Ardupilot Sik(Si1000 的固件)安装错误
- typescript - 函数上的打字稿调用签名作为参数
- r - 逻辑回归问题
- css - Node.JS / EJS 的 CSS 问题