'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
}
在 bar
和 baz
中我都返回一个 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
的类型是 void
、Null
或 dynamic
。 (而且您甚至不应该这样做,只是为了使现有代码正常工作才允许这样做。)
(=> e
正文始终是允许的,因为人们喜欢将它用作 shorthand 只是 { e; }
,主要是因为格式化程序将它保持在一行。我仍然建议使用 { e; }
作为 void
函数的主体。)
将其推广到具有 void
未来 return 类型的 async
函数,
您不能 return 来自 Future<void> ... async
函数的 实际 值。因此,您唯一可以 return 的是 void
、dynamic
、Null
、Future<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>
我有:
Future<bool> foo() async => true;
这是允许的:
Future<void> bar() {
return foo(); // Works
}
但这不是:
Future<void> baz() async {
return foo(); // Error
}
在 bar
和 baz
中我都返回一个 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
的类型是 void
、Null
或 dynamic
。 (而且您甚至不应该这样做,只是为了使现有代码正常工作才允许这样做。)
(=> e
正文始终是允许的,因为人们喜欢将它用作 shorthand 只是 { e; }
,主要是因为格式化程序将它保持在一行。我仍然建议使用 { e; }
作为 void
函数的主体。)
将其推广到具有 void
未来 return 类型的 async
函数,
您不能 return 来自 Future<void> ... async
函数的 实际 值。因此,您唯一可以 return 的是 void
、dynamic
、Null
、Future<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>