From 891a218002a36aede2acc3f5a68dad7bfc0d0b32 Mon Sep 17 00:00:00 2001 From: Pascal Welsch Date: Thu, 23 Nov 2017 00:18:28 +0100 Subject: [PATCH] Add missing onDragCompleted to LongPressDraggable (#13119) * Add missing onDragCompleted to LongPressDraggable * Add test for LongPressDraggable onDragStarted and onDragCompleted --- .../flutter/lib/src/widgets/drag_target.dart | 6 +- .../flutter/test/widgets/draggable_test.dart | 104 ++++++++++++++++++ 2 files changed, 108 insertions(+), 2 deletions(-) diff --git a/packages/flutter/lib/src/widgets/drag_target.dart b/packages/flutter/lib/src/widgets/drag_target.dart index 711c0eb37e..91e143681b 100644 --- a/packages/flutter/lib/src/widgets/drag_target.dart +++ b/packages/flutter/lib/src/widgets/drag_target.dart @@ -228,7 +228,8 @@ class LongPressDraggable extends Draggable { DragAnchor dragAnchor: DragAnchor.child, int maxSimultaneousDrags, VoidCallback onDragStarted, - DraggableCanceledCallback onDraggableCanceled + DraggableCanceledCallback onDraggableCanceled, + VoidCallback onDragCompleted }) : super( key: key, child: child, @@ -239,7 +240,8 @@ class LongPressDraggable extends Draggable { dragAnchor: dragAnchor, maxSimultaneousDrags: maxSimultaneousDrags, onDragStarted: onDragStarted, - onDraggableCanceled: onDraggableCanceled + onDraggableCanceled: onDraggableCanceled, + onDragCompleted: onDragCompleted ); @override diff --git a/packages/flutter/test/widgets/draggable_test.dart b/packages/flutter/test/widgets/draggable_test.dart index b521479c64..7103741c50 100644 --- a/packages/flutter/test/widgets/draggable_test.dart +++ b/packages/flutter/test/widgets/draggable_test.dart @@ -4,6 +4,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/gestures.dart'; void main() { testWidgets('Drag and drop - control test', (WidgetTester tester) async { @@ -1333,6 +1334,109 @@ void main() { expect(events, equals(['tap'])); }); + testWidgets('long-press draggable calls onDragCompleted called if dropped on accepting target', (WidgetTester tester) async { + final List accepted = []; + bool onDragCompletedCalled = false; + + await tester.pumpWidget(new MaterialApp( + home: new Column( + children: [ + new LongPressDraggable( + data: 1, + child: const Text('Source'), + feedback: const Text('Dragging'), + onDragCompleted: () { + onDragCompletedCalled = true; + }, + ), + new DragTarget( + builder: (BuildContext context, List data, List rejects) { + return new Container(height: 100.0, child: const Text('Target')); + }, + onAccept: accepted.add, + ), + ], + ), + )); + + expect(accepted, isEmpty); + expect(find.text('Source'), findsOneWidget); + expect(find.text('Dragging'), findsNothing); + expect(find.text('Target'), findsOneWidget); + expect(onDragCompletedCalled, isFalse); + + final Offset firstLocation = tester.getCenter(find.text('Source')); + final TestGesture gesture = await tester.startGesture(firstLocation, pointer: 7); + await tester.pump(); + + expect(accepted, isEmpty); + expect(find.text('Source'), findsOneWidget); + expect(find.text('Dragging'), findsNothing); + expect(find.text('Target'), findsOneWidget); + expect(onDragCompletedCalled, isFalse); + + await tester.pump(kLongPressTimeout); + + expect(accepted, isEmpty); + expect(find.text('Source'), findsOneWidget); + expect(find.text('Dragging'), findsOneWidget); + expect(find.text('Target'), findsOneWidget); + expect(onDragCompletedCalled, isFalse); + + + final Offset secondLocation = tester.getCenter(find.text('Target')); + await gesture.moveTo(secondLocation); + await tester.pump(); + + expect(accepted, isEmpty); + expect(find.text('Source'), findsOneWidget); + expect(find.text('Dragging'), findsOneWidget); + expect(find.text('Target'), findsOneWidget); + expect(onDragCompletedCalled, isFalse); + + await gesture.up(); + await tester.pump(); + + expect(accepted, equals([1])); + expect(find.text('Source'), findsOneWidget); + expect(find.text('Dragging'), findsNothing); + expect(find.text('Target'), findsOneWidget); + expect(onDragCompletedCalled, isTrue); + }); + + testWidgets('long-press draggable calls onDragStartedCalled after long press', (WidgetTester tester) async { + bool onDragStartedCalled = false; + + await tester.pumpWidget(new MaterialApp( + home: new LongPressDraggable( + data: 1, + child: const Text('Source'), + feedback: const Text('Dragging'), + onDragStarted: () { + onDragStartedCalled = true; + }, + ), + )); + + expect(find.text('Source'), findsOneWidget); + expect(find.text('Dragging'), findsNothing); + expect(onDragStartedCalled, isFalse); + + final Offset firstLocation = tester.getCenter(find.text('Source')); + await tester.startGesture(firstLocation, pointer: 7); + await tester.pump(); + + expect(find.text('Source'), findsOneWidget); + expect(find.text('Dragging'), findsNothing); + expect(onDragStartedCalled, isFalse); + + await tester.pump(kLongPressTimeout); + + expect(find.text('Source'), findsOneWidget); + expect(find.text('Dragging'), findsOneWidget); + expect(onDragStartedCalled, isTrue); + }); + testWidgets('Drag feedback with child anchor positions correctly', (WidgetTester tester) async { await _testChildAnchorFeedbackPosition(tester: tester); });