返回 void 与返回 Future<void> 有什么区别?

What's the difference between returning void vs returning Future<void>?

returns voidasync 方法和 returns Future<void> 的方法有区别吗?似乎两者在 Dart 中都有效:

void main() async {
    await myVoid();
    await myFutureVoid();
}


void myVoid() async {
    // Do something
}


Future<void> myFutureVoid() async {
    // Do something
}

它们相同吗?

如果是这样,为什么 void 是允许的,而例如 int 是不允许的?编译器说 "Functions marked 'async' must have a return type assignable to 'Future'".

void f()Future<void> f() 不相同。 (async 关键字的存在实际上并不重要。async 关键字主要允许在函数体中使用 await 关键字。)

void f() 声明了一个 return 什么都没有的函数。如果它执行异步工作,那么该工作将是 "fire-and-forget":f 的调用者没有机会等待它完成。

相比之下,Future<void> f() 声明了一个 return 调用者可以等待的 Future 函数(通过使用 await 或注册 Future.then()回调)。异步工作没有 return 值,但调用者可以确定它何时完成。

标有async的函数通常应该return一个Future。如果您有一个函数执行异步工作并产生实际值(例如 int),那么调用者 必须 等待该值被计算后才能被计算用过的。因此该函数必须 return a Future.

作为一个特例,一个async函数可以return void代替Future<void>来表示它是fire-and-forget.