我知道这是一个101的问题,但它完全违背了我的直觉,所以我需要问一下。
假设我做了一个方法:
String read(String key) => return storage.read(key);
现在这不起作用,因为storage.read
是一个异步函数。没有问题:
String read(String key) => return await storage.read(key);
现在,我认为这意味着,等待这个Future
完成,然后返回结果String
。但这不好,因为一旦我使用wait,我也需要使我的函数async
。
String read(String key) async => return await storage.read(key);
好的,但这不起作用,因为async
函数,显然根据定义,返回Future
(或void
(。
Future<String> read(String key) async => return await storage.read(key);
我们开始了。此函数有效。
所以,如果我在调用堆栈中的某个地方使用async
函数,那么它上面的所有东西都必须是async
函数,并返回Future
,是吗?
这违背我直觉的原因是,我想,为什么不让我控制说,";当您使用这个函数时,(在调用堆栈中(将future解析为它的实际值并返回该值"这似乎是不允许的。相反,我们必须将选择权交给调用者自己来解决未来问题。
我是不是遗漏了什么?
现在,我想我从来没有使用过它们,但我听说过Completer
s。Completer
的目的是允许您显式解析Future
,从而可以返回值而不是Future<value>
吗?
不能强制异步代码神奇地同步。您需要在返回树上一直适应这种情况。这就是像FutureBuilder
这样的东西为您所做的:提供一个小部件树,以便在传输真实数据时显示。