Dart中void异步函数的返回类型

Tim*_*mmm 5 dart

在 Dart 中,如果您有一个不返回任何内容的异步函数,它应该返回Future<void>还是简单地返回void?两者似乎都有效,但为什么呢?

void foo() async {
  print('foo');
}

Future<void> bar() async {
  print('bar');
}

void main() async {
  await foo();
  await bar();
  print('baz');
}
Run Code Online (Sandbox Code Playgroud)

编译时没有错误或警告并打印

foo
bar
baz
Run Code Online (Sandbox Code Playgroud)

Fut*_*eJJ 4

在您的代码中,两个函数foo()bar()都不返回任何内容,因此任何函数返回类型对这两个函数都有效,例如:

void/T/Future<T>... foo() async {
  print('foo');
}

Future<void>/T/Future<T>... bar() async {
  print('bar');
}
Run Code Online (Sandbox Code Playgroud)

和这里,

await foo();
await bar();
Run Code Online (Sandbox Code Playgroud)

await只需等待这些异步函数的执行完成即可。由于没有返回类型,await 在这里没有任何目的(冗余),因此这是也不应该是编译错误。


不同之处在于,它为您提供函数Future<void> 执行的信息bar().then(...),例如执行完成时的信息,并且还允许您使用和指定函数执行时要执行的操作bar().whenComplete(...)

虽然foo()函数返回void并且void不保存任何像Future<void>. 如果您尝试这样做,await bar()它将将该Future对象从转换Future<void>void.


Future只是一个容器,await一旦异步“任务”完成,就会返回值。如果没有awaitFuture对象会向您提供有关它们返回的函数的执行情况的信息。