12

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

CopsOnRoad
  • 237,138
  • 77
  • 654
  • 440
Karim Mirazul
  • 318
  • 1
  • 3
  • 12

3 Answers3

28

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')
)
tim-montague
  • 16,217
  • 5
  • 62
  • 51
Igor Gor
  • 391
  • 4
  • 8
5

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(){}
}
Manukumar S B
  • 128
  • 1
  • 11
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

Saige Zhang
  • 737
  • 1
  • 7
  • 18