【问题标题】:How to Know If a Function passed as a parameter is async in Flutter and Wait for it?如何知道作为参数传递的函数在 Flutter 中是否是异步的并等待它?
【发布时间】:2021-10-09 09:51:39
【问题描述】:

所以我的问题将与this javascript question 重复,但我的问题是关于 Flutter:我有一个方法(它是 Bloc 类的方法 add,所以我不能等待它,我需要发送回调代替) 将Function 作为参数,以便在工作完成时执行它。

void myMethod(Function onDone) async {
  onDone();//how to know if I should write this?
  await onDone();//or this?
}

我怎么知道我什么时候想执行这个Function参数是同步还是异步,即我应该写await onDone()还是onDone()

【问题讨论】:

    标签: flutter dart async-await


    【解决方案1】:

    您可以等待非异步函数。如果 Dart linter 可以确定等待的函数不是异步的,它将发出警告,但这只是一个警告。您可以在 DartPad 中运行以下代码:callbackOne 是异步的,callbackTwo 不是。

    void main() async {
      String cb1 = await callbackOne();
      String cb2 = await callbackTwo(); //Warning here
      print("cb1=$cb1 cb2=$cb2");
      await functionWithCallback(callbackOne);
      await functionWithCallback(callbackTwo);
    }
    
    Future<void> functionWithCallback(Function callback) async {
      String foo = await callback();
      print("Callback returned $foo");
    }
    
    Future<String> callbackOne() async {
      await Future.delayed(Duration(seconds: 1));
      return "One";
    }
    
    String callbackTwo() {
      return "Two";
    }
    

    输出:

    cb1=One cb2=Two
    Callback returned One
    Callback returned Two
    

    【讨论】:

    • 我不知道 dart pad 的 linter 规则,但是在 android studio 中看起来 linter 被配置为给出错误,这就是为什么我认为我不能这样做,实际上如果我在 Function 类型的变量上调用 await,代码甚至无法编译
    • FWIW - 刚刚在 Linux 上使用“Flutter 2.5.1 中的 Dart”和 dart cli 在 vscode 中进行了测试 -> vscode linter 实际上并没有发出警告,代码运行时没有任何错误。
    【解决方案2】:

    所以事实证明,在我的情况下,不需要知道它是否是异步的。 Future 类具有构造函数 Future.value,它获取调用回调的结果,如果它是异步的(即如果 onDone() 返回 Future),则自动等待它。

    来自其文档:

    如果 value 是一个未来,则创建的未来会等待价值未来 完成,然后以相同的结果完成

    可以用作:await Future.value(onDone());

    因此,总而言之,我将始终使用await 进行回调,但这将解决onDone 是同步回调还是异步回调两种情况下的问题

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 2021-08-21
      • 1970-01-01
      • 2020-02-19
      • 2022-01-25
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      相关资源
      最近更新 更多