createGestureDetector method

Widget createGestureDetector({
  1. required Widget child,
  2. TouchRippleEventCallBack? onTap,
  3. TouchRippleEventAsyncCallBack<T>? onTapAsync,
  4. TouchRippleEventCallBack? onTapAsyncStart,
  5. TouchRippleEventResponseCallback<T>? onTapAsyncEnd,
  6. TouchRippleEventCallBack? onDoubleTap,
  7. TouchRippleStateCallBack? onDoubleTapStart,
  8. TouchRippleStateCallBack? onDoubleTapEnd,
  9. TouchRippleContinuableCheckedCallBack? onLongTap,
  10. TouchRippleStateCallBack? onLongTapStart,
  11. TouchRippleStateCallBack? onLongTapEnd,
  12. TouchRippleStateCallBack? onFocusStart,
  13. TouchRippleStateCallBack? onFocusEnd,
})

Returns a new instance of GestureDetector corresponding to the given child.

Implementation

Widget createGestureDetector({
  required Widget child,
  TouchRippleEventCallBack? onTap,
  TouchRippleEventAsyncCallBack<T>? onTapAsync,
  TouchRippleEventCallBack? onTapAsyncStart,
  TouchRippleEventResponseCallback<T>? onTapAsyncEnd,
  TouchRippleEventCallBack? onDoubleTap,
  TouchRippleStateCallBack? onDoubleTapStart,
  TouchRippleStateCallBack? onDoubleTapEnd,
  TouchRippleContinuableCheckedCallBack? onLongTap,
  TouchRippleStateCallBack? onLongTapStart,
  TouchRippleStateCallBack? onLongTapEnd,
  TouchRippleStateCallBack? onFocusStart,
  TouchRippleStateCallBack? onFocusEnd,
}) {
  TouchRippleRecognizerCallback? tapCallback;
  TouchRippleRejectableCallback? rejectableTapCallback;
  TouchRippleRecognizerCountableCallback? doubleTapCallback;
  TouchRippleRecognizerCountableCallback? longTapCallback;
  TouchRippleRejectableCallback? rejectableLongTapCallback;
  // TouchRippleRecognizerCallback? onHorizontalDragCallback;
  // TouchRippleRecognizerCallback? onVerticalDragCallback;

  if (onTap != null) {
    TouchRippleState createTouchRippleState(Offset baseOffset, {required bool isRejectable}) {
      final newState = controller.createState(
        behavior: tapBehavior,
        callback: onTap,
        eventedOffset: baseOffset,
        isRejectable: isRejectable,
      );
      return newState;
    }

    tapCallback = (Offset acceptedOffset) {
      final newState = _inspectCreateState(
        behavior: tapBehavior,
        onCreateState: () => createTouchRippleState(acceptedOffset, isRejectable: false),
      );
      attachTo(newState?..start());
    };

    rejectableTapCallback = (rejectableOffset) {
      final newState = createTouchRippleState(rejectableOffset, isRejectable: true);
      attachTo(newState..start());

      return newState;
    };
  }
  if (onTapAsync != null) {
    tapCallback = (acceptedOffset) {
      late T responsed;
      final newState = _inspectCreateState(
        behavior: tapBehavior,
        onCreateState: () => controller.createState(
          behavior: tapBehavior,
          callback: () => onTapAsyncEnd?.call(responsed),
          eventedOffset: acceptedOffset,
          isRejectable: true, // to wait for a response.
        ),
      );
      attachTo(newState?..start());

      onTapAsyncStart?.call();
      onTapAsync().then((value) {
        responsed = value;
        newState?.onAccepted();
      });
    };
  }
  if (onDoubleTap != null) {
    TouchRippleState createTouchRippleState(Offset baseOffset) {
      final newState = controller.createState(
        behavior: doubleTapBehavior,
        callback: onDoubleTap,
        eventedOffset: baseOffset,
        isRejectable: false,
      );
      return newState;
    }

    doubleTapCallback = (acceptedOffset, count) {
      final newState = _inspectCreateState(
        behavior: doubleTapBehavior,
        onCreateState: () => createTouchRippleState(acceptedOffset),
      );
      attachTo(newState?..start());

      if (widget.isDoubleTapContinuable == false) return false;
      return widget.onDoubleTapContinuableChecked?.call(count)
          ?? widget.isDoubleTapContinuable;
    };
  }
  if (widget.onLongTap != null) {
    TouchRippleState createTouchRippleState(Offset baseOffset) {
      final newState = controller.createState(
        behavior: longTapBehavior,
        callback: () {},
        eventedOffset: baseOffset,
        isRejectable: true,
      );
      return newState;
    }

    longTapCallback = (acceptedOffset, count) {
      return onLongTap?.call(count) ?? false;
    };
    rejectableLongTapCallback = (rejectableOffset) {
      final newState =  createTouchRippleState(rejectableOffset);
                        attachTo(newState..start());

      return newState;
    };
  }
  /*
  if (widget.onHorizontalDragStart != null
   || widget.onHorizontalDragUpdate != null
   || widget.onHorizontalDragEnd != null) {
    onHorizontalDragCallback = (acceptedOffset) {

    };
  }
  */

  TouchRippleFocusStartStateCallBack? focusStartCallBack;
  TouchRippleStateCallBack? focusEndCallBack;

  // The following code block takes the task of defining
  // the focus event callback functions.
  {
    focusStartCallBack = (instance) {
      if (widget.useFocusEffect == false) return;
      if (widget.useDoubleTapFocusEffect == false
       && instance is TouchRippleDoubleTapGestureRecognizer
       || widget.useLongTapFocusEffect == false
       && instance is TouchRippleLongTapGestureRecognizer) return;

      // If focus state already initialised,
      // it will fade back in without creating the state.
      if (controller.focusState == null) {
        Color getDefaultFocusColor() {
          return rippleColor.withAlpha(
            (rippleColor.alpha * widget.focusColorRelativeOpacity).toInt()
          );
        }

        final newState = controller.createBackgroundState(
          color: widget.focusColor ?? getDefaultFocusColor(),
          fadeInDuration: widget.focusFadeInDuration,
          fadeInCurve: widget.focusFadeInCurve,
          fadeOutDuration: widget.focusFadeOutDuration,
          fadeOutCurve: widget.focusFadeOutCurve,
          onDispatch: () {
            controller.focusState?.dispose();
            controller.focusState = null;
          },
        );
        controller.focusState = newState;
      }
      controller.focusState?.fadeIn();
      onFocusStart?.call();
    };
    focusEndCallBack = () {
      controller.focusState?.fadeOut();

      onFocusEnd?.call();
    };
  }

  /// Create gesture detector corresponding to the initialised
  /// gesture event callback functions.
  return widget.createGestureDetector(
    onTap: tapCallback,
    onRejectableTap: rejectableTapCallback,
    onDoubleTap: doubleTapCallback,
    onDoubleTapStart: onDoubleTapStart,
    onDoubleTapEnd: onDoubleTapEnd,
    onLongTap: longTapCallback,
    onRejectableLongTap: rejectableLongTapCallback,
    onLongTapStart: onLongTapStart,
    onLongTapEnd: onLongTapEnd,
    onAccepted: (acceptedState) => acceptedState.onAccepted(),
    onRejected: (rejectedState) => rejectedState.onRejected(),
    onFocusStart: focusStartCallBack,
    onFocusEnd: focusEndCallBack,
    longTappableDuration: widget.longTappableDuration ?? longTapBehavior.spreadDuration,
    child: child,
  );
}