我正在使用无法修改的现有模型类在应用程序中构建屏幕。该模型具有一种称为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>
答案 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; });