我是新手,我在异步和等待方面遇到了一些问题。 我想先从服务器获取一些数据,然后再构建我的窗口小部件,但是我的构建方法不等待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();
}
答案 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()中进行异步调用,这样我们可以提早请求并防止不必要的网络调用。