'Future<bool>' 类型的值无法从函数中 return 编辑,因为它的 return 类型为 'Future<void>'

A value of type 'Future<bool>' can't be returned from the function because it has a return type of 'Future<void>'

我有:

Future<bool> foo() async => true;

这是允许的:

Future<void> bar()  {
  return foo(); // Works
}

但这不是:

Future<void> baz() async {
  return foo(); // Error
}

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


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

正如我在 运行 相同代码时所观察到的

Future<bool> foo() async => true;

Future<void> bar() {
  return foo(); // Works
}

Future<void> baz() async {
  // return foo(); // Error
}

void main() {
  print("direct =====${foo()}");
  print("bar==========${bar()}");
  print("bazz========${baz()}");
}

响应是

direct =====Instance of '_Future<bool>'
bar==========Instance of '_Future<bool>'
bazz========Instance of '_Future<void>'

这表示当 async 关键字不存在时,它采用 return 类型的 returning 值。

但是对于 bazz 函数,它提供了一个快速修复函数的方法

Future<Future<bool>>

所以当添加async时函数return类型作为主要类型

Dart 对 void return 函数有特殊规则:你不能 return 一个值 因为 它被声明为 not return 任何值,所以实际上尝试 return 一个值可能是一个错误。

没有Future也是一样:

void qux() {
  return true; // Error, can't return value from void function
}

报错

A value of type 'bool' can't be returned from the function 'qux' because it has a return type of 'void'.

您可以有 return e; 语句,但前提是 e 的类型是 voidNulldynamic。 (而且您甚至不应该这样做,只是为了使现有代码正常工作才允许这样做。) (=> e 正文始终是允许的,因为人们喜欢将它用作 shorthand 只是 { e; },主要是因为格式化程序将它保持在一行。我仍然建议使用 { e; } 作为 void 函数的主体。)

将其推广到具有 void 未来 return 类型的 async 函数, 您不能 return 来自 Future<void> ... async 函数的 实际 值。因此,您唯一可以 return 的是 voiddynamicNullFuture<void>Future<dynamic>Future<Null>. Future<bool> 两者都不是。

你应该写的是:

Future<void> baz() async {
  await foo();
}
Future<bool> foo() async => true;

第一个案例

Future<void> bar()  {
  return foo(); // Works
}

对于上面的代码,Future<void> bar()的return可以returnfoo(),因为bar()不是return直接取值foo(),所以 bar() 可以毫无问题地处理 foo()

但是,在第二种情况下:

Future<void> baz() async {
  return foo(); // Error
}

上面的代码是return直接是foo()的泛型,因为baz()的函数包含了async标签,所以用baz() as Future<void>,也就是我们知道的 foo() as Future<bool>