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
?我怀疑是否有其他方法。您可以使用完成符强制方法返回未来