在 a 中FutureBuilder
,snapshot.ConnectionState
一直在等待,但 future 函数成功完成。当在不同的页面中时,相同的代码块起作用并且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;
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
未来建设者:
FutureBuilder(
future: getDoctors(),
builder: (BuildContext context, snapshot) {
print(snapshot);
}
)
Run Code Online (Sandbox Code Playgroud)
实际结果:
AsyncSnapshot<dynamic>(ConnectionState.waiting, null, null)
预期结果:过渡到 AsyncSnapshot<dynamic>(ConnectionState.done, null, null)
EDIT1:调试时注意到future函数getDoctors()
会被定期调用,我想这就是快照总是在等待的原因
Oma*_*mad 14
调用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);
}
),
Run Code Online (Sandbox Code Playgroud)
您需要从 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;
}
Run Code Online (Sandbox Code Playgroud)
并将您的 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());
},
)
Run Code Online (Sandbox Code Playgroud)
请修改以匹配您的变量和类。
归档时间: |
|
查看次数: |
11532 次 |
最近记录: |