Friday, November 6, 2026
HomeiOS Developmentandroid - Flutter two finger swipe up and down

android – Flutter two finger swipe up and down

[ad_1]

I am engaged on a launcher app with gestures settings and I am searching for a technique to obtain two-finger swipe up and down gestures, i discovered that it may be achieved by utilizing RawGestureDetector and MultiDragGestureRecognizer

i attempted this code pattern beneath however it does not appear to work , anybody have any concept the right way to obtain this ?

import 'package deal:flutter/gestures.dart';
import 'package deal:flutter/materials.dart';

class TwoFingerPointerWidget extends StatelessWidget {
  last Widget baby;
  last OnUpdate onUpdate;

  TwoFingerPointerWidget({required this.baby, required this.onUpdate});

  @override
  Widget construct(BuildContext context) {
    return RawGestureDetector(
      gestures: <Kind, GestureRecognizerFactory>{
        CustomVerticalMultiDragGestureRecognizer:
            GestureRecognizerFactoryWithHandlers<
                CustomVerticalMultiDragGestureRecognizer>(
          () => CustomVerticalMultiDragGestureRecognizer(debugOwner: null),
          (CustomVerticalMultiDragGestureRecognizer occasion) {
            occasion.onStart = (Offset place) {
              return CustomDrag(occasions: occasion.occasions, onUpdate: onUpdate);
            };
          },
        ),
      },
      baby: baby,
    );
  }
}

typedef OnUpdate(DragUpdateDetails particulars);

class CustomDrag extends Drag {
  last Checklist<PointerDownEvent> occasions;

  last OnUpdate onUpdate;

  CustomDrag({required this.occasions, required this.onUpdate});

  @override
  void replace(DragUpdateDetails particulars) {
    tremendous.replace(particulars);
    last delta = particulars.delta;
    if (delta.dy.abs() > 0 && occasions.size == 2) {
      onUpdate.name(DragUpdateDetails(
        sourceTimeStamp: particulars.sourceTimeStamp,
        delta: Offset(0, delta.dy),
        primaryDelta: particulars.primaryDelta,
        globalPosition: particulars.globalPosition,
        localPosition: particulars.localPosition,
      ));
    }
  }

  @override
  void finish(DragEndDetails particulars) {
    tremendous.finish(particulars);
  }
}

class CustomVerticalMultiDragGestureRecognizer
    extends MultiDragGestureRecognizer {
  last Checklist<PointerDownEvent> occasions = [];

  CustomVerticalMultiDragGestureRecognizer({required Object? debugOwner})
      : tremendous(debugOwner: debugOwner);

  @override
  createNewPointerState(PointerDownEvent occasion) {
    occasions.add(occasion);
    return _CustomVerticalPointerState(occasion.place, onDisposeState: () {
      occasions.take away(occasion);
    });
  }

  @override
  String get debugDescription => 'customized vertical multidrag';
}

typedef OnDisposeState();

class _CustomVerticalPointerState extends MultiDragPointerState {
  last OnDisposeState onDisposeState;

  _CustomVerticalPointerState(Offset initialPosition,
      {required this.onDisposeState})
      : tremendous(initialPosition, PointerDeviceKind.contact, null);

  @override
  void checkForResolutionAfterMove() {
    if (pendingDelta!.dy.abs() > kTouchSlop) {
      resolve(GestureDisposition.accepted);
    }
  }

  @override
  void accepted(GestureMultiDragStartCallback starter) {
    starter(initialPosition);
  }

  @override
  void dispose() {
    onDisposeState.name();
    tremendous.dispose();
  }
}

[ad_2]

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments