是否存在与' async '等效的SynchronousFuture ?



由于某些原因,编译器报错了:

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返回…为什么?

因为Futurevoid不一样,当你在异步函数中返回一个值时,这个值随后被用作future的值,因为future是一个泛型类。

相关内容

  • 没有找到相关文章

最新更新