Flutter 是否从异步方法返回多个结果?
我目前有一个类似以下内容的方法:Flutter 是否从异步方法返回多个结果?,flutter,dart,dart-async,Flutter,Dart,Dart Async,我目前有一个类似以下内容的方法: typedef void MyCallback(int status, String body); void makeRequest(String url, MyCallback callback) async { if( someCondition ){ callback(1, ''); } Response response = await http.get(url); if( response.httpCode == 200
typedef void MyCallback(int status, String body);
void makeRequest(String url, MyCallback callback) async {
if( someCondition ){
callback(1, '');
}
Response response = await http.get(url);
if( response.httpCode == 200 ){
callback(2, response.body);
}
else{
callback(3, '');
}
}
我想取消回调,以便可以等待makeRequest
的结果。但是如果我简单地让它返回一个未来
,我将不能返回多次
我考虑过使用streams,但它似乎有点复杂。因此,基本上我在寻找像未来一样方便的东西,但可能会收到“部分结果”,即多次收到结果。举例说明:
MultiFuture<int> makeRequest(String url){
MultiFuture result = new MultiFuture();
if( someCondition ){
result.value(1);
}
http.get(url).then((response){
if( response.httpCode == 200 ){
result.value(2);
}
else{
result.value(3);
}
result.finish();
});
return result;
}
MultiFuture requestResult = makeRequest('https://example.com');
await requestResult.onValue((int value){
print('value: $value');
});
// When result.finish() is called, the await is finished
MultiFuture makeRequest(字符串url){
多重未来结果=新多重未来();
如果(某些条件){
结果:数值(1);
}
http.get(url).then((响应){
如果(response.httpCode==200){
结果:价值(2);
}
否则{
结果:价值(3);
}
result.finish();
});
返回结果;
}
MultiFuture requestResult=makeRequest('https://example.com');
等待requestResult.onValue((int值){
打印('value:$value');
});
//调用result.finish()时,等待完成
使用流是我的最佳选择,还是存在某种我不知道的多未来
?从异步方法返回多个结果正是流所做的。下面是我根据您的代码制作的一个示例,以便您更容易理解它的工作原理:
class MultiFuture {
StreamController<int> _resultController = StreamController<int>();
Stream<int> get requestResult => _resultController.stream;
void makeRequest(String request) async {
if (true) {
_resultController.sink.add(1);
}
// mock request
await Future.delayed(Duration(seconds: 3));
if (true) {
_resultController.sink.add(2);
} else {
_resultController.sink.add(3);
}
}
void example() {
makeRequest("https://example.com");
requestResult.listen((value) {
print('value: $value');
});
}
}
类多重未来{
StreamController _resultController=StreamController();
Stream get requestResult=>\u resultController.Stream;
void makeRequest(字符串请求)异步{
如果(真){
_resultController.sink.add(1);
}
//模拟请求
等待未来。延迟(持续时间(秒:3));
如果(真){
_结果控制器.接收器.添加(2);
}否则{
_结果对照组。水槽。添加(3);
}
}
void示例(){
makeRequest(“https://example.com");
requestResult.listen((值){
打印('value:$value');
});
}
}
您可以通过调用MultiFuture()来测试它
但我建议您观看这些简单的短片,以便有更好的想法:
从异步方法返回多个结果正是streams所做的。下面是我根据您的代码制作的一个示例,以便您更容易理解它的工作原理:
class MultiFuture {
StreamController<int> _resultController = StreamController<int>();
Stream<int> get requestResult => _resultController.stream;
void makeRequest(String request) async {
if (true) {
_resultController.sink.add(1);
}
// mock request
await Future.delayed(Duration(seconds: 3));
if (true) {
_resultController.sink.add(2);
} else {
_resultController.sink.add(3);
}
}
void example() {
makeRequest("https://example.com");
requestResult.listen((value) {
print('value: $value');
});
}
}
类多重未来{
StreamController _resultController=StreamController();
Stream get requestResult=>\u resultController.Stream;
void makeRequest(字符串请求)异步{
如果(真){
_resultController.sink.add(1);
}
//模拟请求
等待未来。延迟(持续时间(秒:3));
如果(真){
_结果控制器.接收器.添加(2);
}否则{
_结果对照组。水槽。添加(3);
}
}
void示例(){
makeRequest(“https://example.com");
requestResult.listen((值){
打印('value:$value');
});
}
}
您可以通过调用MultiFuture()来测试它
但我建议您观看这些简单的短片,以便有更好的想法:
谢谢!我现在没有时间测试,但似乎缺少的是等待某个最终值或关闭事件的功能,比如我的伪代码中的.finish()
?每次调用_resultController.sink.add时都会触发requestResult.listen,这就是为什么不需要等待某个最终值或关闭事件。尝试使用此代码在任何地方添加打印,同时检查真正简单且解释良好的视频。另外,当您退出屏幕时需要关闭的是控制器,您应该在小部件状态的dispose()方法中调用resultController.close()来释放ResourcesHanks!我现在没有时间测试,但似乎缺少的是等待某个最终值或关闭事件的功能,比如我的伪代码中的.finish()
?每次调用_resultController.sink.add时都会触发requestResult.listen,这就是为什么不需要等待某个最终值或关闭事件。尝试使用此代码在任何地方添加打印,同时检查真正简单且解释良好的视频。另外,当您退出屏幕时需要关闭的是控制器,您应该在小部件状态的dispose()方法中调用resultController.close()来释放资源您只是在描述流。是的,它们比futures稍微复杂一点,但是它们完全符合您的用例,并且是用这种语言编写的。因此,只需将您的方法标记为async*
,然后开始生成结果;)。您只是在描述流。是的,它们比futures稍微复杂一点,但是它们完全符合您的用例,并且是用这种语言编写的。因此,只需将您的方法标记为async*
,然后开始生成结果;)。