snapshot.ConnectionState始终在等待

时间:2019-02-15 13:55:59

标签: dart flutter

在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()被定期调用,我想这就是快照始终在等待的原因

2 个答案:

答案 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());
    },
)

请进行修改以匹配您的变量和类。