如何等待不返回Future的方法?

时间:2019-05-21 12:14:48

标签: asynchronous dart flutter async-await dart-async

我正在使用无法修改的现有模型类在应用程序中构建屏幕。该模型具有一种称为refreshList()的方法,该方法从API提取一些数据,进行处理,最后用所获取的数据更新模型中的List成员。

我想知道列表的状态-即它是否未初始化,正在获取或已经获取-以便我可以相应地更新UI。

问题在于refreshList()不是async,而是在内部使用async方法。此外,内部方法不会返回Future

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; });

但不幸的是,我无法修改模型中的方法以返回Future

是否有任何方法可以实现而无需将refreshList()修改为async并返回Future,并修改_doRefreshList()来返回Future? / p>

3 个答案:

答案 0 :(得分:3)

否,除非 it 提供某种方法来完成回调,否则无法等待异步操作完成。 这样做的通常方法是返回未来。具有回调函数参数是另一种方法,但是它几乎不比仅返回将来更好。

在您的示例中, article.set('name', 'draft'); article.save().then(transitionToarticle).catch(failure);; // => PATCH to '/article/id' 无法报告完成情况,refreshVerList也无法报告。您将不得不添加某种方式,返回未来是解决这两个函数问题的最简单,最一致的方法。

(从技术上讲,_doRefreshList函数的确会返回一个Future,它的类型为_doRefreshList。您可以将该Future强制转换为void,但是我 strong 如果函数作者决定稍后再返回其他内容,例如说Future,则返回的类型是null。如果函数作者决定返回其他内容,例如void。)

答案 1 :(得分:1)

您可以使用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;
}

以相同的方式,您可以在refreshVerList方法中使用完成者。

答案 2 :(得分:1)

使用函数引用作为参数创建一个Future

Future(model.refreshList); 

现在您可以使用await,因为以上内容为您提供了Future<void>

setState(() { _isLoading = true; });
await Future(model.refreshList);
setState(() { _isLoading = false; });