Dart-区分同步和异步void回调

问题描述

假设我们有以下方法

Future<String> foo(void callback()) async{
    ...
    callback();
    ...
}

然后,回调在定义时允许同步或异步。如果异步,有没有一种干净的方法等待?现在,如果我在这里等待,我会从IDE收到此警告:

'await'适用于'void',而不是'Future'

解决方法

不能。使async函数返回void而不是Future<void>的全部目的是使该函数“即弃即发”,并且调用方不能等待它完成。

如果要允许您的foo函数将异步函数用作参数,则其参数应改为Future<void> Function()。这样,调用者可以轻松地使用异步包装器来适应同步功能。 (不可能相反。)

或者,您可以使callback参数返回FutureOr<void>

Future<String> foo(FutureOr<void> Function callback) async {
    ...
    await callback();
    ...
}

或者如果await是同步的,并且不想使用不必要的callback

Future<String> foo(FutureOr<void> Function callback) async {
    ...
    if (callback is Future<void> Function) {
      await callback();
    } else {
      callback();
    }
    ...
}