snapshot.ConnectionState 一直在等待

Oma*_*mad 6 dart flutter

在 a 中FutureBuildersnapshot.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()...)

解决方案是setStategetDoctors方法中删除或在方法中调用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)


Spe*_*ion 5

您需要从 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)

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