onTap VoidCallback 处理程序在异步时如何工作(返回 Future<Null>)?

How does onTap VoidCallback handler work when it's an async (returning a Future<Null>)?

我正在尝试推送一条路线,以便在点击该项目时显示 ListView 项目 (onTap)。 InkWellonTap 属性 定义为 VoidCallback。但是,我希望能够从回调中收到一个 return 值,指示用户是否修改了打开的对话框中的所述项目。

根据 Shrine 演示(flutter_gallery 示例中的 shrine_home.dart),将 Future<Null> async 函数分配给 onTap 似乎没问题:

  Future<Null> _showOrderPage(Product product) async {
    final Order order = _shoppingCart[product] ?? new Order(product: product);
    final Order completedOrder = await Navigator.push(context, new ShrineOrderRoute(
      order: order,
      builder: (BuildContext context) {
        return new OrderPage(
          order: order,
          products: _products,
          shoppingCart: _shoppingCart,
        );
      }
    ));
    assert(completedOrder.product != null);
    if (completedOrder.quantity == 0)
      _shoppingCart.remove(completedOrder.product);
  }

为什么以及如何运作?谢谢。

糟糕。刚刚意识到分配实际上是通过 lambda,它是 VoidCallback:

onPressed: () { _showOrderPage(product); }

仍然 - 它似乎在另一个地方为我工作,在那里我将 Future<Null> async 函数分配给 FloatingActionButtononPressed 方法...

Dart 允许您将具有非 void return 值的函数用作具有 void return 值的函数。该函数仍将 return 正常值,但分析器会推断它们是 void 类型,并且如果您尝试使用它们会报错,除非您将它们转换回其他类型。

typedef void VoidCallback();
typedef int IntCallback();

final IntCallback i = () => 42;

void main() {
  final VoidCallback v = i;
  print("${v()}");        // prints 42
  print(v() as int);      // also prints 42
  print(v().toString());  // also prints 42, but analyzer complains:
                          // method 'toString' isn't defined for class 'void'
}

这就是为什么您可以使用 return 作为 Future<Null> 作为 VoidCallback 的函数。