无法从函数返回“Future<bool>”类型的值,因为它的返回类型为“Future<void>”

iDe*_*ode 5 dart dart-null-safety

我有:

Future<bool> foo() async => true;
Run Code Online (Sandbox Code Playgroud)

这是允许的:

Future<void> bar()  {
  return foo(); // Works
}
Run Code Online (Sandbox Code Playgroud)

但这不是:

Future<void> baz() async {
  return foo(); // Error
}
Run Code Online (Sandbox Code Playgroud)

在两者中barbaz我都返回 a Future<bool>,但为什么第一个有效但第二个失败?


注意:这个问题不是关于如何让它工作,而是关于为什么一个有效而另一个无效。

lrn*_*lrn 2

Dart 对于void返回函数有特殊的规则:不允许返回值,因为它被声明为不返回任何值,因此实际上尝试返回值可能是一个错误。

如果没有:也会发生同样的情况Future

void qux() {
  return true; // Error, can't return value from void function
}
Run Code Online (Sandbox Code Playgroud)

给出错误

A value of type 'bool' can't be returned from the function 'qux' because it has a return type of 'void'.
Run Code Online (Sandbox Code Playgroud)

您可以使用return e;语句,但前提是类型evoid,Nulldynamic。(你甚至不应该这样做,这些只是为了使现有代码工作而被允许。)(总是允许使用主体=> e,因为人们喜欢使用它作为 just 的简写{ e; },主要是因为格式化程序将其保留在一个行。我仍然建议使用{ e; }作为函数体void。)

概括地说,对于async具有未来返回类型的函数void,不允许从函数返回实际Future<void> ... async值。因此,您唯一可以退回的东西是voiddynamicNullFuture<void>Future<dynamic>Future<Null>。AFuture<bool>不是其中任何一个。

你应该写的是:

Future<void> baz() async {
  await foo();
}
Run Code Online (Sandbox Code Playgroud)