Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 是否从异步方法返回多个结果?_Flutter_Dart_Dart Async - Fatal编程技术网

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*
,然后开始
生成结果;)。