@@ -108,12 +108,20 @@ class TapAndDragGestureRecognizer extends OneSequenceGestureRecognizer with _Con
108
108
///
109
109
/// {@macro flutter.gestures.GestureRecognizer.supportedDevices}
110
110
TapAndDragGestureRecognizer ({
111
+ this .deadline,
111
112
super .debugOwner,
112
113
this .dragStartBehavior = DragStartBehavior .start,
113
114
super .kind,
114
115
super .supportedDevices,
115
116
});
116
117
118
+ /// If non-null, the recognizer will call [didExceedDeadline] after this
119
+ /// amount of time has elapsed since starting to track the primary pointer.
120
+ ///
121
+ /// The [didExceedDeadline] will not be called if the primary pointer is
122
+ /// accepted, rejected, or all pointers are up or canceled before [deadline] .
123
+ final Duration ? deadline;
124
+
117
125
/// {@macro flutter.gestures.monodrag.DragGestureRecognizer.dragStartBehavior}
118
126
DragStartBehavior dragStartBehavior;
119
127
@@ -154,7 +162,10 @@ class TapAndDragGestureRecognizer extends OneSequenceGestureRecognizer with _Con
154
162
155
163
// Tap related state
156
164
PointerUpEvent ? _up;
157
-
165
+ PointerDownEvent ? _down;
166
+ Timer ? _deadlineTimer;
167
+ int ? _primaryPointer;
168
+
158
169
// Drag related state
159
170
OffsetPair ? _correctedPosition;
160
171
late OffsetPair _initialPosition;
@@ -212,6 +223,12 @@ class TapAndDragGestureRecognizer extends OneSequenceGestureRecognizer with _Con
212
223
void addAllowedPointer (PointerDownEvent event) {
213
224
print ('addAllowedPointer $event ${event .pointer }' );
214
225
super .addAllowedPointer (event);
226
+ if (_state == _DragState .ready) {
227
+ _primaryPointer = event.pointer;
228
+ if (deadline != null ) {
229
+ _deadlineTimer = Timer (deadline! , () => _didExceedDeadlineWithEvent (event));
230
+ }
231
+ }
215
232
}
216
233
217
234
@override
@@ -223,6 +240,15 @@ class TapAndDragGestureRecognizer extends OneSequenceGestureRecognizer with _Con
223
240
@override
224
241
void acceptGesture (int pointer) {
225
242
assert (! _acceptedActivePointers.contains (pointer));
243
+ if (pointer == _primaryPointer) {
244
+ print ('is primary pointer' );
245
+ // _checkTapDown(event);
246
+ if (_down != null ) {
247
+ _checkTapDown (_down! );
248
+ // _checkTapUp(_up!);
249
+ }
250
+ _stopDeadlineTimer ();
251
+ }
226
252
_acceptedActivePointers.add (pointer);
227
253
print ('accept gesture $pointer ' );
228
254
}
@@ -251,7 +277,9 @@ class TapAndDragGestureRecognizer extends OneSequenceGestureRecognizer with _Con
251
277
_checkEnd ();
252
278
break ;
253
279
}
280
+ _stopDeadlineTimer ();
254
281
_up = null ;
282
+ _down = null ;
255
283
_initialButtons = null ;
256
284
_state = _DragState .ready;
257
285
_consecutiveTapCountWhileDragging = null ;
@@ -264,7 +292,8 @@ class TapAndDragGestureRecognizer extends OneSequenceGestureRecognizer with _Con
264
292
print ('handle PointerDownEvent $event ' );
265
293
if (_state == _DragState .ready) {
266
294
_globalDistanceMoved = 0.0 ;
267
- _checkTapDown (event);
295
+ _down = event;
296
+ // _checkTapDown(event);
268
297
}
269
298
} else if (event is PointerMoveEvent ) {
270
299
print ('handle PointerMoveEvent $event ' );
@@ -321,6 +350,24 @@ class TapAndDragGestureRecognizer extends OneSequenceGestureRecognizer with _Con
321
350
_giveUpPointer (pointer);
322
351
}
323
352
353
+ void _didExceedDeadlineWithEvent (PointerDownEvent event) {
354
+ print ('did exceed deadline with event $event ' );
355
+ _checkTapDown (event);
356
+ _didExceedDeadline ();
357
+ }
358
+
359
+ void _didExceedDeadline () {
360
+ print ('did exeeed deadline' );
361
+ // _checkTapDown(event);
362
+ }
363
+
364
+ void _stopDeadlineTimer () {
365
+ if (_deadlineTimer != null ) {
366
+ _deadlineTimer! .cancel ();
367
+ _deadlineTimer = null ;
368
+ }
369
+ }
370
+
324
371
void _checkTapDown (PointerDownEvent event) {
325
372
_initialButtons = event.buttons;
326
373
_state = _DragState .possible;
@@ -446,6 +493,7 @@ class TapAndDragGestureRecognizer extends OneSequenceGestureRecognizer with _Con
446
493
447
494
@override
448
495
void dispose () {
496
+ _stopDeadlineTimer ();
449
497
consecutiveTapTimeout ();
450
498
super .dispose ();
451
499
}
0 commit comments