Dart:如何 return 未来 <void>

Dart: How to return Future<void>

我怎样才能returnFuture<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(...));
   }

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

您不需要手动 return 任何东西,因为 async 函数只会在函数实际完成时 return,但这取决于 how/if您等待在此函数中执行的调用。

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

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

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

当使用 Future<void> 时,不需要明确地 return 任何东西,因为 void 什么都不是,顾名思义。

还要确保使用 await.

调用 deleteAllwriteAsString()

注意:要等待所有 delete/foreach 调用完成,请参阅下面的答案了解更多详细信息。简而言之,您需要将所有 delete 调用放入 Future.wait 中。

你不能用 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关键字:

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

那么什么时候使用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"});
}