From 75c2a3a4172356a59adea37276b0fb76a0ee7293 Mon Sep 17 00:00:00 2001 From: LiuliFox Date: Mon, 20 Oct 2025 15:43:48 +0800 Subject: [PATCH] Fix some gesture conflicts --- lib/foundation/app_page_route.dart | 29 ++++++++++++++++++++++++- lib/foundation/comic_source/models.dart | 1 + lib/pages/aggregated_search_page.dart | 1 + lib/pages/home_page.dart | 10 +++++++-- lib/pages/search_page.dart | 6 ++++- 5 files changed, 43 insertions(+), 4 deletions(-) diff --git a/lib/foundation/app_page_route.dart b/lib/foundation/app_page_route.dart index 558cda1..158ced5 100644 --- a/lib/foundation/app_page_route.dart +++ b/lib/foundation/app_page_route.dart @@ -2,6 +2,7 @@ import 'dart:math'; import 'dart:ui'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:venera/foundation/app.dart'; const double _kBackGestureWidth = 20.0; @@ -287,7 +288,11 @@ class _IOSBackGestureDetectorState extends State { } void _handlePointerDown(PointerDownEvent event) { - if (widget.enabledCallback()) _recognizer.addPointer(event); + if (!widget.enabledCallback()) return; + if (widget.fullScreen && _isPointerOverHorizontalScrollable(event)) { + return; + } + _recognizer.addPointer(event); } void _handleDragCancel() { @@ -325,6 +330,28 @@ class _IOSBackGestureDetectorState extends State { _backGestureController!.dragUpdate( _convertToLogical(details.primaryDelta! / context.size!.width)); } + + bool _isPointerOverHorizontalScrollable(PointerDownEvent event) { + final HitTestResult result = HitTestResult(); + WidgetsBinding.instance.hitTest(result, event.position); + for (final entry in result.path) { + final target = entry.target; + if (target is RenderViewport) { + if (_isAxisHorizontal(target.axisDirection)) { + return true; + } + } else if (target is RenderSliver) { + if (_isAxisHorizontal(target.constraints.axisDirection)) { + return true; + } + } + } + return false; + } + + bool _isAxisHorizontal(AxisDirection direction) { + return direction == AxisDirection.left || direction == AxisDirection.right; + } } class SlidePageTransitionBuilder extends PageTransitionsBuilder { diff --git a/lib/foundation/comic_source/models.dart b/lib/foundation/comic_source/models.dart index 52cf276..c430090 100644 --- a/lib/foundation/comic_source/models.dart +++ b/lib/foundation/comic_source/models.dart @@ -542,6 +542,7 @@ class PageJumpTarget { sourceKey: sourceKey, options: List.from(attributes?["options"] ?? []), ), + iosFullScreenGesture: false, ); } else if (page == "category") { var key = ComicSource.find(sourceKey)!.categoryData!.key; diff --git a/lib/pages/aggregated_search_page.dart b/lib/pages/aggregated_search_page.dart index 75f66e2..a5b2db2 100644 --- a/lib/pages/aggregated_search_page.dart +++ b/lib/pages/aggregated_search_page.dart @@ -170,6 +170,7 @@ class _SliverSearchResultState extends State<_SliverSearchResult> text: widget.keyword, sourceKey: widget.source.key, ), + iosFullScreenGesture: false, ); }, child: Column( diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index c28c1bb..4780e60 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -874,7 +874,10 @@ class _ImageFavoritesState extends State { child: InkWell( borderRadius: BorderRadius.circular(8), onTap: () { - context.to(() => const ImageFavoritesPage()); + context.to( + () => const ImageFavoritesPage(), + iosFullScreenGesture: false, + ); }, child: Column( mainAxisSize: MainAxisSize.min, @@ -993,7 +996,10 @@ class _ImageFavoritesState extends State { maxCount: maxCount, enableTranslation: displayType != 2, onTap: (text) { - context.to(() => ImageFavoritesPage(initialKeyword: text)); + context.to( + () => ImageFavoritesPage(initialKeyword: text), + iosFullScreenGesture: false, + ); }, ); }).toList(), diff --git a/lib/pages/search_page.dart b/lib/pages/search_page.dart index 934446c..0a38336 100644 --- a/lib/pages/search_page.dart +++ b/lib/pages/search_page.dart @@ -49,7 +49,10 @@ class _SearchPageState extends State { void search([String? text]) { if (aggregatedSearch) { context - .to(() => AggregatedSearchPage(keyword: text ?? controller.text)) + .to( + () => AggregatedSearchPage(keyword: text ?? controller.text), + iosFullScreenGesture: false, + ) .then((_) => update()); } else { context @@ -59,6 +62,7 @@ class _SearchPageState extends State { sourceKey: searchTarget, options: options, ), + iosFullScreenGesture: false, ) .then((_) => update()); }