我有一个需要在有状态窗口小部件的initState中调用的异步函数,但是我不能使用await,因为initState不是异步的。
sendHealthData
是async
,因为它从Health Api获取了一些信息,然后我需要将该信息发送到另一个StatefulWidget
的HomeSubScreen。但是在创建HomeSubScreen时,sendHealthData
方法无法获取所有信息,因此,如果我尝试将参数值发送给HomeSubScreen
,则该值将为null。 / p>
我该怎么做?
@override
void initState() {
super.initState();
sendHealthData();
_widgetOptions = <Widget>[
HomeSubScreen(healthData),
];
}
更新: 如果添加了then(),则会出现以下错误:
NoSuchMethodError: The method 'elementAt' was called on null.
代码已更新:
@override
void initState() {
super.initState();
sendHealthData().then((response){
_widgetOptions = <Widget>[
HomeSubScreen(healthData),
];
});
}
答案 0 :(得分:1)
我给你大概的想法。
@override
void initState() {
super.initState();
function().then((int value) {
// future is completed you can perform your task
});
function2(); // or you can simply call the method if you don't want anything to do after future completes
}
Future<int> function() async {
// do something here
}
Future<int> function2() async {
// do something here
}
答案 1 :(得分:0)
您不能在initState中等待异步功能,但是一个小技巧是在以后完成操作后使用Then关键字执行代码。
例如:
@override
void initState() {
super.initState();
sendHealthData().then((response){
_widgetOptions = <Widget>[
HomeSubScreen(response),
];
});
}
,函数必须类似于:
Future sendHealthData() async{}
答案 2 :(得分:0)
您也可以使用FutureBuilder
FutureBuilder<String>(
future: getYourDataFromApi(),
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
return Text('start widget');
case ConnectionState.active:
case ConnectionState.waiting:
return Text('Awaiting result from api...');
case ConnectionState.done:
if (snapshot.hasError)
return Text('Error: ${snapshot.error}');
return Text('Result: ${snapshot.data}');
}
return null; // unreachable
},
)