diff --git a/lib/common/widgets/gesture/immediate_tap_gesture_recognizer.dart b/lib/common/widgets/gesture/immediate_tap_gesture_recognizer.dart index 545c49a13..ffc9a2b16 100644 --- a/lib/common/widgets/gesture/immediate_tap_gesture_recognizer.dart +++ b/lib/common/widgets/gesture/immediate_tap_gesture_recognizer.dart @@ -5,53 +5,60 @@ class ImmediateTapGestureRecognizer extends OneSequenceGestureRecognizer { ImmediateTapGestureRecognizer({ super.debugOwner, super.supportedDevices, - super.allowedButtonsFilter, + super.allowedButtonsFilter = _defaultButtonAcceptBehavior, this.onTapDown, - required this.onTapUp, + this.onTapUp, this.onTapCancel, this.onTap, }); + static bool _defaultButtonAcceptBehavior(int buttons) => + buttons == kPrimaryButton; + GestureTapDownCallback? onTapDown; - final GestureTapUpCallback onTapUp; + GestureTapUpCallback? onTapUp; - final GestureTapCancelCallback? onTapCancel; + GestureTapCancelCallback? onTapCancel; - final GestureTapCallback? onTap; + GestureTapCallback? onTap; PointerUpEvent? _up; - int _activePointer = 0; + int? _activePointer; bool _sentTapDown = false; bool _wonArena = false; + Offset? _initialPosition; @override bool isPointerPanZoomAllowed(PointerPanZoomStartEvent event) => false; @override bool isPointerAllowed(PointerDownEvent event) => - _activePointer == 0 && super.isPointerAllowed(event); + _activePointer == null && super.isPointerAllowed(event); @override void addAllowedPointer(PointerDownEvent event) { super.addAllowedPointer(event); _reset(event.pointer); + _handleTapDown(event); + _initialPosition = event.position; } @override void handleEvent(PointerEvent event) { if (event.pointer != _activePointer) { + resolvePointer(event.pointer, GestureDisposition.rejected); stopTrackingPointer(event.pointer); return; } - if (event is PointerDownEvent) { - _handleTapDown(event); - } else if (event is PointerMoveEvent) { + if (event is PointerMoveEvent) { _handlePointerMove(event); } else if (event is PointerUpEvent) { _up = event; _handlePointerUp(event); + } else if (event is PointerCancelEvent) { + resolve(GestureDisposition.rejected); } stopTrackingIfPointerNoLongerDown(event); @@ -59,9 +66,9 @@ class ImmediateTapGestureRecognizer extends OneSequenceGestureRecognizer { void _handleTapDown(PointerDownEvent event) { if (_sentTapDown) return; + _sentTapDown = true; if (onTapDown != null) { - _sentTapDown = true; final details = TapDownDetails( globalPosition: event.position, localPosition: event.localPosition, @@ -72,8 +79,8 @@ class ImmediateTapGestureRecognizer extends OneSequenceGestureRecognizer { } void _handlePointerMove(PointerMoveEvent event) { - if (event.delta.distanceSquared > 2.0) { - _cancelGesture('pointer moved'); + if ((event.position - _initialPosition!).distance > 2.0) { + resolve(GestureDisposition.rejected); stopTrackingPointer(event.pointer); } } @@ -85,12 +92,14 @@ class ImmediateTapGestureRecognizer extends OneSequenceGestureRecognizer { } void _handleTapUp(PointerUpEvent event) { - final details = TapUpDetails( - globalPosition: event.position, - localPosition: event.localPosition, - kind: event.kind, - ); - invokeCallback('onTapUp', () => onTapUp(details)); + if (onTapUp != null) { + final details = TapUpDetails( + globalPosition: event.position, + localPosition: event.localPosition, + kind: event.kind, + ); + invokeCallback('onTapUp', () => onTapUp!(details)); + } if (onTap != null) { invokeCallback('onTap', onTap!); @@ -106,7 +115,7 @@ class ImmediateTapGestureRecognizer extends OneSequenceGestureRecognizer { _reset(); } - void _reset([int pointer = 0]) { + void _reset([int? pointer]) { _activePointer = pointer; _up = null; _sentTapDown = false; @@ -138,13 +147,7 @@ class ImmediateTapGestureRecognizer extends OneSequenceGestureRecognizer { @override void didStopTrackingLastPointer(int pointer) { - // wait for arena - } - - @override - void dispose() { - _cancelGesture('disposed'); - super.dispose(); + _initialPosition = null; } @override diff --git a/lib/pages/article/widgets/opus_content.dart b/lib/pages/article/widgets/opus_content.dart index 5975b5973..947ec1c55 100644 --- a/lib/pages/article/widgets/opus_content.dart +++ b/lib/pages/article/widgets/opus_content.dart @@ -1,5 +1,6 @@ import 'dart:math' as math; +import 'package:PiliPlus/common/widgets/gesture/immediate_tap_gesture_recognizer.dart'; import 'package:PiliPlus/common/widgets/image/cached_network_svg_image.dart'; import 'package:PiliPlus/common/widgets/image/custom_grid_view.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -18,7 +19,6 @@ import 'package:PiliPlus/utils/image_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/foundation.dart' show kDebugMode; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:get/get_core/src/get_main.dart'; import 'package:get/get_navigation/src/extension_navigation.dart'; @@ -69,7 +69,7 @@ class OpusContent extends StatelessWidget { ? null : colorScheme.primary, ), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () { switch (rich.type) { case 'RICH_TEXT_NODE_TYPE_AT': @@ -293,7 +293,7 @@ class OpusContent extends StatelessWidget { return TextSpan( text: '${hasUrl ? '\u{1F517}' : ''}$text', recognizer: hasUrl - ? (TapGestureRecognizer() + ? (ImmediateTapGestureRecognizer() ..onTap = () => PiliScheme.routePushFromUrl(jumpUrl)) : null, diff --git a/lib/pages/audio/view.dart b/lib/pages/audio/view.dart index b9f9d5c9d..1c4c78d0e 100644 --- a/lib/pages/audio/view.dart +++ b/lib/pages/audio/view.dart @@ -3,6 +3,7 @@ import 'dart:math' show min; import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; +import 'package:PiliPlus/common/widgets/gesture/immediate_tap_gesture_recognizer.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/progress_bar/audio_video_progress_bar.dart'; import 'package:PiliPlus/grpc/bilibili/app/listener/v1.pb.dart'; @@ -24,7 +25,6 @@ import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/utils.dart'; -import 'package:flutter/gestures.dart' show TapGestureRecognizer; import 'package:flutter/material.dart' hide DraggableScrollableSheet; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:get/get.dart'; @@ -919,7 +919,7 @@ class _AudioPageState extends State { TextSpan( text: audioItem.arc.displayedOid, style: TextStyle(color: colorScheme.secondary), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () => Utils.copyText( audioItem.arc.displayedOid, ), diff --git a/lib/pages/dynamics/widgets/additional_panel.dart b/lib/pages/dynamics/widgets/additional_panel.dart index 83f8aff68..341ea0cfa 100644 --- a/lib/pages/dynamics/widgets/additional_panel.dart +++ b/lib/pages/dynamics/widgets/additional_panel.dart @@ -1,5 +1,6 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/flutter/dyn/ink_well.dart'; +import 'package:PiliPlus/common/widgets/gesture/immediate_tap_gesture_recognizer.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/http/dynamics.dart'; import 'package:PiliPlus/http/loading_state.dart'; @@ -8,7 +9,6 @@ import 'package:PiliPlus/pages/dynamics/widgets/vote.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:PiliPlus/utils/num_utils.dart'; import 'package:flutter/foundation.dart' show kDebugMode; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart' hide InkWell; import 'package:get/get.dart'; @@ -125,7 +125,7 @@ Widget addWidget( ), recognizer: reserve.desc3!.jumpUrl == null ? null - : (TapGestureRecognizer() + : (ImmediateTapGestureRecognizer() ..onTap = () { Get.toNamed( '/webview', @@ -261,7 +261,7 @@ Widget addWidget( ), recognizer: content.desc!.jumpUrl == null ? null - : (TapGestureRecognizer() + : (ImmediateTapGestureRecognizer() ..onTap = () { Get.toNamed( '/webview', diff --git a/lib/pages/dynamics/widgets/interaction.dart b/lib/pages/dynamics/widgets/interaction.dart index 26c5f2af1..a7a3a2a5f 100644 --- a/lib/pages/dynamics/widgets/interaction.dart +++ b/lib/pages/dynamics/widgets/interaction.dart @@ -1,6 +1,6 @@ +import 'package:PiliPlus/common/widgets/gesture/immediate_tap_gesture_recognizer.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:flutter/foundation.dart' show kDebugMode; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:get/get_core/src/get_main.dart'; @@ -78,7 +78,7 @@ Widget _item( ? null : TextStyle(color: theme.colorScheme.onSurfaceVariant), recognizer: isAt - ? (TapGestureRecognizer() + ? (ImmediateTapGestureRecognizer() ..onTap = () => Get.toNamed('/member?mid=${e.rid}')) : null, ); diff --git a/lib/pages/dynamics/widgets/rich_node_panel.dart b/lib/pages/dynamics/widgets/rich_node_panel.dart index 307f053cf..1f886f3ec 100644 --- a/lib/pages/dynamics/widgets/rich_node_panel.dart +++ b/lib/pages/dynamics/widgets/rich_node_panel.dart @@ -1,5 +1,6 @@ import 'dart:io' show Platform; +import 'package:PiliPlus/common/widgets/gesture/immediate_tap_gesture_recognizer.dart'; import 'package:PiliPlus/common/widgets/image/custom_grid_view.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/http/dynamics.dart'; @@ -12,7 +13,6 @@ import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/pages/dynamics/widgets/vote.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/foundation.dart' show kDebugMode; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -70,7 +70,7 @@ TextSpan? richNode( TextSpan( text: ' ${i.text}', style: style, - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () => Get.toNamed('/member?mid=${i.rid}'), ), ); @@ -81,7 +81,7 @@ TextSpan? richNode( TextSpan( text: i.origText, style: style, - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () => Get.toNamed( '/searchResult', parameters: { @@ -113,7 +113,7 @@ TextSpan? richNode( style: style, recognizer: i.origText == null ? null - : (TapGestureRecognizer() + : (ImmediateTapGestureRecognizer() ..onTap = () => PageUtils.handleWebview(i.origText!)), ), ); @@ -135,7 +135,7 @@ TextSpan? richNode( TextSpan( text: '投票:${i.text}', style: style, - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () { final dynIdStr = item.basic?.commentIdStr; final dynId = dynIdStr != null @@ -177,7 +177,7 @@ TextSpan? richNode( TextSpan( text: '${i.origText} ', style: style, - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () => Get.toNamed( '/webview', parameters: { @@ -207,7 +207,7 @@ TextSpan? richNode( style: style, recognizer: i.jumpUrl == null ? null - : (TapGestureRecognizer() + : (ImmediateTapGestureRecognizer() ..onTap = () => PageUtils.handleWebview(i.jumpUrl!)), ), ); @@ -229,7 +229,7 @@ TextSpan? richNode( TextSpan( text: '${i.text} ', style: style, - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () async { try { int? cid = await SearchHttp.ab2c(bvid: i.rid); @@ -272,7 +272,7 @@ TextSpan? richNode( TextSpan( text: i.text, style: style, - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () { void onView(List list) { PageUtils.imageView( @@ -328,7 +328,7 @@ TextSpan? richNode( style: style, recognizer: i.jumpUrl == null ? null - : (TapGestureRecognizer() + : (ImmediateTapGestureRecognizer() ..onTap = () => PageUtils.handleWebview(i.jumpUrl!)), ), ); @@ -340,7 +340,7 @@ TextSpan? richNode( style: style, recognizer: i.jumpUrl == null ? null - : (TapGestureRecognizer() + : (ImmediateTapGestureRecognizer() ..onTap = () => PageUtils.handleWebview(i.jumpUrl!)), ), ); diff --git a/lib/pages/live_room/widgets/chat_panel.dart b/lib/pages/live_room/widgets/chat_panel.dart index 19b69c80c..ad24a64f8 100644 --- a/lib/pages/live_room/widgets/chat_panel.dart +++ b/lib/pages/live_room/widgets/chat_panel.dart @@ -1,4 +1,5 @@ import 'package:PiliPlus/common/widgets/flutter/popup_menu.dart'; +import 'package:PiliPlus/common/widgets/gesture/immediate_tap_gesture_recognizer.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/http/live.dart'; import 'package:PiliPlus/models/common/image_type.dart'; @@ -11,7 +12,6 @@ import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/foundation.dart' show kDebugMode; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -84,7 +84,7 @@ class LiveRoomChatPanel extends StatelessWidget { ), recognizer: item.uid == 0 ? null - : (TapGestureRecognizer() + : (ImmediateTapGestureRecognizer() ..onTapUp = (e) => _showMsgMenu( context, itemContext, @@ -99,7 +99,7 @@ class LiveRoomChatPanel extends StatelessWidget { color: primary, fontSize: 14, ), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () => Get.toNamed('/member?mid=${reply.mid}'), ), diff --git a/lib/pages/msg_feed_top/sys_msg/view.dart b/lib/pages/msg_feed_top/sys_msg/view.dart index 850514a4a..44f0d660b 100644 --- a/lib/pages/msg_feed_top/sys_msg/view.dart +++ b/lib/pages/msg_feed_top/sys_msg/view.dart @@ -2,6 +2,7 @@ import 'package:PiliPlus/common/skeleton/msg_feed_sys_msg_.dart'; import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; import 'package:PiliPlus/common/widgets/flutter/list_tile.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; +import 'package:PiliPlus/common/widgets/gesture/immediate_tap_gesture_recognizer.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models_new/msg/msg_sys/data.dart'; @@ -10,7 +11,6 @@ import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart' hide ListTile; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -145,7 +145,7 @@ class _SysMsgPageState extends State { TextSpan( text: match[1], style: TextStyle(color: theme.colorScheme.primary), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () { try { PiliScheme.routePushFromUrl(url); @@ -176,7 +176,7 @@ class _SysMsgPageState extends State { TextSpan( text: match[3], style: TextStyle(color: theme.colorScheme.primary), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () { PiliScheme.videoPush(validAv, validBv); }, @@ -195,7 +195,7 @@ class _SysMsgPageState extends State { TextSpan( text: '查看动态', style: TextStyle(color: theme.colorScheme.primary), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () { PageUtils.pushDynFromId(id: dynId).catchError( (err) => SmartDialog.showToast(err.toString()), @@ -212,7 +212,7 @@ class _SysMsgPageState extends State { TextSpan( text: '\u{1F517}网页链接', style: TextStyle(color: theme.colorScheme.primary), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () { PiliScheme.routePushFromUrl(matchStr); }, diff --git a/lib/pages/video/ai_conclusion/view.dart b/lib/pages/video/ai_conclusion/view.dart index 5eb918a7b..fdb3a4cd2 100644 --- a/lib/pages/video/ai_conclusion/view.dart +++ b/lib/pages/video/ai_conclusion/view.dart @@ -1,10 +1,10 @@ +import 'package:PiliPlus/common/widgets/gesture/immediate_tap_gesture_recognizer.dart'; import 'package:PiliPlus/models_new/video/video_ai_conclusion/model_result.dart'; import 'package:PiliPlus/pages/common/slide/common_slide_page.dart'; import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/pages/video/introduction/ugc/widgets/selectable_text.dart'; import 'package:PiliPlus/utils/duration_utils.dart'; import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -99,7 +99,7 @@ class AiConclusionPanel extends CommonSlidePage { ) : null, recognizer: tap - ? (TapGestureRecognizer() + ? (ImmediateTapGestureRecognizer() ..onTap = () { try { Get.find( diff --git a/lib/pages/video/introduction/ugc/view.dart b/lib/pages/video/introduction/ugc/view.dart index 773756c3b..f9c20984a 100644 --- a/lib/pages/video/introduction/ugc/view.dart +++ b/lib/pages/video/introduction/ugc/view.dart @@ -1,5 +1,6 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; +import 'package:PiliPlus/common/widgets/gesture/immediate_tap_gesture_recognizer.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/pendant_avatar.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart'; @@ -35,7 +36,6 @@ import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/request_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:expandable/expandable.dart'; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; @@ -639,7 +639,7 @@ class _UgcIntroPanelState extends State { TextSpan( text: matchStr, style: TextStyle(color: theme.colorScheme.primary), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () async { if (videoDetailCtr .plPlayerController @@ -702,7 +702,7 @@ class _UgcIntroPanelState extends State { TextSpan( text: matchStr, style: TextStyle(color: theme.colorScheme.primary), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () => PiliScheme.videoPush(aid, null), ), ); @@ -716,7 +716,7 @@ class _UgcIntroPanelState extends State { TextSpan( text: matchStr, style: TextStyle(color: theme.colorScheme.primary), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () => PiliScheme.videoPush(null, matchStr), ), ); @@ -728,7 +728,7 @@ class _UgcIntroPanelState extends State { TextSpan( text: matchStr, style: TextStyle(color: theme.colorScheme.primary), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () { try { Get.find( @@ -757,7 +757,7 @@ class _UgcIntroPanelState extends State { return TextSpan( text: '@${currentDesc.rawText}', style: TextStyle(color: colorSchemePrimary), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () => Get.toNamed('/member?mid=${currentDesc.bizId}'), ); default: diff --git a/lib/pages/video/reply/widgets/reply_item_grpc.dart b/lib/pages/video/reply/widgets/reply_item_grpc.dart index 8cdd098ec..00a38244a 100644 --- a/lib/pages/video/reply/widgets/reply_item_grpc.dart +++ b/lib/pages/video/reply/widgets/reply_item_grpc.dart @@ -4,6 +4,7 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/dialog/report.dart'; import 'package:PiliPlus/common/widgets/flutter/text/text.dart' as custom_text; +import 'package:PiliPlus/common/widgets/gesture/immediate_tap_gesture_recognizer.dart'; import 'package:PiliPlus/common/widgets/image/custom_grid_view.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/pendant_avatar.dart'; @@ -33,7 +34,6 @@ import 'package:PiliPlus/utils/utils.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:fixnum/fixnum.dart'; import 'package:flutter/foundation.dart' show kDebugMode; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -483,7 +483,7 @@ class ReplyItemGrpc extends StatelessWidget { style: TextStyle( color: theme.colorScheme.primary, ), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () { feedBack(); Get.toNamed( @@ -616,7 +616,7 @@ class ReplyItemGrpc extends StatelessWidget { style: TextStyle( color: theme.colorScheme.primary, ), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () { if (url.appUrlSchema.isEmpty) { if (RegExp( @@ -695,7 +695,7 @@ class ReplyItemGrpc extends StatelessWidget { TextSpan( text: matchStr, style: TextStyle(color: theme.colorScheme.primary), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () => Get.toNamed('/member?mid=${content.atNameToMid[name]}'), ), @@ -705,7 +705,7 @@ class ReplyItemGrpc extends StatelessWidget { TextSpan( text: '投票: ${content.vote.title}', style: TextStyle(color: theme.colorScheme.primary), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () => showVoteDialog(context, content.vote.id.toInt()), ), @@ -730,7 +730,7 @@ class ReplyItemGrpc extends StatelessWidget { ? TextStyle(color: theme.colorScheme.primary) : null, recognizer: isValid - ? (TapGestureRecognizer() + ? (ImmediateTapGestureRecognizer() ..onTap = () { // 跳转到指定位置 try { @@ -761,7 +761,7 @@ class ReplyItemGrpc extends StatelessWidget { TextSpan( text: matchStr, style: TextStyle(color: theme.colorScheme.primary), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () { Get.toNamed( '/searchResult', @@ -775,7 +775,7 @@ class ReplyItemGrpc extends StatelessWidget { TextSpan( text: matchStr, style: TextStyle(color: theme.colorScheme.primary), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () => PageUtils.handleWebview(matchStr), ), ); @@ -816,7 +816,7 @@ class ReplyItemGrpc extends StatelessWidget { : theme.colorScheme.secondary, ), recognizer: hasClickUrl - ? (TapGestureRecognizer() + ? (ImmediateTapGestureRecognizer() ..onTap = () => PageUtils.handleWebview(content.richText.note.clickUrl)) : null, diff --git a/lib/pages/whisper_detail/widget/chat_item.dart b/lib/pages/whisper_detail/widget/chat_item.dart index c485ba19a..b2df79f8c 100644 --- a/lib/pages/whisper_detail/widget/chat_item.dart +++ b/lib/pages/whisper_detail/widget/chat_item.dart @@ -3,6 +3,7 @@ import 'dart:math'; import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; +import 'package:PiliPlus/common/widgets/gesture/immediate_tap_gesture_recognizer.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/grpc/bilibili/im/interfaces/v1.pb.dart' show EmotionInfo; @@ -19,7 +20,6 @@ import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/image_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:cached_network_image/cached_network_image.dart'; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -662,7 +662,7 @@ class ChatItem extends StatelessWidget { TextSpan( text: matchStr, style: style.copyWith(color: theme.colorScheme.primary), - recognizer: TapGestureRecognizer() + recognizer: ImmediateTapGestureRecognizer() ..onTap = () => PiliScheme.routePushFromUrl(matchStr), ), );