我如何等待一个没有 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
。)
我正在使用我无法修改的现有模型 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
。)