构建方法不等待异步

时间:2019-08-30 12:04:00

标签: flutter

我是新手,我在异步和等待方面遇到了一些问题。 我想先从服务器获取一些数据,然后再构建我的窗口小部件,但是我的构建方法不等待getData,并且构建中的我的窗口小部件之一无法运行而没有任何数据。 我想要一个函数,等待数据从服务器传来,然后运行构建方法。

Map<String,dynamic> data = Map<String,dynamic>();
 Future getData() async{
    String url = "http://10.0.2.2:8080/facts/get.php";
    http.Response responseData = await http.get(url);
  setState(() {
     data = json.decode(responseData.body); 
  });
}
@override
void initState()  {
  super.initState();
  getData();
}

1 个答案:

答案 0 :(得分:1)

我建议使用FutureBuilder而不是将async函数放在initState中。为此,您需要更改getData方法。

示例

您的州有一个名为dbFuture的Future变量

Future<Map<String, dynamic>> dbFuture;

您的getData方法应如下:

 Future<Map<String,dynamic>> getData() async{
    String url = "http://10.0.2.2:8080/facts/get.php";
    http.Response responseData = await http.get(url);
    return json.decode(responseData.body); 
}

让我们在initState中发出网络请求,而无需等待结果,只需将其分配给我们的Future变量:dbFuture

initState(){
  dbFuture = getData();
  super.initState();
}

,并在build方法中:

FutureBuilder(
      future: dbFuture,
      builder: (BuildContext context,AsyncSnapshot snapshot){
        if(snapshot.connectionState != ConnectionState.done){
          return Container(); // your widget while loading
        }

        if(!snapshot.hasData){
          return Container(); //your widget when error happens
        }

        final data = snapshot.data; //your Map<String,dynamic>
        return yourScreen(); //place your widget here
      },
    );

您可以参考文档中的FutureBuilder小部件以获取更多信息。

注意:我们不是使用方法作为Future,而是使用Future变量,并在initState()中进行异步调用,这样我们可以提早请求并防止不必要的网络调用。