Dart:如何返回Future <void>

时间:2020-01-31 09:20:17

标签: android asynchronous flutter future

如何退回Future<void>

   Future<void> deleteAll(List stuff){
       stuff.forEach( s => delete(s));   //How do I return Future<void> when loop and all delete Operation are finished?
   }

   Future<void> delete(Stuff s) async {
      ....
      file.writeAsString(jsonEncode(...));
   }

Future<void>循环和所有删除操作完成后,如何返回forEach

2 个答案:

答案 0 :(得分:7)

您不需要手动返回任何内容,因为async函数仅在该函数实际完成时返回。

查看示例,您缺少async关键字,这意味着您需要编写以下内容:

Future<void> deleteAll(List stuff) async {
    stuff.forEach( s => delete(s));
}

Future<void> delete(Stuff s) async {
   ....
   await file.writeAsString(jsonEncode(...));
}

顾名思义,void一无是处,因此无需返回任何内容。

还要确保您使用deleteAll呼叫writeAsString()await

答案 1 :(得分:2)

您无法使用forEach来做到这一点。

但是您可以像这样使用Future.wait.map

Future<void> deleteAll(List stuff) {
  return Future.wait(stuff.map((s) => delete(s)));
}

Future<void> delete(Stuff s) async{
  ....
  await file.writeAsString(jsonEncode(...));
}

何时使用async关键字:

当函数内部使用async关键字时,可以使用await

因此何时使用await关键字:

  1. 当您想从异步函数获取结果并希望对结果做一些逻辑时
Future<int> fetchCountAndValidate() asycn{
  final result = await fetchCountFromServer();
  if(result == null)
    return 0;
  else
   return result;
}
  1. 当您要调用多个异步函数时
Future<int> fetchTotalCount() asycn{
  final result1 = await fetchCount1FromServer();
  final result2 = await fetchCount2FromServer();
  return result1 + result2;
}

不需要asyncawait时:

  1. 当您仅调用另一个异步函数时
Future<int> getCount(){
  //some synchronous logic
  final requestBody = {
    "countFor": "..."
  };
  return fetchCountFromServer(requestBody); //this is an asynchronous function which returns `Future<int>`
}
  1. 在极少数情况下,我们并不关心异步功能的完成
void sendLogoutSignal(){
  http.post(url, {"username" : "id0001"});
}