在FutureBuilder中,snapshot.ConnectionState始终在等待,但将来的功能已成功完成。在不同的页面中,相同的代码块有效,并且ConnectionState从等待状态转换为完成状态。
未来的功能
Future getDoctors() async {
var res = await http.get(globals.domain + "users/docs/");
var resBody = json.decode(utf8.decode(res.bodyBytes));
print(res.statusCode);
if (res.statusCode == 200) {
if (mounted) {
setState(() {
doctors = resBody;
});
}
}
}
未来的建设者:
FutureBuilder(
future: getDoctors(),
builder: (BuildContext context, snapshot) {
print(snapshot);
}
)
实际结果:
AsyncSnapshot<dynamic>(ConnectionState.waiting, null, null)
预期结果:过渡到AsyncSnapshot<dynamic>(ConnectionState.done, null, null)
EDIT1: 在调试过程中注意到未来的函数getDoctors()被定期调用,我想这就是快照始终在等待的原因
答案 0 :(得分:1)
调用setState
导致重建小部件树。因此,在重建FutureBuilder
时,将再次调用getDoctors()
函数,从而导致无限循环(getDoctors()
-> setState()
-> rebuild-> getDoctors()
...)
解决方案是从setState
方法中删除getDoctors
或在getDoctors()
方法中调用initState()
一次,存储Future
并将其传递给FutureBuilder
,从而确保仅完成一次。
Future _doctorsFuture;
initState() {
...
_doctorsFuture = getDoctors();
}
.
.
// Somewhere in build()
FutureBuilder(
future: doctorsFuture,
builder: (BuildContext context, snapshot) {
print(snapshot);
}
),
答案 1 :(得分:0)
您需要从Future返回值以完成连接。将“未来”更改为以下内容:
Future<dynamic> getDoctors() async {
var res = await http.get(globals.domain + "users/docs/");
if (res.statusCode == 200) {
return json.decode(utf8.decode(res.bodyBytes));
}
return null;
}
并将您的FutureBuilder更改为此:
FutureBuilder(
future: getDoctors(),
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
print(snapshot);
if (snapshot.connectionState == ConnectionState.done && snapshot.hasData && snapshot.data != null) {
return Center(...);
}
return Center(child: CircularProgressIndicator());
},
)
请进行修改以匹配您的变量和类。