Asynchronous 我如何等待一个不';我们不能返回未来吗?
我正在使用现有的模型类在应用程序中构建一个屏幕,我无法修改它。该模型有一个名为Asynchronous 我如何等待一个不';我们不能返回未来吗?,asynchronous,dart,flutter,async-await,dart-async,Asynchronous,Dart,Flutter,Async Await,Dart Async,我正在使用现有的模型类在应用程序中构建一个屏幕,我无法修改它。该模型有一个名为refreshList()的方法,该方法从API获取一些数据,并对其进行处理,最后用获取的数据更新模型中的List成员 我想知道列表的状态——即它是未初始化的、正在获取的还是已经获取的——以便我可以相应地更新UI 问题在于refreshList()不是async,而是在内部使用async方法。此外,内部方法不会返回未来 void refreshList(){ if( someCondition ){
refreshList()
的方法,该方法从API获取一些数据,并对其进行处理,最后用获取的数据更新模型中的List
成员
我想知道列表的状态——即它是未初始化的、正在获取的还是已经获取的——以便我可以相应地更新UI
问题在于refreshList()
不是async
,而是在内部使用async
方法。此外,内部方法不会返回未来
void refreshList(){
if( someCondition ){
_doRefreshList();
}
}
void _doRefreshList() async{
// ... do stuff
http.Response response = await http.get(url);
// ... do some more stuff
}
我想做一些像
setState((){ _isLoading = true; });
await model.refreshList();
setState((){ _isLoading = false; });
但不幸的是,我无法修改模型中的方法以返回未来的
void refreshList(){
if( someCondition ){
_doRefreshList();
}
}
void _doRefreshList() async{
// ... do stuff
http.Response response = await http.get(url);
// ... do some more stuff
}
有没有办法在不修改refreshList()
为async
并返回Future
、修改\u doRefreshList()
以返回Future
的情况下实现这一点?您可以使用Completer
Completer<Null> onFetchCompleter;
Future<Null> _doRefreshList() async{
onFetchCompleter = Completer();
// ... do stuff
http.Response response = await http.get(url);
// ... do some more stuff
onFetchCompleter.complete();
return onFetchCompleter.future;
}
完成器onFetchCompleter;
Future\u doRefreshList()异步{
onFetchCompleter=Completer();
//…做事
http.Response-Response=等待http.get(url);
//…多做点事
onFetchCompleter.complete();
返回onFetchCompleter.future;
}
同样,您也可以在refreshVerList方法中使用补足符。您可以使用补足符
Completer<Null> onFetchCompleter;
Future<Null> _doRefreshList() async{
onFetchCompleter = Completer();
// ... do stuff
http.Response response = await http.get(url);
// ... do some more stuff
onFetchCompleter.complete();
return onFetchCompleter.future;
}
完成器onFetchCompleter;
Future\u doRefreshList()异步{
onFetchCompleter=Completer();
//…做事
http.Response-Response=等待http.get(url);
//…多做点事
onFetchCompleter.complete();
返回onFetchCompleter.future;
}
同样,您也可以在refreshVerList方法中使用补全符。使用函数引用作为参数创建一个Future
:
Future(model.refreshList);
现在您可以使用wait
,因为上面给出了一个未来
:
使用函数引用作为参数创建一个未来
:
Future(model.refreshList);
现在您可以使用wait
,因为上面给出了一个未来
:
不,除非异步操作完成后提供某种方式获取回调,否则无法等待异步操作完成。
通常的做法是回归未来。拥有回调函数参数是另一种方法,但它很少比只返回未来更好
在您的示例中,refreshVerList
无法报告何时完成,而且\u doRefreshList
也无法报告。您必须以某种方式添加这一点,返回未来是解决这两个函数问题的最简单和最一致的方法
(从技术上讲,\u doRefreshList
函数确实返回了一个未来,它只是被输入为void
。你可以将这个未来投射到future
,但我强烈反对这种恶作剧。如果函数作者决定稍后返回其他东西,比如null
,它们完全在自己的ri范围内由于返回类型为void
)否,因此无法等待异步操作完成,除非它提供了某种方法在完成时获取回调。
通常的方法是返回一个未来。使用回调函数参数是另一种方法,但它很少比只返回一个未来更好
在您的示例中,refreshVerList
在完成时无法报告,也无法报告。您必须以某种方式添加它,返回未来是解决这两个函数问题的最简单和最一致的方法
(从技术上讲,\u doRefreshList
函数确实返回了一个未来,它只是被输入为void
。你可以将这个未来投射到future
,但我强烈反对这种恶作剧。如果函数作者决定稍后返回其他东西,比如null
,它们完全在自己的ri范围内既然返回类型是void
)为什么不将其设置为async
?我怀疑是否有其他方法。您可以使用完成符强制方法返回未来为什么不将其设置为async
?我怀疑是否有其他方法。您可以使用完成符强制方法返回未来