Commit 4b1a9ff1 authored by Adam Barth's avatar Adam Barth

Remove PointerRouter and GestureArena arguments

There's no reason to make clients supply a PointerRounter and a
GestureArena when constructing gesture recognizers. These objects are
statics and the gesture recognizers can just grab them directly.

Also, remove the callback constructor arguments. Almost no code used
them. Instead, people seem to prefer using the `..` operator to set
callbacks on the recognizers. Removing the arguments removes a bunch of
boilerplate.
parent 9d4e0e85
...@@ -32,17 +32,6 @@ bool _isFlingGesture(Velocity velocity) { ...@@ -32,17 +32,6 @@ bool _isFlingGesture(Velocity velocity) {
} }
abstract class _DragGestureRecognizer<T extends dynamic> extends OneSequenceGestureRecognizer { abstract class _DragGestureRecognizer<T extends dynamic> extends OneSequenceGestureRecognizer {
_DragGestureRecognizer({
PointerRouter router,
GestureArena gestureArena,
this.onStart,
this.onUpdate,
this.onEnd
}) : super(
router: router,
gestureArena: gestureArena
);
GestureDragStartCallback onStart; GestureDragStartCallback onStart;
_GesturePolymorphicUpdateCallback<T> onUpdate; _GesturePolymorphicUpdateCallback<T> onUpdate;
GestureDragEndCallback onEnd; GestureDragEndCallback onEnd;
...@@ -126,20 +115,6 @@ abstract class _DragGestureRecognizer<T extends dynamic> extends OneSequenceGest ...@@ -126,20 +115,6 @@ abstract class _DragGestureRecognizer<T extends dynamic> extends OneSequenceGest
} }
class VerticalDragGestureRecognizer extends _DragGestureRecognizer<double> { class VerticalDragGestureRecognizer extends _DragGestureRecognizer<double> {
VerticalDragGestureRecognizer({
PointerRouter router,
GestureArena gestureArena,
GestureDragStartCallback onStart,
GestureDragUpdateCallback onUpdate,
GestureDragEndCallback onEnd
}) : super(
router: router,
gestureArena: gestureArena,
onStart: onStart,
onUpdate: onUpdate,
onEnd: onEnd
);
double get _initialPendingDragDelta => 0.0; double get _initialPendingDragDelta => 0.0;
double _getDragDelta(PointerEvent event) => event.delta.dy; double _getDragDelta(PointerEvent event) => event.delta.dy;
bool get _hasSufficientPendingDragDeltaToAccept => _pendingDragDelta.abs() > kTouchSlop; bool get _hasSufficientPendingDragDeltaToAccept => _pendingDragDelta.abs() > kTouchSlop;
...@@ -148,20 +123,6 @@ class VerticalDragGestureRecognizer extends _DragGestureRecognizer<double> { ...@@ -148,20 +123,6 @@ class VerticalDragGestureRecognizer extends _DragGestureRecognizer<double> {
} }
class HorizontalDragGestureRecognizer extends _DragGestureRecognizer<double> { class HorizontalDragGestureRecognizer extends _DragGestureRecognizer<double> {
HorizontalDragGestureRecognizer({
PointerRouter router,
GestureArena gestureArena,
GestureDragStartCallback onStart,
GestureDragUpdateCallback onUpdate,
GestureDragEndCallback onEnd
}) : super(
router: router,
gestureArena: gestureArena,
onStart: onStart,
onUpdate: onUpdate,
onEnd: onEnd
);
double get _initialPendingDragDelta => 0.0; double get _initialPendingDragDelta => 0.0;
double _getDragDelta(PointerEvent event) => event.delta.dx; double _getDragDelta(PointerEvent event) => event.delta.dx;
bool get _hasSufficientPendingDragDeltaToAccept => _pendingDragDelta.abs() > kTouchSlop; bool get _hasSufficientPendingDragDeltaToAccept => _pendingDragDelta.abs() > kTouchSlop;
...@@ -170,20 +131,6 @@ class HorizontalDragGestureRecognizer extends _DragGestureRecognizer<double> { ...@@ -170,20 +131,6 @@ class HorizontalDragGestureRecognizer extends _DragGestureRecognizer<double> {
} }
class PanGestureRecognizer extends _DragGestureRecognizer<Offset> { class PanGestureRecognizer extends _DragGestureRecognizer<Offset> {
PanGestureRecognizer({
PointerRouter router,
GestureArena gestureArena,
GesturePanStartCallback onStart,
GesturePanUpdateCallback onUpdate,
GesturePanEndCallback onEnd
}) : super(
router: router,
gestureArena: gestureArena,
onStart: onStart,
onUpdate: onUpdate,
onEnd: onEnd
);
Offset get _initialPendingDragDelta => Offset.zero; Offset get _initialPendingDragDelta => Offset.zero;
Offset _getDragDelta(PointerEvent event) => event.delta; Offset _getDragDelta(PointerEvent event) => event.delta;
bool get _hasSufficientPendingDragDeltaToAccept { bool get _hasSufficientPendingDragDeltaToAccept {
......
...@@ -5,22 +5,13 @@ ...@@ -5,22 +5,13 @@
import 'arena.dart'; import 'arena.dart';
import 'constants.dart'; import 'constants.dart';
import 'events.dart'; import 'events.dart';
import 'pointer_router.dart';
import 'recognizer.dart'; import 'recognizer.dart';
typedef void GestureLongPressCallback(); typedef void GestureLongPressCallback();
/// The user has pressed down at this location for a long period of time. /// The user has pressed down at this location for a long period of time.
class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer { class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
LongPressGestureRecognizer({ LongPressGestureRecognizer() : super(deadline: kLongPressTimeout);
PointerRouter router,
GestureArena gestureArena,
this.onLongPress
}) : super(
router: router,
gestureArena: gestureArena,
deadline: kLongPressTimeout
);
GestureLongPressCallback onLongPress; GestureLongPressCallback onLongPress;
......
...@@ -6,9 +6,9 @@ import 'dart:async'; ...@@ -6,9 +6,9 @@ import 'dart:async';
import 'dart:ui' show Point, Offset; import 'dart:ui' show Point, Offset;
import 'arena.dart'; import 'arena.dart';
import 'binding.dart';
import 'constants.dart'; import 'constants.dart';
import 'events.dart'; import 'events.dart';
import 'pointer_router.dart';
import 'recognizer.dart'; import 'recognizer.dart';
import 'velocity_tracker.dart'; import 'velocity_tracker.dart';
...@@ -121,18 +121,6 @@ abstract class MultiDragPointerState { ...@@ -121,18 +121,6 @@ abstract class MultiDragPointerState {
} }
abstract class MultiDragGestureRecognizer<T extends MultiDragPointerState> extends GestureRecognizer { abstract class MultiDragGestureRecognizer<T extends MultiDragPointerState> extends GestureRecognizer {
MultiDragGestureRecognizer({
PointerRouter pointerRouter,
GestureArena gestureArena,
this.onStart
}) : _pointerRouter = pointerRouter, _gestureArena = gestureArena {
assert(pointerRouter != null);
assert(gestureArena != null);
}
final PointerRouter _pointerRouter;
final GestureArena _gestureArena;
GestureMultiDragStartCallback onStart; GestureMultiDragStartCallback onStart;
Map<int, T> _pointers = <int, T>{}; Map<int, T> _pointers = <int, T>{};
...@@ -144,8 +132,8 @@ abstract class MultiDragGestureRecognizer<T extends MultiDragPointerState> exten ...@@ -144,8 +132,8 @@ abstract class MultiDragGestureRecognizer<T extends MultiDragPointerState> exten
assert(!_pointers.containsKey(event.pointer)); assert(!_pointers.containsKey(event.pointer));
T state = createNewPointerState(event); T state = createNewPointerState(event);
_pointers[event.pointer] = state; _pointers[event.pointer] = state;
_pointerRouter.addRoute(event.pointer, handleEvent); Gesturer.instance.pointerRouter.addRoute(event.pointer, handleEvent);
state._setArenaEntry(_gestureArena.add(event.pointer, this)); state._setArenaEntry(Gesturer.instance.gestureArena.add(event.pointer, this));
} }
T createNewPointerState(PointerDownEvent event); T createNewPointerState(PointerDownEvent event);
...@@ -211,7 +199,7 @@ abstract class MultiDragGestureRecognizer<T extends MultiDragPointerState> exten ...@@ -211,7 +199,7 @@ abstract class MultiDragGestureRecognizer<T extends MultiDragPointerState> exten
void _removeState(int pointer) { void _removeState(int pointer) {
assert(_pointers != null); assert(_pointers != null);
assert(_pointers.containsKey(pointer)); assert(_pointers.containsKey(pointer));
_pointerRouter.removeRoute(pointer, handleEvent); Gesturer.instance.pointerRouter.removeRoute(pointer, handleEvent);
_pointers[pointer].dispose(); _pointers[pointer].dispose();
_pointers.remove(pointer); _pointers.remove(pointer);
} }
...@@ -241,12 +229,6 @@ class _ImmediatePointerState extends MultiDragPointerState { ...@@ -241,12 +229,6 @@ class _ImmediatePointerState extends MultiDragPointerState {
} }
class ImmediateMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_ImmediatePointerState> { class ImmediateMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_ImmediatePointerState> {
ImmediateMultiDragGestureRecognizer({
PointerRouter pointerRouter,
GestureArena gestureArena,
GestureMultiDragStartCallback onStart
}) : super(pointerRouter: pointerRouter, gestureArena: gestureArena, onStart: onStart);
_ImmediatePointerState createNewPointerState(PointerDownEvent event) { _ImmediatePointerState createNewPointerState(PointerDownEvent event) {
return new _ImmediatePointerState(event.position); return new _ImmediatePointerState(event.position);
} }
...@@ -270,12 +252,6 @@ class _HorizontalPointerState extends MultiDragPointerState { ...@@ -270,12 +252,6 @@ class _HorizontalPointerState extends MultiDragPointerState {
} }
class HorizontalMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_HorizontalPointerState> { class HorizontalMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_HorizontalPointerState> {
HorizontalMultiDragGestureRecognizer({
PointerRouter pointerRouter,
GestureArena gestureArena,
GestureMultiDragStartCallback onStart
}) : super(pointerRouter: pointerRouter, gestureArena: gestureArena, onStart: onStart);
_HorizontalPointerState createNewPointerState(PointerDownEvent event) { _HorizontalPointerState createNewPointerState(PointerDownEvent event) {
return new _HorizontalPointerState(event.position); return new _HorizontalPointerState(event.position);
} }
...@@ -299,12 +275,6 @@ class _VerticalPointerState extends MultiDragPointerState { ...@@ -299,12 +275,6 @@ class _VerticalPointerState extends MultiDragPointerState {
} }
class VerticalMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_VerticalPointerState> { class VerticalMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_VerticalPointerState> {
VerticalMultiDragGestureRecognizer({
PointerRouter pointerRouter,
GestureArena gestureArena,
GestureMultiDragStartCallback onStart
}) : super(pointerRouter: pointerRouter, gestureArena: gestureArena, onStart: onStart);
_VerticalPointerState createNewPointerState(PointerDownEvent event) { _VerticalPointerState createNewPointerState(PointerDownEvent event) {
return new _VerticalPointerState(event.position); return new _VerticalPointerState(event.position);
} }
...@@ -360,12 +330,8 @@ class _DelayedPointerState extends MultiDragPointerState { ...@@ -360,12 +330,8 @@ class _DelayedPointerState extends MultiDragPointerState {
class DelayedMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_DelayedPointerState> { class DelayedMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_DelayedPointerState> {
DelayedMultiDragGestureRecognizer({ DelayedMultiDragGestureRecognizer({
PointerRouter pointerRouter,
GestureArena gestureArena,
GestureMultiDragStartCallback onStart,
Duration delay: kLongPressTimeout Duration delay: kLongPressTimeout
}) : _delay = delay, }) : _delay = delay {
super(pointerRouter: pointerRouter, gestureArena: gestureArena, onStart: onStart) {
assert(delay != null); assert(delay != null);
} }
......
...@@ -6,6 +6,7 @@ import 'dart:async'; ...@@ -6,6 +6,7 @@ import 'dart:async';
import 'dart:ui' show Point, Offset; import 'dart:ui' show Point, Offset;
import 'arena.dart'; import 'arena.dart';
import 'binding.dart';
import 'constants.dart'; import 'constants.dart';
import 'events.dart'; import 'events.dart';
import 'pointer_router.dart'; import 'pointer_router.dart';
...@@ -32,17 +33,17 @@ class _TapTracker { ...@@ -32,17 +33,17 @@ class _TapTracker {
bool _isTrackingPointer = false; bool _isTrackingPointer = false;
void startTrackingPointer(PointerRouter router, PointerRoute route) { void startTrackingPointer(PointerRoute route) {
if (!_isTrackingPointer) { if (!_isTrackingPointer) {
_isTrackingPointer = true; _isTrackingPointer = true;
router.addRoute(pointer, route); Gesturer.instance.pointerRouter.addRoute(pointer, route);
} }
} }
void stopTrackingPointer(PointerRouter router, PointerRoute route) { void stopTrackingPointer(PointerRoute route) {
if (_isTrackingPointer) { if (_isTrackingPointer) {
_isTrackingPointer = false; _isTrackingPointer = false;
router.removeRoute(pointer, route); Gesturer.instance.pointerRouter.removeRoute(pointer, route);
} }
} }
...@@ -55,17 +56,6 @@ class _TapTracker { ...@@ -55,17 +56,6 @@ class _TapTracker {
class DoubleTapGestureRecognizer extends GestureRecognizer { class DoubleTapGestureRecognizer extends GestureRecognizer {
DoubleTapGestureRecognizer({
PointerRouter router,
GestureArena gestureArena,
this.onDoubleTap
}) : _router = router,
_gestureArena = gestureArena {
assert(router != null);
assert(gestureArena != null);
}
// Implementation notes: // Implementation notes:
// The double tap recognizer can be in one of four states. There's no // The double tap recognizer can be in one of four states. There's no
// explicit enum for the states, because they are already captured by // explicit enum for the states, because they are already captured by
...@@ -86,8 +76,6 @@ class DoubleTapGestureRecognizer extends GestureRecognizer { ...@@ -86,8 +76,6 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
// - The long timer between taps expires // - The long timer between taps expires
// - The gesture arena decides we have been rejected wholesale // - The gesture arena decides we have been rejected wholesale
PointerRouter _router;
GestureArena _gestureArena;
GestureDoubleTapCallback onDoubleTap; GestureDoubleTapCallback onDoubleTap;
Timer _doubleTapTimer; Timer _doubleTapTimer;
...@@ -102,10 +90,10 @@ class DoubleTapGestureRecognizer extends GestureRecognizer { ...@@ -102,10 +90,10 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
_stopDoubleTapTimer(); _stopDoubleTapTimer();
_TapTracker tracker = new _TapTracker( _TapTracker tracker = new _TapTracker(
event: event, event: event,
entry: _gestureArena.add(event.pointer, this) entry: Gesturer.instance.gestureArena.add(event.pointer, this)
); );
_trackers[event.pointer] = tracker; _trackers[event.pointer] = tracker;
tracker.startTrackingPointer(_router, handleEvent); tracker.startTrackingPointer(handleEvent);
} }
void handleEvent(PointerEvent event) { void handleEvent(PointerEvent event) {
...@@ -152,8 +140,6 @@ class DoubleTapGestureRecognizer extends GestureRecognizer { ...@@ -152,8 +140,6 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
void dispose() { void dispose() {
_reset(); _reset();
_router = null;
_gestureArena = null;
} }
void _reset() { void _reset() {
...@@ -164,14 +150,14 @@ class DoubleTapGestureRecognizer extends GestureRecognizer { ...@@ -164,14 +150,14 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
_TapTracker tracker = _firstTap; _TapTracker tracker = _firstTap;
_firstTap = null; _firstTap = null;
_reject(tracker); _reject(tracker);
_gestureArena.release(tracker.pointer); Gesturer.instance.gestureArena.release(tracker.pointer);
} }
_clearTrackers(); _clearTrackers();
} }
void _registerFirstTap(_TapTracker tracker) { void _registerFirstTap(_TapTracker tracker) {
_startDoubleTapTimer(); _startDoubleTapTimer();
_gestureArena.hold(tracker.pointer); Gesturer.instance.gestureArena.hold(tracker.pointer);
// Note, order is important below in order for the clear -> reject logic to // Note, order is important below in order for the clear -> reject logic to
// work properly. // work properly.
_freezeTracker(tracker); _freezeTracker(tracker);
...@@ -198,7 +184,7 @@ class DoubleTapGestureRecognizer extends GestureRecognizer { ...@@ -198,7 +184,7 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
} }
void _freezeTracker(_TapTracker tracker) { void _freezeTracker(_TapTracker tracker) {
tracker.stopTrackingPointer(_router, handleEvent); tracker.stopTrackingPointer(handleEvent);
} }
void _startDoubleTapTimer() { void _startDoubleTapTimer() {
...@@ -234,9 +220,9 @@ class _TapGesture extends _TapTracker { ...@@ -234,9 +220,9 @@ class _TapGesture extends _TapTracker {
_lastPosition = event.position, _lastPosition = event.position,
super( super(
event: event, event: event,
entry: gestureRecognizer._gestureArena.add(event.pointer, gestureRecognizer) entry: Gesturer.instance.gestureArena.add(event.pointer, gestureRecognizer)
) { ) {
startTrackingPointer(gestureRecognizer.router, handleEvent); startTrackingPointer(handleEvent);
if (longTapDelay > Duration.ZERO) { if (longTapDelay > Duration.ZERO) {
_timer = new Timer(longTapDelay, () { _timer = new Timer(longTapDelay, () {
_timer = null; _timer = null;
...@@ -263,16 +249,16 @@ class _TapGesture extends _TapTracker { ...@@ -263,16 +249,16 @@ class _TapGesture extends _TapTracker {
} else if (event is PointerCancelEvent) { } else if (event is PointerCancelEvent) {
cancel(); cancel();
} else if (event is PointerUpEvent) { } else if (event is PointerUpEvent) {
stopTrackingPointer(gestureRecognizer.router, handleEvent); stopTrackingPointer(handleEvent);
_finalPosition = event.position; _finalPosition = event.position;
_check(); _check();
} }
} }
void stopTrackingPointer(PointerRouter router, PointerRoute route) { void stopTrackingPointer(PointerRoute route) {
_timer?.cancel(); _timer?.cancel();
_timer = null; _timer = null;
super.stopTrackingPointer(router, route); super.stopTrackingPointer(route);
} }
void accept() { void accept() {
...@@ -281,7 +267,7 @@ class _TapGesture extends _TapTracker { ...@@ -281,7 +267,7 @@ class _TapGesture extends _TapTracker {
} }
void reject() { void reject() {
stopTrackingPointer(gestureRecognizer.router, handleEvent); stopTrackingPointer(handleEvent);
gestureRecognizer._resolveTap(pointer, _TapResolution.cancel, null); gestureRecognizer._resolveTap(pointer, _TapResolution.cancel, null);
} }
...@@ -307,24 +293,9 @@ class _TapGesture extends _TapTracker { ...@@ -307,24 +293,9 @@ class _TapGesture extends _TapTracker {
/// taps, on up-1 and up-2. /// taps, on up-1 and up-2.
class MultiTapGestureRecognizer extends GestureRecognizer { class MultiTapGestureRecognizer extends GestureRecognizer {
MultiTapGestureRecognizer({ MultiTapGestureRecognizer({
PointerRouter router, this.longTapDelay: Duration.ZERO
GestureArena gestureArena, });
this.onTapDown,
this.onTapUp,
this.onTap,
this.onTapCancel,
this.longTapDelay: Duration.ZERO,
this.onLongTapDown
}) : _router = router,
_gestureArena = gestureArena {
assert(router != null);
assert(gestureArena != null);
}
PointerRouter get router => _router;
PointerRouter _router;
GestureArena get gestureArena => _gestureArena;
GestureArena _gestureArena;
GestureMultiTapDownCallback onTapDown; GestureMultiTapDownCallback onTapDown;
GestureMultiTapUpCallback onTapUp; GestureMultiTapUpCallback onTapUp;
GestureMultiTapCallback onTap; GestureMultiTapCallback onTap;
...@@ -382,8 +353,6 @@ class MultiTapGestureRecognizer extends GestureRecognizer { ...@@ -382,8 +353,6 @@ class MultiTapGestureRecognizer extends GestureRecognizer {
gesture.cancel(); gesture.cancel();
// Rejection of each gesture should cause it to be removed from our map // Rejection of each gesture should cause it to be removed from our map
assert(_gestureMap.isEmpty); assert(_gestureMap.isEmpty);
_router = null;
_gestureArena = null;
} }
String toStringShort() => 'multitap'; String toStringShort() => 'multitap';
......
...@@ -7,6 +7,7 @@ import 'dart:collection'; ...@@ -7,6 +7,7 @@ import 'dart:collection';
import 'dart:ui' show Point, Offset; import 'dart:ui' show Point, Offset;
import 'arena.dart'; import 'arena.dart';
import 'binding.dart';
import 'constants.dart'; import 'constants.dart';
import 'events.dart'; import 'events.dart';
import 'pointer_router.dart'; import 'pointer_router.dart';
...@@ -56,18 +57,6 @@ abstract class GestureRecognizer extends GestureArenaMember { ...@@ -56,18 +57,6 @@ abstract class GestureRecognizer extends GestureArenaMember {
/// which manages each pointer independently and can consider multiple /// which manages each pointer independently and can consider multiple
/// simultaneous touches to each result in a separate tap. /// simultaneous touches to each result in a separate tap.
abstract class OneSequenceGestureRecognizer extends GestureRecognizer { abstract class OneSequenceGestureRecognizer extends GestureRecognizer {
OneSequenceGestureRecognizer({
PointerRouter router,
GestureArena gestureArena
}) : _router = router,
_gestureArena = gestureArena {
assert(_router != null);
assert(_gestureArena != null);
}
PointerRouter _router;
GestureArena _gestureArena;
final List<GestureArenaEntry> _entries = <GestureArenaEntry>[]; final List<GestureArenaEntry> _entries = <GestureArenaEntry>[];
final Set<int> _trackedPointers = new HashSet<int>(); final Set<int> _trackedPointers = new HashSet<int>();
...@@ -86,21 +75,19 @@ abstract class OneSequenceGestureRecognizer extends GestureRecognizer { ...@@ -86,21 +75,19 @@ abstract class OneSequenceGestureRecognizer extends GestureRecognizer {
void dispose() { void dispose() {
resolve(GestureDisposition.rejected); resolve(GestureDisposition.rejected);
for (int pointer in _trackedPointers) for (int pointer in _trackedPointers)
_router.removeRoute(pointer, handleEvent); Gesturer.instance.pointerRouter.removeRoute(pointer, handleEvent);
_trackedPointers.clear(); _trackedPointers.clear();
assert(_entries.isEmpty); assert(_entries.isEmpty);
_router = null;
_gestureArena = null;
} }
void startTrackingPointer(int pointer) { void startTrackingPointer(int pointer) {
_router.addRoute(pointer, handleEvent); Gesturer.instance.pointerRouter.addRoute(pointer, handleEvent);
_trackedPointers.add(pointer); _trackedPointers.add(pointer);
_entries.add(_gestureArena.add(pointer, this)); _entries.add(Gesturer.instance.gestureArena.add(pointer, this));
} }
void stopTrackingPointer(int pointer) { void stopTrackingPointer(int pointer) {
_router.removeRoute(pointer, handleEvent); Gesturer.instance.pointerRouter.removeRoute(pointer, handleEvent);
_trackedPointers.remove(pointer); _trackedPointers.remove(pointer);
if (_trackedPointers.isEmpty) if (_trackedPointers.isEmpty)
didStopTrackingLastPointer(pointer); didStopTrackingLastPointer(pointer);
...@@ -120,14 +107,7 @@ enum GestureRecognizerState { ...@@ -120,14 +107,7 @@ enum GestureRecognizerState {
} }
abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecognizer { abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecognizer {
PrimaryPointerGestureRecognizer({ PrimaryPointerGestureRecognizer({ this.deadline });
PointerRouter router,
GestureArena gestureArena,
this.deadline
}) : super(
router: router,
gestureArena: gestureArena
);
final Duration deadline; final Duration deadline;
......
...@@ -19,17 +19,6 @@ typedef void GestureScaleUpdateCallback(double scale, Point focalPoint); ...@@ -19,17 +19,6 @@ typedef void GestureScaleUpdateCallback(double scale, Point focalPoint);
typedef void GestureScaleEndCallback(); typedef void GestureScaleEndCallback();
class ScaleGestureRecognizer extends OneSequenceGestureRecognizer { class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
ScaleGestureRecognizer({
PointerRouter router,
GestureArena gestureArena,
this.onStart,
this.onUpdate,
this.onEnd
}) : super(
router: router,
gestureArena: gestureArena
);
GestureScaleStartCallback onStart; GestureScaleStartCallback onStart;
GestureScaleUpdateCallback onUpdate; GestureScaleUpdateCallback onUpdate;
GestureScaleEndCallback onEnd; GestureScaleEndCallback onEnd;
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
import 'arena.dart'; import 'arena.dart';
import 'constants.dart'; import 'constants.dart';
import 'events.dart'; import 'events.dart';
import 'pointer_router.dart';
import 'recognizer.dart'; import 'recognizer.dart';
typedef void GestureTapDownCallback(Point globalPosition); typedef void GestureTapDownCallback(Point globalPosition);
...@@ -17,18 +16,7 @@ typedef void GestureTapCancelCallback(); ...@@ -17,18 +16,7 @@ typedef void GestureTapCancelCallback();
/// pointer per gesture. That is, during tap recognition, extra pointer events /// pointer per gesture. That is, during tap recognition, extra pointer events
/// are ignored: down-1, down-2, up-1, up-2 produces only one tap on up-1. /// are ignored: down-1, down-2, up-1, up-2 produces only one tap on up-1.
class TapGestureRecognizer extends PrimaryPointerGestureRecognizer { class TapGestureRecognizer extends PrimaryPointerGestureRecognizer {
TapGestureRecognizer({ TapGestureRecognizer() : super(deadline: kPressTimeout);
PointerRouter router,
GestureArena gestureArena,
this.onTapDown,
this.onTapUp,
this.onTap,
this.onTapCancel
}) : super(
router: router,
gestureArena: gestureArena,
deadline: kPressTimeout
);
GestureTapDownCallback onTapDown; GestureTapDownCallback onTapDown;
GestureTapUpCallback onTapUp; GestureTapUpCallback onTapUp;
......
...@@ -84,7 +84,7 @@ class _RenderSlider extends RenderConstrainedBox { ...@@ -84,7 +84,7 @@ class _RenderSlider extends RenderConstrainedBox {
_activeColor = activeColor, _activeColor = activeColor,
super(additionalConstraints: const BoxConstraints.tightFor(width: _kTrackWidth + 2 * _kReactionRadius, height: 2 * _kReactionRadius)) { super(additionalConstraints: const BoxConstraints.tightFor(width: _kTrackWidth + 2 * _kReactionRadius, height: 2 * _kReactionRadius)) {
assert(value != null && value >= 0.0 && value <= 1.0); assert(value != null && value >= 0.0 && value <= 1.0);
_drag = new HorizontalDragGestureRecognizer(router: Gesturer.instance.pointerRouter, gestureArena: Gesturer.instance.gestureArena) _drag = new HorizontalDragGestureRecognizer()
..onStart = _handleDragStart ..onStart = _handleDragStart
..onUpdate = _handleDragUpdate ..onUpdate = _handleDragUpdate
..onEnd = _handleDragEnd; ..onEnd = _handleDragEnd;
......
...@@ -112,7 +112,7 @@ class _RenderSwitch extends RenderToggleable { ...@@ -112,7 +112,7 @@ class _RenderSwitch extends RenderToggleable {
) { ) {
_activeTrackColor = activeTrackColor; _activeTrackColor = activeTrackColor;
_inactiveTrackColor = inactiveTrackColor; _inactiveTrackColor = inactiveTrackColor;
_drag = new HorizontalDragGestureRecognizer(router: Gesturer.instance.pointerRouter, gestureArena: Gesturer.instance.gestureArena) _drag = new HorizontalDragGestureRecognizer()
..onStart = _handleDragStart ..onStart = _handleDragStart
..onUpdate = _handleDragUpdate ..onUpdate = _handleDragUpdate
..onEnd = _handleDragEnd; ..onEnd = _handleDragEnd;
......
...@@ -30,7 +30,7 @@ abstract class RenderToggleable extends RenderConstrainedBox implements Semantic ...@@ -30,7 +30,7 @@ abstract class RenderToggleable extends RenderConstrainedBox implements Semantic
assert(value != null); assert(value != null);
assert(activeColor != null); assert(activeColor != null);
assert(inactiveColor != null); assert(inactiveColor != null);
_tap = new TapGestureRecognizer(router: Gesturer.instance.pointerRouter, gestureArena: Gesturer.instance.gestureArena) _tap = new TapGestureRecognizer()
..onTapDown = _handleTapDown ..onTapDown = _handleTapDown
..onTap = _handleTap ..onTap = _handleTap
..onTapUp = _handleTapUp ..onTapUp = _handleTapUp
......
...@@ -39,7 +39,7 @@ class RenderEditableLine extends RenderBox { ...@@ -39,7 +39,7 @@ class RenderEditableLine extends RenderBox {
..maxWidth = double.INFINITY ..maxWidth = double.INFINITY
..minHeight = 0.0 ..minHeight = 0.0
..maxHeight = double.INFINITY; ..maxHeight = double.INFINITY;
_tap = new TapGestureRecognizer(router: Gesturer.instance.pointerRouter, gestureArena: Gesturer.instance.gestureArena) _tap = new TapGestureRecognizer()
..onTapDown = _handleTapDown ..onTapDown = _handleTapDown
..onTap = _handleTap ..onTap = _handleTap
..onTapCancel = _handleTapCancel; ..onTapCancel = _handleTapCancel;
......
...@@ -82,7 +82,7 @@ abstract class DraggableBase<T> extends StatefulComponent { ...@@ -82,7 +82,7 @@ abstract class DraggableBase<T> extends StatefulComponent {
/// Should return a new MultiDragGestureRecognizer instance /// Should return a new MultiDragGestureRecognizer instance
/// constructed with the given arguments. /// constructed with the given arguments.
MultiDragGestureRecognizer createRecognizer(PointerRouter router, GestureArena arena, GestureMultiDragStartCallback starter); MultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart);
_DraggableState<T> createState() => new _DraggableState<T>(); _DraggableState<T> createState() => new _DraggableState<T>();
} }
...@@ -109,12 +109,8 @@ class Draggable<T> extends DraggableBase<T> { ...@@ -109,12 +109,8 @@ class Draggable<T> extends DraggableBase<T> {
maxSimultaneousDrags: maxSimultaneousDrags maxSimultaneousDrags: maxSimultaneousDrags
); );
MultiDragGestureRecognizer createRecognizer(PointerRouter router, GestureArena arena, GestureMultiDragStartCallback starter) { MultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart) {
return new ImmediateMultiDragGestureRecognizer( return new ImmediateMultiDragGestureRecognizer()..onStart = onStart;
pointerRouter: router,
gestureArena: arena,
onStart: starter
);
} }
} }
...@@ -141,12 +137,8 @@ class HorizontalDraggable<T> extends DraggableBase<T> { ...@@ -141,12 +137,8 @@ class HorizontalDraggable<T> extends DraggableBase<T> {
maxSimultaneousDrags: maxSimultaneousDrags maxSimultaneousDrags: maxSimultaneousDrags
); );
MultiDragGestureRecognizer createRecognizer(PointerRouter router, GestureArena arena, GestureMultiDragStartCallback starter) { MultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart) {
return new HorizontalMultiDragGestureRecognizer( return new HorizontalMultiDragGestureRecognizer()..onStart = onStart;
pointerRouter: router,
gestureArena: arena,
onStart: starter
);
} }
} }
...@@ -173,12 +165,8 @@ class VerticalDraggable<T> extends DraggableBase<T> { ...@@ -173,12 +165,8 @@ class VerticalDraggable<T> extends DraggableBase<T> {
maxSimultaneousDrags: maxSimultaneousDrags maxSimultaneousDrags: maxSimultaneousDrags
); );
MultiDragGestureRecognizer createRecognizer(PointerRouter router, GestureArena arena, GestureMultiDragStartCallback starter) { MultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart) {
return new VerticalMultiDragGestureRecognizer( return new VerticalMultiDragGestureRecognizer()..onStart = onStart;
pointerRouter: router,
gestureArena: arena,
onStart: starter
);
} }
} }
...@@ -204,18 +192,14 @@ class LongPressDraggable<T> extends DraggableBase<T> { ...@@ -204,18 +192,14 @@ class LongPressDraggable<T> extends DraggableBase<T> {
maxSimultaneousDrags: maxSimultaneousDrags maxSimultaneousDrags: maxSimultaneousDrags
); );
MultiDragGestureRecognizer createRecognizer(PointerRouter router, GestureArena arena, GestureMultiDragStartCallback starter) { MultiDragGestureRecognizer createRecognizer(GestureMultiDragStartCallback onStart) {
return new DelayedMultiDragGestureRecognizer( return new DelayedMultiDragGestureRecognizer()
pointerRouter: router, ..onStart = (Point position) {
gestureArena: arena, Drag result = onStart(position);
delay: kLongPressTimeout,
onStart: (Point position) {
Drag result = starter(position);
if (result != null) if (result != null)
userFeedback.performHapticFeedback(HapticFeedbackType.virtualKey); userFeedback.performHapticFeedback(HapticFeedbackType.virtualKey);
return result; return result;
} };
);
} }
} }
...@@ -223,11 +207,7 @@ class _DraggableState<T> extends State<DraggableBase<T>> { ...@@ -223,11 +207,7 @@ class _DraggableState<T> extends State<DraggableBase<T>> {
void initState() { void initState() {
super.initState(); super.initState();
_recognizer = config.createRecognizer( _recognizer = config.createRecognizer(_startDrag);
Gesturer.instance.pointerRouter,
Gesturer.instance.gestureArena,
_startDrag
);
} }
GestureRecognizer _recognizer; GestureRecognizer _recognizer;
......
...@@ -28,7 +28,7 @@ export 'package:flutter/gestures.dart' show ...@@ -28,7 +28,7 @@ export 'package:flutter/gestures.dart' show
GestureScaleEndCallback, GestureScaleEndCallback,
Velocity; Velocity;
typedef GestureRecognizer GestureRecognizerFactory(GestureRecognizer recognizer, PointerRouter router, GestureArena arena); typedef GestureRecognizer GestureRecognizerFactory(GestureRecognizer recognizer);
/// A widget that detects gestures. /// A widget that detects gestures.
/// ///
...@@ -152,8 +152,8 @@ class GestureDetector extends StatelessComponent { ...@@ -152,8 +152,8 @@ class GestureDetector extends StatelessComponent {
Map<Type, GestureRecognizerFactory> gestures = <Type, GestureRecognizerFactory>{}; Map<Type, GestureRecognizerFactory> gestures = <Type, GestureRecognizerFactory>{};
if (onTapDown != null || onTapUp != null || onTap != null || onTapCancel != null) { if (onTapDown != null || onTapUp != null || onTap != null || onTapCancel != null) {
gestures[TapGestureRecognizer] = (TapGestureRecognizer recognizer, PointerRouter router, GestureArena arena) { gestures[TapGestureRecognizer] = (TapGestureRecognizer recognizer) {
return (recognizer ??= new TapGestureRecognizer(router: router, gestureArena: arena)) return (recognizer ??= new TapGestureRecognizer())
..onTapDown = onTapDown ..onTapDown = onTapDown
..onTapUp = onTapUp ..onTapUp = onTapUp
..onTap = onTap ..onTap = onTap
...@@ -162,22 +162,22 @@ class GestureDetector extends StatelessComponent { ...@@ -162,22 +162,22 @@ class GestureDetector extends StatelessComponent {
} }
if (onDoubleTap != null) { if (onDoubleTap != null) {
gestures[DoubleTapGestureRecognizer] = (DoubleTapGestureRecognizer recognizer, PointerRouter router, GestureArena arena) { gestures[DoubleTapGestureRecognizer] = (DoubleTapGestureRecognizer recognizer) {
return (recognizer ??= new DoubleTapGestureRecognizer(router: router, gestureArena: arena)) return (recognizer ??= new DoubleTapGestureRecognizer())
..onDoubleTap = onDoubleTap; ..onDoubleTap = onDoubleTap;
}; };
} }
if (onLongPress != null) { if (onLongPress != null) {
gestures[LongPressGestureRecognizer] = (LongPressGestureRecognizer recognizer, PointerRouter router, GestureArena arena) { gestures[LongPressGestureRecognizer] = (LongPressGestureRecognizer recognizer) {
return (recognizer ??= new LongPressGestureRecognizer(router: router, gestureArena: arena)) return (recognizer ??= new LongPressGestureRecognizer())
..onLongPress = onLongPress; ..onLongPress = onLongPress;
}; };
} }
if (onVerticalDragStart != null || onVerticalDragUpdate != null || onVerticalDragEnd != null) { if (onVerticalDragStart != null || onVerticalDragUpdate != null || onVerticalDragEnd != null) {
gestures[VerticalDragGestureRecognizer] = (VerticalDragGestureRecognizer recognizer, PointerRouter router, GestureArena arena) { gestures[VerticalDragGestureRecognizer] = (VerticalDragGestureRecognizer recognizer) {
return (recognizer ??= new VerticalDragGestureRecognizer(router: router, gestureArena: arena)) return (recognizer ??= new VerticalDragGestureRecognizer())
..onStart = onVerticalDragStart ..onStart = onVerticalDragStart
..onUpdate = onVerticalDragUpdate ..onUpdate = onVerticalDragUpdate
..onEnd = onVerticalDragEnd; ..onEnd = onVerticalDragEnd;
...@@ -185,8 +185,8 @@ class GestureDetector extends StatelessComponent { ...@@ -185,8 +185,8 @@ class GestureDetector extends StatelessComponent {
} }
if (onHorizontalDragStart != null || onHorizontalDragUpdate != null || onHorizontalDragEnd != null) { if (onHorizontalDragStart != null || onHorizontalDragUpdate != null || onHorizontalDragEnd != null) {
gestures[HorizontalDragGestureRecognizer] = (HorizontalDragGestureRecognizer recognizer, PointerRouter router, GestureArena arena) { gestures[HorizontalDragGestureRecognizer] = (HorizontalDragGestureRecognizer recognizer) {
return (recognizer ??= new HorizontalDragGestureRecognizer(router: router, gestureArena: arena)) return (recognizer ??= new HorizontalDragGestureRecognizer())
..onStart = onHorizontalDragStart ..onStart = onHorizontalDragStart
..onUpdate = onHorizontalDragUpdate ..onUpdate = onHorizontalDragUpdate
..onEnd = onHorizontalDragEnd; ..onEnd = onHorizontalDragEnd;
...@@ -194,8 +194,8 @@ class GestureDetector extends StatelessComponent { ...@@ -194,8 +194,8 @@ class GestureDetector extends StatelessComponent {
} }
if (onPanStart != null || onPanUpdate != null || onPanEnd != null) { if (onPanStart != null || onPanUpdate != null || onPanEnd != null) {
gestures[PanGestureRecognizer] = (PanGestureRecognizer recognizer, PointerRouter router, GestureArena arena) { gestures[PanGestureRecognizer] = (PanGestureRecognizer recognizer) {
return (recognizer ??= new PanGestureRecognizer(router: router, gestureArena: arena)) return (recognizer ??= new PanGestureRecognizer())
..onStart = onPanStart ..onStart = onPanStart
..onUpdate = onPanUpdate ..onUpdate = onPanUpdate
..onEnd = onPanEnd; ..onEnd = onPanEnd;
...@@ -203,14 +203,14 @@ class GestureDetector extends StatelessComponent { ...@@ -203,14 +203,14 @@ class GestureDetector extends StatelessComponent {
} }
if (onScaleStart != null || onScaleUpdate != null || onScaleEnd != null) { if (onScaleStart != null || onScaleUpdate != null || onScaleEnd != null) {
gestures[ScaleGestureRecognizer] = (ScaleGestureRecognizer recognizer, PointerRouter router, GestureArena arena) { gestures[ScaleGestureRecognizer] = (ScaleGestureRecognizer recognizer) {
return (recognizer ??= new ScaleGestureRecognizer(router: router, gestureArena: arena)) return (recognizer ??= new ScaleGestureRecognizer())
..onStart = onScaleStart ..onStart = onScaleStart
..onUpdate = onScaleUpdate ..onUpdate = onScaleUpdate
..onEnd = onScaleEnd; ..onEnd = onScaleEnd;
}; };
} }
return new RawGestureDetector( return new RawGestureDetector(
gestures: gestures, gestures: gestures,
behavior: behavior, behavior: behavior,
...@@ -314,14 +314,12 @@ class RawGestureDetectorState extends State<RawGestureDetector> { ...@@ -314,14 +314,12 @@ class RawGestureDetectorState extends State<RawGestureDetector> {
} }
void _syncAll(Map<Type, GestureRecognizerFactory> gestures) { void _syncAll(Map<Type, GestureRecognizerFactory> gestures) {
final PointerRouter pointerRouter = Gesturer.instance.pointerRouter;
final GestureArena gestureArena = Gesturer.instance.gestureArena;
assert(_recognizers != null); assert(_recognizers != null);
Map<Type, GestureRecognizer> oldRecognizers = _recognizers; Map<Type, GestureRecognizer> oldRecognizers = _recognizers;
_recognizers = <Type, GestureRecognizer>{}; _recognizers = <Type, GestureRecognizer>{};
for (Type type in gestures.keys) { for (Type type in gestures.keys) {
assert(!_recognizers.containsKey(type)); assert(!_recognizers.containsKey(type));
_recognizers[type] = gestures[type](oldRecognizers[type], pointerRouter, gestureArena); _recognizers[type] = gestures[type](oldRecognizers[type]);
assert(_recognizers[type].runtimeType == type); assert(_recognizers[type].runtimeType == type);
} }
for (Type type in oldRecognizers.keys) { for (Type type in oldRecognizers.keys) {
......
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/services.dart';
import 'package:flutter/gestures.dart';
class TestGestureFlutterBinding extends BindingBase with Gesturer { }
void ensureGesturer() {
if (Gesturer.instance == null)
new TestGestureFlutterBinding();
assert(Gesturer.instance != null);
}
...@@ -6,6 +6,8 @@ import 'package:quiver/testing/async.dart'; ...@@ -6,6 +6,8 @@ import 'package:quiver/testing/async.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
import 'gesture_tester.dart';
const PointerDownEvent down = const PointerDownEvent( const PointerDownEvent down = const PointerDownEvent(
pointer: 5, pointer: 5,
position: const Point(10.0, 10.0) position: const Point(10.0, 10.0)
...@@ -17,13 +19,10 @@ const PointerUpEvent up = const PointerUpEvent( ...@@ -17,13 +19,10 @@ const PointerUpEvent up = const PointerUpEvent(
); );
void main() { void main() {
setUp(ensureGesturer);
test('Should recognize long press', () { test('Should recognize long press', () {
PointerRouter router = new PointerRouter(); LongPressGestureRecognizer longPress = new LongPressGestureRecognizer();
GestureArena gestureArena = new GestureArena();
LongPressGestureRecognizer longPress = new LongPressGestureRecognizer(
router: router,
gestureArena: gestureArena
);
bool longPressRecognized = false; bool longPressRecognized = false;
longPress.onLongPress = () { longPress.onLongPress = () {
...@@ -32,9 +31,9 @@ void main() { ...@@ -32,9 +31,9 @@ void main() {
new FakeAsync().run((FakeAsync async) { new FakeAsync().run((FakeAsync async) {
longPress.addPointer(down); longPress.addPointer(down);
gestureArena.close(5); Gesturer.instance.gestureArena.close(5);
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
router.route(down); Gesturer.instance.pointerRouter.route(down);
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
async.elapse(const Duration(milliseconds: 300)); async.elapse(const Duration(milliseconds: 300));
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
...@@ -46,12 +45,7 @@ void main() { ...@@ -46,12 +45,7 @@ void main() {
}); });
test('Up cancels long press', () { test('Up cancels long press', () {
PointerRouter router = new PointerRouter(); LongPressGestureRecognizer longPress = new LongPressGestureRecognizer();
GestureArena gestureArena = new GestureArena();
LongPressGestureRecognizer longPress = new LongPressGestureRecognizer(
router: router,
gestureArena: gestureArena
);
bool longPressRecognized = false; bool longPressRecognized = false;
longPress.onLongPress = () { longPress.onLongPress = () {
...@@ -60,13 +54,13 @@ void main() { ...@@ -60,13 +54,13 @@ void main() {
new FakeAsync().run((FakeAsync async) { new FakeAsync().run((FakeAsync async) {
longPress.addPointer(down); longPress.addPointer(down);
gestureArena.close(5); Gesturer.instance.gestureArena.close(5);
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
router.route(down); Gesturer.instance.pointerRouter.route(down);
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
async.elapse(const Duration(milliseconds: 300)); async.elapse(const Duration(milliseconds: 300));
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
router.route(up); Gesturer.instance.pointerRouter.route(up);
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
async.elapse(const Duration(seconds: 1)); async.elapse(const Duration(seconds: 1));
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
...@@ -76,16 +70,8 @@ void main() { ...@@ -76,16 +70,8 @@ void main() {
}); });
test('Should recognize both tap down and long press', () { test('Should recognize both tap down and long press', () {
PointerRouter router = new PointerRouter(); LongPressGestureRecognizer longPress = new LongPressGestureRecognizer();
GestureArena gestureArena = new GestureArena(); TapGestureRecognizer tap = new TapGestureRecognizer();
LongPressGestureRecognizer longPress = new LongPressGestureRecognizer(
router: router,
gestureArena: gestureArena
);
TapGestureRecognizer tap = new TapGestureRecognizer(
router: router,
gestureArena: gestureArena
);
bool tapDownRecognized = false; bool tapDownRecognized = false;
tap.onTapDown = (_) { tap.onTapDown = (_) {
...@@ -100,10 +86,10 @@ void main() { ...@@ -100,10 +86,10 @@ void main() {
new FakeAsync().run((FakeAsync async) { new FakeAsync().run((FakeAsync async) {
tap.addPointer(down); tap.addPointer(down);
longPress.addPointer(down); longPress.addPointer(down);
gestureArena.close(5); Gesturer.instance.gestureArena.close(5);
expect(tapDownRecognized, isFalse); expect(tapDownRecognized, isFalse);
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
router.route(down); Gesturer.instance.pointerRouter.route(down);
expect(tapDownRecognized, isFalse); expect(tapDownRecognized, isFalse);
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
async.elapse(const Duration(milliseconds: 300)); async.elapse(const Duration(milliseconds: 300));
......
...@@ -6,18 +6,16 @@ import 'package:flutter_test/flutter_test.dart'; ...@@ -6,18 +6,16 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
import 'gesture_tester.dart';
void main() { void main() {
setUp(ensureGesturer);
test('Should recognize scale gestures', () { test('Should recognize scale gestures', () {
PointerRouter router = new PointerRouter(); GestureArena gestureArena = Gesturer.instance.gestureArena;
GestureArena gestureArena = new GestureArena(); PointerRouter pointerRouter = Gesturer.instance.pointerRouter;
ScaleGestureRecognizer scale = new ScaleGestureRecognizer( ScaleGestureRecognizer scale = new ScaleGestureRecognizer();
router: router, TapGestureRecognizer tap = new TapGestureRecognizer();
gestureArena: gestureArena
);
TapGestureRecognizer tap = new TapGestureRecognizer(
router: router,
gestureArena: gestureArena
);
bool didStartScale = false; bool didStartScale = false;
Point updatedFocalPoint; Point updatedFocalPoint;
...@@ -56,14 +54,14 @@ void main() { ...@@ -56,14 +54,14 @@ void main() {
expect(didTap, isFalse); expect(didTap, isFalse);
// One-finger panning // One-finger panning
router.route(down); pointerRouter.route(down);
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
expect(updatedScale, isNull); expect(updatedScale, isNull);
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
router.route(pointer1.move(const Point(20.0, 30.0))); pointerRouter.route(pointer1.move(const Point(20.0, 30.0)));
expect(didStartScale, isTrue); expect(didStartScale, isTrue);
didStartScale = false; didStartScale = false;
expect(updatedFocalPoint, const Point(20.0, 30.0)); expect(updatedFocalPoint, const Point(20.0, 30.0));
...@@ -79,7 +77,7 @@ void main() { ...@@ -79,7 +77,7 @@ void main() {
scale.addPointer(down2); scale.addPointer(down2);
tap.addPointer(down2); tap.addPointer(down2);
gestureArena.close(2); gestureArena.close(2);
router.route(down2); pointerRouter.route(down2);
expect(didEndScale, isTrue); expect(didEndScale, isTrue);
didEndScale = false; didEndScale = false;
...@@ -88,7 +86,7 @@ void main() { ...@@ -88,7 +86,7 @@ void main() {
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
// Zoom in // Zoom in
router.route(pointer2.move(const Point(0.0, 10.0))); pointerRouter.route(pointer2.move(const Point(0.0, 10.0)));
expect(didStartScale, isTrue); expect(didStartScale, isTrue);
didStartScale = false; didStartScale = false;
expect(updatedFocalPoint, const Point(10.0, 20.0)); expect(updatedFocalPoint, const Point(10.0, 20.0));
...@@ -99,7 +97,7 @@ void main() { ...@@ -99,7 +97,7 @@ void main() {
expect(didTap, isFalse); expect(didTap, isFalse);
// Zoom out // Zoom out
router.route(pointer2.move(const Point(15.0, 25.0))); pointerRouter.route(pointer2.move(const Point(15.0, 25.0)));
expect(updatedFocalPoint, const Point(17.5, 27.5)); expect(updatedFocalPoint, const Point(17.5, 27.5));
updatedFocalPoint = null; updatedFocalPoint = null;
expect(updatedScale, 0.5); expect(updatedScale, 0.5);
...@@ -112,7 +110,7 @@ void main() { ...@@ -112,7 +110,7 @@ void main() {
scale.addPointer(down3); scale.addPointer(down3);
tap.addPointer(down3); tap.addPointer(down3);
gestureArena.close(3); gestureArena.close(3);
router.route(down3); pointerRouter.route(down3);
expect(didEndScale, isTrue); expect(didEndScale, isTrue);
didEndScale = false; didEndScale = false;
...@@ -121,7 +119,7 @@ void main() { ...@@ -121,7 +119,7 @@ void main() {
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
// Zoom in // Zoom in
router.route(pointer3.move(const Point(55.0, 65.0))); pointerRouter.route(pointer3.move(const Point(55.0, 65.0)));
expect(didStartScale, isTrue); expect(didStartScale, isTrue);
didStartScale = false; didStartScale = false;
expect(updatedFocalPoint, const Point(30.0, 40.0)); expect(updatedFocalPoint, const Point(30.0, 40.0));
...@@ -132,9 +130,9 @@ void main() { ...@@ -132,9 +130,9 @@ void main() {
expect(didTap, isFalse); expect(didTap, isFalse);
// Return to original positions but with different fingers // Return to original positions but with different fingers
router.route(pointer1.move(const Point(25.0, 35.0))); pointerRouter.route(pointer1.move(const Point(25.0, 35.0)));
router.route(pointer2.move(const Point(20.0, 30.0))); pointerRouter.route(pointer2.move(const Point(20.0, 30.0)));
router.route(pointer3.move(const Point(15.0, 25.0))); pointerRouter.route(pointer3.move(const Point(15.0, 25.0)));
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
expect(updatedFocalPoint, const Point(20.0, 30.0)); expect(updatedFocalPoint, const Point(20.0, 30.0));
updatedFocalPoint = null; updatedFocalPoint = null;
...@@ -143,7 +141,7 @@ void main() { ...@@ -143,7 +141,7 @@ void main() {
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
router.route(pointer1.up()); pointerRouter.route(pointer1.up());
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedScale, isNull); expect(updatedScale, isNull);
...@@ -152,7 +150,7 @@ void main() { ...@@ -152,7 +150,7 @@ void main() {
expect(didTap, isFalse); expect(didTap, isFalse);
// Continue scaling with two fingers // Continue scaling with two fingers
router.route(pointer3.move(const Point(10.0, 20.0))); pointerRouter.route(pointer3.move(const Point(10.0, 20.0)));
expect(didStartScale, isTrue); expect(didStartScale, isTrue);
didStartScale = false; didStartScale = false;
expect(updatedFocalPoint, const Point(15.0, 25.0)); expect(updatedFocalPoint, const Point(15.0, 25.0));
...@@ -160,7 +158,7 @@ void main() { ...@@ -160,7 +158,7 @@ void main() {
expect(updatedScale, 2.0); expect(updatedScale, 2.0);
updatedScale = null; updatedScale = null;
router.route(pointer2.up()); pointerRouter.route(pointer2.up());
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedScale, isNull); expect(updatedScale, isNull);
...@@ -169,7 +167,7 @@ void main() { ...@@ -169,7 +167,7 @@ void main() {
expect(didTap, isFalse); expect(didTap, isFalse);
// Continue panning with one finger // Continue panning with one finger
router.route(pointer3.move(const Point(0.0, 0.0))); pointerRouter.route(pointer3.move(const Point(0.0, 0.0)));
expect(didStartScale, isTrue); expect(didStartScale, isTrue);
didStartScale = false; didStartScale = false;
expect(updatedFocalPoint, const Point(0.0, 0.0)); expect(updatedFocalPoint, const Point(0.0, 0.0));
...@@ -178,7 +176,7 @@ void main() { ...@@ -178,7 +176,7 @@ void main() {
updatedScale = null; updatedScale = null;
// We are done // We are done
router.route(pointer3.up()); pointerRouter.route(pointer3.up());
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
expect(updatedFocalPoint, isNull); expect(updatedFocalPoint, isNull);
expect(updatedScale, isNull); expect(updatedScale, isNull);
......
...@@ -6,18 +6,16 @@ import 'package:flutter_test/flutter_test.dart'; ...@@ -6,18 +6,16 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
import 'gesture_tester.dart';
void main() { void main() {
setUp(ensureGesturer);
test('Should recognize pan', () { test('Should recognize pan', () {
PointerRouter router = new PointerRouter(); GestureArena gestureArena = Gesturer.instance.gestureArena;
GestureArena gestureArena = new GestureArena(); PointerRouter pointerRouter = Gesturer.instance.pointerRouter;
PanGestureRecognizer pan = new PanGestureRecognizer( PanGestureRecognizer pan = new PanGestureRecognizer();
router: router, TapGestureRecognizer tap = new TapGestureRecognizer();
gestureArena: gestureArena
);
TapGestureRecognizer tap = new TapGestureRecognizer(
router: router,
gestureArena: gestureArena
);
bool didStartPan = false; bool didStartPan = false;
pan.onStart = (_) { pan.onStart = (_) {
...@@ -49,13 +47,13 @@ void main() { ...@@ -49,13 +47,13 @@ void main() {
expect(didEndPan, isFalse); expect(didEndPan, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
router.route(down); pointerRouter.route(down);
expect(didStartPan, isFalse); expect(didStartPan, isFalse);
expect(updatedScrollDelta, isNull); expect(updatedScrollDelta, isNull);
expect(didEndPan, isFalse); expect(didEndPan, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
router.route(pointer.move(const Point(20.0, 20.0))); pointerRouter.route(pointer.move(const Point(20.0, 20.0)));
expect(didStartPan, isTrue); expect(didStartPan, isTrue);
didStartPan = false; didStartPan = false;
expect(updatedScrollDelta, const Offset(10.0, 10.0)); expect(updatedScrollDelta, const Offset(10.0, 10.0));
...@@ -63,14 +61,14 @@ void main() { ...@@ -63,14 +61,14 @@ void main() {
expect(didEndPan, isFalse); expect(didEndPan, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
router.route(pointer.move(const Point(20.0, 25.0))); pointerRouter.route(pointer.move(const Point(20.0, 25.0)));
expect(didStartPan, isFalse); expect(didStartPan, isFalse);
expect(updatedScrollDelta, const Offset(0.0, 5.0)); expect(updatedScrollDelta, const Offset(0.0, 5.0));
updatedScrollDelta = null; updatedScrollDelta = null;
expect(didEndPan, isFalse); expect(didEndPan, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
router.route(pointer.up()); pointerRouter.route(pointer.up());
expect(didStartPan, isFalse); expect(didStartPan, isFalse);
expect(updatedScrollDelta, isNull); expect(updatedScrollDelta, isNull);
expect(didEndPan, isTrue); expect(didEndPan, isTrue);
......
...@@ -6,12 +6,15 @@ import 'package:flutter/gestures.dart'; ...@@ -6,12 +6,15 @@ import 'package:flutter/gestures.dart';
import 'package:quiver/testing/async.dart'; import 'package:quiver/testing/async.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
import 'gesture_tester.dart';
class TestGestureArenaMember extends GestureArenaMember { class TestGestureArenaMember extends GestureArenaMember {
void acceptGesture(Object key) {} void acceptGesture(Object key) {}
void rejectGesture(Object key) {} void rejectGesture(Object key) {}
} }
void main() { void main() {
setUp(ensureGesturer);
// Down/up pair 1: normal tap sequence // Down/up pair 1: normal tap sequence
const PointerDownEvent down1 = const PointerDownEvent( const PointerDownEvent down1 = const PointerDownEvent(
...@@ -52,12 +55,7 @@ void main() { ...@@ -52,12 +55,7 @@ void main() {
); );
test('Should recognize tap', () { test('Should recognize tap', () {
PointerRouter router = new PointerRouter(); TapGestureRecognizer tap = new TapGestureRecognizer();
GestureArena gestureArena = new GestureArena();
TapGestureRecognizer tap = new TapGestureRecognizer(
router: router,
gestureArena: gestureArena
);
bool tapRecognized = false; bool tapRecognized = false;
tap.onTap = () { tap.onTap = () {
...@@ -65,26 +63,21 @@ void main() { ...@@ -65,26 +63,21 @@ void main() {
}; };
tap.addPointer(down1); tap.addPointer(down1);
gestureArena.close(1); Gesturer.instance.gestureArena.close(1);
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
router.route(down1); Gesturer.instance.pointerRouter.route(down1);
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
router.route(up1); Gesturer.instance.pointerRouter.route(up1);
expect(tapRecognized, isTrue); expect(tapRecognized, isTrue);
gestureArena.sweep(1); Gesturer.instance.gestureArena.sweep(1);
expect(tapRecognized, isTrue); expect(tapRecognized, isTrue);
tap.dispose(); tap.dispose();
}); });
test('No duplicate tap events', () { test('No duplicate tap events', () {
PointerRouter router = new PointerRouter(); TapGestureRecognizer tap = new TapGestureRecognizer();
GestureArena gestureArena = new GestureArena();
TapGestureRecognizer tap = new TapGestureRecognizer(
router: router,
gestureArena: gestureArena
);
int tapsRecognized = 0; int tapsRecognized = 0;
tap.onTap = () { tap.onTap = () {
...@@ -92,37 +85,32 @@ void main() { ...@@ -92,37 +85,32 @@ void main() {
}; };
tap.addPointer(down1); tap.addPointer(down1);
gestureArena.close(1); Gesturer.instance.gestureArena.close(1);
expect(tapsRecognized, 0); expect(tapsRecognized, 0);
router.route(down1); Gesturer.instance.pointerRouter.route(down1);
expect(tapsRecognized, 0); expect(tapsRecognized, 0);
router.route(up1); Gesturer.instance.pointerRouter.route(up1);
expect(tapsRecognized, 1); expect(tapsRecognized, 1);
gestureArena.sweep(1); Gesturer.instance.gestureArena.sweep(1);
expect(tapsRecognized, 1); expect(tapsRecognized, 1);
tap.addPointer(down1); tap.addPointer(down1);
gestureArena.close(1); Gesturer.instance.gestureArena.close(1);
expect(tapsRecognized, 1); expect(tapsRecognized, 1);
router.route(down1); Gesturer.instance.pointerRouter.route(down1);
expect(tapsRecognized, 1); expect(tapsRecognized, 1);
router.route(up1); Gesturer.instance.pointerRouter.route(up1);
expect(tapsRecognized, 2); expect(tapsRecognized, 2);
gestureArena.sweep(1); Gesturer.instance.gestureArena.sweep(1);
expect(tapsRecognized, 2); expect(tapsRecognized, 2);
tap.dispose(); tap.dispose();
}); });
test('Should not recognize two overlapping taps', () { test('Should not recognize two overlapping taps', () {
PointerRouter router = new PointerRouter(); TapGestureRecognizer tap = new TapGestureRecognizer();
GestureArena gestureArena = new GestureArena();
TapGestureRecognizer tap = new TapGestureRecognizer(
router: router,
gestureArena: gestureArena
);
int tapsRecognized = 0; int tapsRecognized = 0;
tap.onTap = () { tap.onTap = () {
...@@ -130,38 +118,33 @@ void main() { ...@@ -130,38 +118,33 @@ void main() {
}; };
tap.addPointer(down1); tap.addPointer(down1);
gestureArena.close(1); Gesturer.instance.gestureArena.close(1);
expect(tapsRecognized, 0); expect(tapsRecognized, 0);
router.route(down1); Gesturer.instance.pointerRouter.route(down1);
expect(tapsRecognized, 0); expect(tapsRecognized, 0);
tap.addPointer(down2); tap.addPointer(down2);
gestureArena.close(2); Gesturer.instance.gestureArena.close(2);
expect(tapsRecognized, 0); expect(tapsRecognized, 0);
router.route(down1); Gesturer.instance.pointerRouter.route(down1);
expect(tapsRecognized, 0); expect(tapsRecognized, 0);
router.route(up1); Gesturer.instance.pointerRouter.route(up1);
expect(tapsRecognized, 1); expect(tapsRecognized, 1);
gestureArena.sweep(1); Gesturer.instance.gestureArena.sweep(1);
expect(tapsRecognized, 1); expect(tapsRecognized, 1);
router.route(up2); Gesturer.instance.pointerRouter.route(up2);
expect(tapsRecognized, 1); expect(tapsRecognized, 1);
gestureArena.sweep(2); Gesturer.instance.gestureArena.sweep(2);
expect(tapsRecognized, 1); expect(tapsRecognized, 1);
tap.dispose(); tap.dispose();
}); });
test('Distance cancels tap', () { test('Distance cancels tap', () {
PointerRouter router = new PointerRouter(); TapGestureRecognizer tap = new TapGestureRecognizer();
GestureArena gestureArena = new GestureArena();
TapGestureRecognizer tap = new TapGestureRecognizer(
router: router,
gestureArena: gestureArena
);
bool tapRecognized = false; bool tapRecognized = false;
tap.onTap = () { tap.onTap = () {
...@@ -173,20 +156,20 @@ void main() { ...@@ -173,20 +156,20 @@ void main() {
}; };
tap.addPointer(down3); tap.addPointer(down3);
gestureArena.close(3); Gesturer.instance.gestureArena.close(3);
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
expect(tapCanceled, isFalse); expect(tapCanceled, isFalse);
router.route(down3); Gesturer.instance.pointerRouter.route(down3);
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
expect(tapCanceled, isFalse); expect(tapCanceled, isFalse);
router.route(move3); Gesturer.instance.pointerRouter.route(move3);
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
expect(tapCanceled, isTrue); expect(tapCanceled, isTrue);
router.route(up3); Gesturer.instance.pointerRouter.route(up3);
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
expect(tapCanceled, isTrue); expect(tapCanceled, isTrue);
gestureArena.sweep(3); Gesturer.instance.gestureArena.sweep(3);
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
expect(tapCanceled, isTrue); expect(tapCanceled, isTrue);
...@@ -194,12 +177,7 @@ void main() { ...@@ -194,12 +177,7 @@ void main() {
}); });
test('Timeout does not cancel tap', () { test('Timeout does not cancel tap', () {
PointerRouter router = new PointerRouter(); TapGestureRecognizer tap = new TapGestureRecognizer();
GestureArena gestureArena = new GestureArena();
TapGestureRecognizer tap = new TapGestureRecognizer(
router: router,
gestureArena: gestureArena
);
bool tapRecognized = false; bool tapRecognized = false;
tap.onTap = () { tap.onTap = () {
...@@ -208,16 +186,16 @@ void main() { ...@@ -208,16 +186,16 @@ void main() {
new FakeAsync().run((FakeAsync async) { new FakeAsync().run((FakeAsync async) {
tap.addPointer(down1); tap.addPointer(down1);
gestureArena.close(1); Gesturer.instance.gestureArena.close(1);
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
router.route(down1); Gesturer.instance.pointerRouter.route(down1);
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
async.elapse(new Duration(milliseconds: 500)); async.elapse(new Duration(milliseconds: 500));
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
router.route(up1); Gesturer.instance.pointerRouter.route(up1);
expect(tapRecognized, isTrue); expect(tapRecognized, isTrue);
gestureArena.sweep(1); Gesturer.instance.gestureArena.sweep(1);
expect(tapRecognized, isTrue); expect(tapRecognized, isTrue);
}); });
...@@ -225,12 +203,7 @@ void main() { ...@@ -225,12 +203,7 @@ void main() {
}); });
test('Should yield to other arena members', () { test('Should yield to other arena members', () {
PointerRouter router = new PointerRouter(); TapGestureRecognizer tap = new TapGestureRecognizer();
GestureArena gestureArena = new GestureArena();
TapGestureRecognizer tap = new TapGestureRecognizer(
router: router,
gestureArena: gestureArena
);
bool tapRecognized = false; bool tapRecognized = false;
tap.onTap = () { tap.onTap = () {
...@@ -239,16 +212,16 @@ void main() { ...@@ -239,16 +212,16 @@ void main() {
tap.addPointer(down1); tap.addPointer(down1);
TestGestureArenaMember member = new TestGestureArenaMember(); TestGestureArenaMember member = new TestGestureArenaMember();
GestureArenaEntry entry = gestureArena.add(1, member); GestureArenaEntry entry = Gesturer.instance.gestureArena.add(1, member);
gestureArena.hold(1); Gesturer.instance.gestureArena.hold(1);
gestureArena.close(1); Gesturer.instance.gestureArena.close(1);
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
router.route(down1); Gesturer.instance.pointerRouter.route(down1);
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
router.route(up1); Gesturer.instance.pointerRouter.route(up1);
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
gestureArena.sweep(1); Gesturer.instance.gestureArena.sweep(1);
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
entry.resolve(GestureDisposition.accepted); entry.resolve(GestureDisposition.accepted);
...@@ -258,12 +231,7 @@ void main() { ...@@ -258,12 +231,7 @@ void main() {
}); });
test('Should trigger on release of held arena', () { test('Should trigger on release of held arena', () {
PointerRouter router = new PointerRouter(); TapGestureRecognizer tap = new TapGestureRecognizer();
GestureArena gestureArena = new GestureArena();
TapGestureRecognizer tap = new TapGestureRecognizer(
router: router,
gestureArena: gestureArena
);
bool tapRecognized = false; bool tapRecognized = false;
tap.onTap = () { tap.onTap = () {
...@@ -272,16 +240,16 @@ void main() { ...@@ -272,16 +240,16 @@ void main() {
tap.addPointer(down1); tap.addPointer(down1);
TestGestureArenaMember member = new TestGestureArenaMember(); TestGestureArenaMember member = new TestGestureArenaMember();
GestureArenaEntry entry = gestureArena.add(1, member); GestureArenaEntry entry = Gesturer.instance.gestureArena.add(1, member);
gestureArena.hold(1); Gesturer.instance.gestureArena.hold(1);
gestureArena.close(1); Gesturer.instance.gestureArena.close(1);
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
router.route(down1); Gesturer.instance.pointerRouter.route(down1);
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
router.route(up1); Gesturer.instance.pointerRouter.route(up1);
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
gestureArena.sweep(1); Gesturer.instance.gestureArena.sweep(1);
expect(tapRecognized, isFalse); expect(tapRecognized, isFalse);
entry.resolve(GestureDisposition.rejected); entry.resolve(GestureDisposition.rejected);
......
...@@ -11,22 +11,16 @@ void main() { ...@@ -11,22 +11,16 @@ void main() {
test('Can tap a hyperlink', () { test('Can tap a hyperlink', () {
testWidgets((WidgetTester tester) { testWidgets((WidgetTester tester) {
bool didTapLeft = false; bool didTapLeft = false;
TapGestureRecognizer tapLeft = new TapGestureRecognizer( TapGestureRecognizer tapLeft = new TapGestureRecognizer()
router: Gesturer.instance.pointerRouter, ..onTap = () {
gestureArena: Gesturer.instance.gestureArena,
onTap: () {
didTapLeft = true; didTapLeft = true;
} };
);
bool didTapRight = false; bool didTapRight = false;
TapGestureRecognizer tapRight = new TapGestureRecognizer( TapGestureRecognizer tapRight = new TapGestureRecognizer()
router: Gesturer.instance.pointerRouter, ..onTap = () {
gestureArena: Gesturer.instance.gestureArena,
onTap: () {
didTapRight = true; didTapRight = true;
} };
);
Key textKey = new Key('text'); Key textKey = new Key('text');
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment