我如何等待一个没有 return Future 的方法?

How can I wait for a method that doesn't return a Future?

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

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

问题是 refreshList() 不是 async,而是在内部使用了 async 方法。此外,内部方法不会 return a 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; });

但不幸的是我无法将模型中的方法修改为 return a Future.

有没有什么办法可以不把refreshList()修改为async,把return修改为Future,把_doRefreshList()修改为[=39呢? =]一个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;
}

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

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

Future(model.refreshList); 

现在你可以使用 await 因为上面给了你 Future<void>:

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

不,没有办法等待异步操作完成,除非 提供某种方法在完成时获得回调。 通常的做法是 return 一个未来。有一个回调函数参数是另一种方法,但它很少比 return 未来更好。

在您的示例中,refreshVerList 无法在完成时进行报告,_doRefreshList 也无法报告。您将不得不补充说,不知何故,return未来是解决这两个功能问题的最简单和最一致的方法。

(从技术上讲,_doRefreshList 函数做 return 一个未来,它只是输入为 void。你可以将该未来转换为 Future,但我 强烈 阻止这种恶作剧。如果函数作者决定 return 其他东西,比如 null,在以后的某个时候,他们完全有权这样做,因为return 类型是 void。)