applyAdvancedGesturesDetectors function
Implementation
Widget applyAdvancedGesturesDetectors(Stage stage, Widget child) {
final isDraggableMixin = stage is HasDraggablesMixin;
if (!isDraggableMixin) return child;
final Map<Type, GestureRecognizerFactory> gestures = {};
int lastGeneratedDragId = 0;
void addAndConfigureRecognizer<T extends GestureRecognizer>(
T Function() ts,
void Function(T) bindHandlers,
) {
gestures[T] = GestureRecognizerFactoryWithHandlers<T>(ts, bindHandlers);
}
void addDragRecognizer(Stage stage, Drag Function(int, DragStartInfo) config) {
addAndConfigureRecognizer(
() => ImmediateMultiDragGestureRecognizer(),
(ImmediateMultiDragGestureRecognizer instance) {
instance.onStart = (Offset o) {
final pointerId = lastGeneratedDragId++;
final global = o;
final local = stage.convertGlobalToLocalCoordinate(global.toVector2()).toOffset();
final details = DragStartDetails(
localPosition: local,
globalPosition: global,
);
return config(pointerId, DragStartInfo.fromDetails(stage, details));
};
},
);
}
if (isDraggableMixin) {
addDragRecognizer(stage, (int pointerId, DragStartInfo position) {
stage.onDragStart(pointerId, position);
return _DragEvent(
stage,
onUpdate: (details) => stage.onDragUpdate(pointerId, details),
onEnd: (details) => stage.onDragEnd(pointerId, details),
onCancel: () => stage.onDragCancel(pointerId),
);
});
}
return RawGestureDetector(
gestures: gestures,
behavior: HitTestBehavior.opaque,
child: child,
);
}