From 44cd57f2f265ee65ac9430d4e6f462813563c494 Mon Sep 17 00:00:00 2001 From: Hans Muller Date: Thu, 3 Mar 2016 11:03:41 -0800 Subject: [PATCH] Add DismissDirection onDismissed() callback parameter --- examples/widgets/card_collection.dart | 2 +- packages/flutter/lib/src/widgets/dismissable.dart | 14 +++++++++++--- packages/flutter/test/widget/dismissable_test.dart | 12 ++++++++++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/examples/widgets/card_collection.dart b/examples/widgets/card_collection.dart index 5d2ffe70c82..2cf75db4457 100644 --- a/examples/widgets/card_collection.dart +++ b/examples/widgets/card_collection.dart @@ -298,7 +298,7 @@ class CardCollectionState extends State { Widget card = new Dismissable( direction: _dismissDirection, onResized: () { _invalidator([index]); }, - onDismissed: () { dismissCard(cardModel); }, + onDismissed: (DismissDirection direction) { dismissCard(cardModel); }, child: new Card( color: _primaryColor[cardModel.color], child: new Container( diff --git a/packages/flutter/lib/src/widgets/dismissable.dart b/packages/flutter/lib/src/widgets/dismissable.dart index 16b4117fedd..05158c551f7 100644 --- a/packages/flutter/lib/src/widgets/dismissable.dart +++ b/packages/flutter/lib/src/widgets/dismissable.dart @@ -15,6 +15,8 @@ const double _kMinFlingVelocityDelta = 400.0; const double _kFlingVelocityScale = 1.0 / 300.0; const double _kDismissCardThreshold = 0.4; +typedef void DismissDirectionCallback(DismissDirection direction); + /// The direction in which a [Dismissable] can be dismissed. enum DismissDirection { /// The [Dismissable] can be dismissed by dragging either up or down. @@ -57,7 +59,7 @@ class Dismissable extends StatefulComponent { final VoidCallback onResized; /// Called when the widget has been dismissed, after finishing resizing. - final VoidCallback onDismissed; + final DismissDirectionCallback onDismissed; /// The direction in which the widget can be dismissed. final DismissDirection direction; @@ -232,8 +234,14 @@ class _DismissableState extends State { void _handleResizeProgressChanged() { if (_resizeController.isCompleted) { - if (config.onDismissed != null) - config.onDismissed(); + if (config.onDismissed != null) { + DismissDirection direction; + if (_directionIsXAxis) + direction = _dragExtent > 0 ? DismissDirection.right : DismissDirection.left; + else + direction = _dragExtent > 0 ? DismissDirection.down : DismissDirection.up; + config.onDismissed(direction); + } } else { if (config.onResized != null) config.onResized(); diff --git a/packages/flutter/test/widget/dismissable_test.dart b/packages/flutter/test/widget/dismissable_test.dart index 5d43ad8f54a..9f539933530 100644 --- a/packages/flutter/test/widget/dismissable_test.dart +++ b/packages/flutter/test/widget/dismissable_test.dart @@ -10,13 +10,15 @@ import 'package:test/test.dart'; const double itemExtent = 100.0; Axis scrollDirection = Axis.vertical; DismissDirection dismissDirection = DismissDirection.horizontal; +DismissDirection reportedDismissDirection; List dismissedItems = []; void handleOnResized(int item) { expect(dismissedItems.contains(item), isFalse); } -void handleOnDismissed(int item) { +void handleOnDismissed(DismissDirection direction, int item) { + reportedDismissDirection = direction; expect(dismissedItems.contains(item), isFalse); dismissedItems.add(item); } @@ -25,7 +27,7 @@ Widget buildDismissableItem(int item) { return new Dismissable( key: new ValueKey(item), direction: dismissDirection, - onDismissed: () { handleOnDismissed(item); }, + onDismissed: (DismissDirection direction) { handleOnDismissed(direction, item); }, onResized: () { handleOnResized(item); }, child: new Container( width: itemExtent, @@ -129,10 +131,12 @@ void main() { dismissItem(tester, 0, gestureDirection: DismissDirection.right); expect(tester.findText('0'), isNull); expect(dismissedItems, equals([0])); + expect(reportedDismissDirection, DismissDirection.right); dismissItem(tester, 1, gestureDirection: DismissDirection.left); expect(tester.findText('1'), isNull); expect(dismissedItems, equals([0, 1])); + expect(reportedDismissDirection, DismissDirection.left); }); }); @@ -148,10 +152,12 @@ void main() { dismissItem(tester, 0, gestureDirection: DismissDirection.up); expect(tester.findText('0'), isNull); expect(dismissedItems, equals([0])); + expect(reportedDismissDirection, DismissDirection.up); dismissItem(tester, 1, gestureDirection: DismissDirection.down); expect(tester.findText('1'), isNull); expect(dismissedItems, equals([0, 1])); + expect(reportedDismissDirection, DismissDirection.down); }); }); @@ -167,10 +173,12 @@ void main() { dismissItem(tester, 0, gestureDirection: DismissDirection.right); expect(tester.findText('0'), isNotNull); expect(dismissedItems, isEmpty); + dismissItem(tester, 1, gestureDirection: DismissDirection.right); dismissItem(tester, 0, gestureDirection: DismissDirection.left); expect(tester.findText('0'), isNull); expect(dismissedItems, equals([0])); + dismissItem(tester, 1, gestureDirection: DismissDirection.left); }); });