How to disable multi-touch in mobile application using flutter
Solution 1
Create an instance of OnlyOnePointerRecognizerWidget
widget and pass any Widget as a child to it. OnlyOnePointerRecognizerWidget
will recognize only one pointer.
import 'package:flutter/material.dart' show
StatelessWidget, Widget, BuildContext, RawGestureDetector,
GestureRecognizerFactory, GestureRecognizerFactoryWithHandlers
;
import 'package:flutter/gestures.dart' show
OneSequenceGestureRecognizer, PointerDownEvent, GestureDisposition,
PointerEvent
;
class OnlyOnePointerRecognizer extends OneSequenceGestureRecognizer {
int _p = 0;
@override
void addPointer(PointerDownEvent event) {
startTrackingPointer(event.pointer);
if (_p == 0) {
resolve(GestureDisposition.rejected);
_p = event.pointer;
} else {
resolve(GestureDisposition.accepted);
}
}
@override
String get debugDescription => 'only one pointer recognizer';
@override
void didStopTrackingLastPointer(int pointer) {}
@override
void handleEvent(PointerEvent event) {
if (!event.down && event.pointer == _p) {
_p = 0;
}
}
}
class OnlyOnePointerRecognizerWidget extends StatelessWidget {
final Widget? child;
OnlyOnePointerRecognizerWidget({ this.child });
@override
Widget build(BuildContext context) {
return RawGestureDetector(
gestures: <Type, GestureRecognizerFactory>{
OnlyOnePointerRecognizer: GestureRecognizerFactoryWithHandlers<OnlyOnePointerRecognizer>(
() => OnlyOnePointerRecognizer(),
(OnlyOnePointerRecognizer instance) {}
)
},
child: child
);
}
}
Implementation example:
OnlyOnePointerRecognizerWidget(
child: Text('test')
)
Solution 2
Issue fixed by using ImmediateMultiDragGestureRecognizer() the below code shows how we can use it.
child: RawGestureDetector(
behavior: HitTestBehavior.opaque,
gestures: <Type, GestureRecognizerFactory>{
ImmediateMultiDragGestureRecognizer:
GestureRecognizerFactoryWithHandlers<
ImmediateMultiDragGestureRecognizer>(
() => ImmediateMultiDragGestureRecognizer(),
(ImmediateMultiDragGestureRecognizer instance) {
instance..onStart = _handleOnStart;
},
),
},
Drag _handleOnStart(Offset position) {
if (count < 1) {
setState(() {
count++;
});
return _DragHandler(_handleDragUpdate, _handleDragEnd);
}
return null;
}
void _handleDragUpdate(DragUpdateDetails update) {
//code is here
}
void _handleDragEnd(DragEndDetails details) {
//code is here
}
setState(() {
count = 0;
});
}
class _DragHandler extends Drag {
_DragHandler(this.onUpdate, this.onEnd);
final GestureDragUpdateCallback onUpdate;
final GestureDragEndCallback onEnd;
@override
void update(DragUpdateDetails details) {
onUpdate(details);
}
@override
void end(DragEndDetails details) {
onEnd(details);
}
@override
void cancel(){}
}
Solution 3
It sounds like you want a MultiDragGestureRecognizer. You'll need to create a StatefulWidget that instantiates the MultiDragGestureRecognizer, then have your build function have a Listener that routes the onPointerDown event to the recognizer. We could probably add that recognizer to GestureDetector itself, or provide a widget that wraps that recognizer, if it's something people do commonly. More importantly, we should probably document this. I'm leaving this bug open for that purpose. flutter gestures library
Karim Mirazul
Updated on December 06, 2022Comments
-
Karim Mirazul over 1 year
This question is purely based on
GestureDetector
flutter.For Example: In Application,
GestureDetector
class is implemented so here by-default it support multi-touch, now need to disable this multi-touch so what could be the best way of a solution.GestureDetector
reference link: https://docs.flutter.io/flutter/widgets/GestureDetector-class.html