onTap VoidCallback 处理程序在异步时如何工作(返回 Future<Null>)?
How does onTap VoidCallback handler work when it's an async (returning a Future<Null>)?
我正在尝试推送一条路线,以便在点击该项目时显示 ListView 项目 (onTap
)。 InkWell
的 onTap
属性 定义为 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
函数分配给 FloatingActionButton
的 onPressed
方法...
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
的函数。
我正在尝试推送一条路线,以便在点击该项目时显示 ListView 项目 (onTap
)。 InkWell
的 onTap
属性 定义为 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
函数分配给 FloatingActionButton
的 onPressed
方法...
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
的函数。