createGestureDetector method
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,
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,
);
}