在 Flutter 或 Dart 中同步运行 Future

问题描述 投票:0回答:2

我对飞镖和扑扑有点陌生。 我想知道如何同步运行 Future? 有可能吗?

flutter dart
2个回答
2
投票

不,这是不可能的。如果是,那么您将能够冻结 UI 线程,直到 Future 完成。


0
投票

总的来说,答案是 NO

但是,有两点我想补充一下

  1. 这是可行的,但在
    dart:cli
    库中使用
    waitFor
    关键字,但现在已被 flutter 团队删除。

欲了解更多信息,请查看此已关闭 问题

此外,还有另一个开放问题请求此功能,但以不同的方式Issue您可以订阅它以获取将来的任何进一步更新。

  1. 在某些情况下,您可以使用
    SynchronousFuture
    将期货作为同步处理。

例如,当你有一些函数必须返回数据本地存储,但它有一个缓存层,如果你之前已经获取了该数据,那么它将存储在内存中

Future<String> getData(String key)async{
  if(_cache[key] != null) return _cache[key];

  return await _localStorage.load(key);
}

并像这样在 main 中获取数据

void main() async {
  final output = await getData('myKey');
  print(output);
}

但是而不是等待这两种情况(本地存储和缓存),而缓存就存在于内存中并且不需要等待它

我们可以使用

SynchronousFuture
来做类似的事情! 🎉

首先,删除

async
关键字并开始使用
SynchronousFuture

Future<String> getData(String key){
  if(_cache[key] != null) return SynchronousFuture(_cache[key]);

  return _localStorage.load(key);
}

接下来,以你见过的最奇怪的语法使用这个 Future 方法 😂 (但是相信我,它会起作用的😂🙏)!

void main() async {
  String? output;

  final myFuture = getData('myKey');
  myFuture.then((data) => output = data);
  
  // Yes I know we are trying to receive the data on then before awaiting to the future!
  if(output != null) 
    print(output);
  else 
    print(await myFuture);
}

这仅适用于

SynchronousFuture
,这使得事件循环在移至当前方法中的下一行之前运行
then
回调。

© www.soinside.com 2019 - 2024. All rights reserved.