Merge pull request #1468 from abarth/pan_crash
Detecting just Pan events causes an exception in GestureDetector
This commit is contained in:
commit
8faa778952
@ -12,7 +12,9 @@ import 'package:sky/src/gestures/pointer_router.dart';
|
|||||||
export 'package:sky/src/gestures/pointer_router.dart' show PointerRouter;
|
export 'package:sky/src/gestures/pointer_router.dart' show PointerRouter;
|
||||||
|
|
||||||
abstract class GestureRecognizer extends GestureArenaMember {
|
abstract class GestureRecognizer extends GestureArenaMember {
|
||||||
GestureRecognizer({ PointerRouter router }) : _router = router;
|
GestureRecognizer({ PointerRouter router }) : _router = router {
|
||||||
|
assert(_router != null);
|
||||||
|
}
|
||||||
|
|
||||||
PointerRouter _router;
|
PointerRouter _router;
|
||||||
|
|
||||||
|
@ -190,7 +190,7 @@ class GestureDetectorState extends State<GestureDetector> {
|
|||||||
|
|
||||||
void _syncScale() {
|
void _syncScale() {
|
||||||
if (config.onScaleStart == null && config.onScaleUpdate == null && config.onScaleEnd == null) {
|
if (config.onScaleStart == null && config.onScaleUpdate == null && config.onScaleEnd == null) {
|
||||||
_scale = _ensureDisposed(_pan);
|
_scale = _ensureDisposed(_scale);
|
||||||
} else {
|
} else {
|
||||||
_ensureScale()
|
_ensureScale()
|
||||||
..onStart = config.onScaleStart
|
..onStart = config.onScaleStart
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import 'package:sky/rendering.dart';
|
||||||
import 'package:sky/widgets.dart';
|
import 'package:sky/widgets.dart';
|
||||||
import 'package:test/test.dart';
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
@ -29,7 +30,8 @@ void main() {
|
|||||||
)
|
)
|
||||||
));
|
));
|
||||||
expect(detectedSize, equals(const Size(50.0, 25.0)));
|
expect(detectedSize, equals(const Size(50.0, 25.0)));
|
||||||
expect(inner.currentContext.findRenderObject().localToGlobal(Point.origin), equals(const Point(25.0, 37.5)));
|
RenderBox box = inner.currentContext.findRenderObject();
|
||||||
|
expect(box.localToGlobal(Point.origin), equals(const Point(25.0, 37.5)));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -88,4 +88,38 @@ void main() {
|
|||||||
tester.pumpWidget(new Container());
|
tester.pumpWidget(new Container());
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Pan doesn\'t crash', () {
|
||||||
|
testWidgets((WidgetTester tester) {
|
||||||
|
bool didStartPan = false;
|
||||||
|
Offset panDelta;
|
||||||
|
bool didEndPan = false;
|
||||||
|
|
||||||
|
tester.pumpWidget(
|
||||||
|
new GestureDetector(
|
||||||
|
onPanStart: () {
|
||||||
|
didStartPan = true;
|
||||||
|
},
|
||||||
|
onPanUpdate: (Offset delta) {
|
||||||
|
panDelta = delta;
|
||||||
|
},
|
||||||
|
onPanEnd: (_) {
|
||||||
|
didEndPan = true;
|
||||||
|
},
|
||||||
|
child: new Container()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(didStartPan, isFalse);
|
||||||
|
expect(panDelta, isNull);
|
||||||
|
expect(didEndPan, isFalse);
|
||||||
|
|
||||||
|
tester.scrollAt(new Point(10.0, 10.0), new Offset(20.0, 30.0));
|
||||||
|
|
||||||
|
expect(didStartPan, isTrue);
|
||||||
|
expect(panDelta.dx, 20.0);
|
||||||
|
expect(panDelta.dy, 30.0);
|
||||||
|
expect(didEndPan, isTrue);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
@ -145,7 +145,10 @@ class WidgetTester {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void scroll(Element element, Offset offset, { int pointer: 1 }) {
|
void scroll(Element element, Offset offset, { int pointer: 1 }) {
|
||||||
Point startLocation = getCenter(element);
|
scrollAt(getCenter(element), offset, pointer: pointer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void scrollAt(Point startLocation, Offset offset, { int pointer: 1 }) {
|
||||||
Point endLocation = startLocation + offset;
|
Point endLocation = startLocation + offset;
|
||||||
TestPointer p = new TestPointer(pointer);
|
TestPointer p = new TestPointer(pointer);
|
||||||
// Events for the entire press-drag-release gesture are dispatched
|
// Events for the entire press-drag-release gesture are dispatched
|
||||||
|
Loading…
x
Reference in New Issue
Block a user