由于某些原因,编译器报错了:
SynchronousFuture<void> setNewRoutePath(AppLink newLink) {
_currentLink = newLink;
// return null; // compiler really wants to see this null return...why?
}
但是对这个很满意:
Future<void> setNewRoutePath(AppLink newLink) async {
_currentLink = newLink;
}
似乎async
关键字正在处理这里的隐式返回。
SynchronousFuture
是否有等价的?SynchronousFuture<void> setNewRoutePath(AppLink newLink) { _currentLink = newLink; // return null; // compiler really wants to see this null return...why? }
你需要一个返回值,因为你的函数被声明为返回一个非void
值,所以它必须返回一些。您可以争辩说,如果没有显式的return
语句,则所有函数都可以隐式返回null
,但这很容易出错:
int f(String someValue) {
if (someCondition) {
return 42;
}
} // f didn't return anything if someCondition is false. Accidental or intentional?
Future
本身并不特别。如果你有一个返回Future
的非async
函数,你仍然必须有一个显式的return
语句:
Future<void> f() {
print('Hello world!');
} // Error: f doesn't end with a return statement.
然而,async
关键字做了一些事情:
- 主要允许使用
await
关键字。 - 在
Future
中自动包装返回值。这包括void
函数的隐式返回值。
SynchronousFuture
只是Flutter提供的一个实现Future
接口的普通类。它并不特别。它不是Dart语言的一部分,因此不会有任何关键字像async
关键字那样自动进行返回值包装。
还要注意,在返回SynchronousFuture
的函数中,应该而不是只是点缀return null
语句。对于async
函数,return;
语句(或者在没有显式return
语句的情况下退出函数)最终会向调用者返回Future<void>()
。调用者希望能够在返回的Future
上调用方法(例如.then()
)来添加完成回调。如果您为SynchronousFuture
返回null
,则在运行时调用.then()
将导致空指针异常。相反,您需要使用return SynchronousFuture<void>(null);
。
我还应该指出SynchronousFuture
文档声明:
一般情况下应该避免使用这个类,因为调试这种双峰行为非常困难。
所以除非你有明确的需要使用SynchronousFuture
,否则你最好避免使用它。
除非您已经创建了一个名为SynchronousFuture
的类,否则编译器会报错,因为dart标准库中没有名为SynchronousFuture
的类,因此您或您导入的库必须定义该类。
在dart
中,所有async
函数的返回值必须是Future<T>
类型。
//返回null;//编译器真的想看到这个null返回…为什么?
因为Future
和void
不一样,当你在异步函数中返回一个值时,这个值随后被用作future的值,因为future是一个泛型类。