From 56ffc2781f55161ef117c0b35bc6aed0c92b4597 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Wed, 27 Aug 2025 11:19:44 +0800 Subject: [PATCH] RTF slide dismiss Closes #1135 Signed-off-by: bggRGjQaUbCoE --- lib/pages/common/slide/common_slide_page.dart | 44 ++++++++++--------- lib/pages/setting/models/extra_settings.dart | 2 +- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/lib/pages/common/slide/common_slide_page.dart b/lib/pages/common/slide/common_slide_page.dart index d6cdd1ad..f3bfa93e 100644 --- a/lib/pages/common/slide/common_slide_page.dart +++ b/lib/pages/common/slide/common_slide_page.dart @@ -1,6 +1,5 @@ -import 'dart:math'; - import 'package:PiliPlus/utils/storage_pref.dart'; +import 'package:flutter/gestures.dart' show PositionedGestureDetails; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -15,6 +14,7 @@ abstract class CommonSlidePageState extends State Offset? downPos; bool? isSliding; + late bool _isRTF = false; late final bool enableSlide; AnimationController? _animController; Animation? _anim; @@ -62,9 +62,12 @@ abstract class CommonSlidePageState extends State builder: (_, constrains) { final maxWidth = constrains.maxWidth; - void onDismiss() { + void onDismiss([_]) { if (isSliding == true) { - if (_animController!.value * maxWidth + downPos!.dx >= 100) { + final dx = downPos!.dx; + if (_animController!.value * maxWidth + + (_isRTF ? (maxWidth - dx) : dx) >= + 100) { Get.back(); } else { _animController!.reverse(); @@ -74,7 +77,8 @@ abstract class CommonSlidePageState extends State isSliding = null; } - void onPan(Offset localPosition) { + void onPan(PositionedGestureDetails details) { + final localPosition = details.localPosition; if (isSliding == false) { return; } else if (isSliding == null) { @@ -86,34 +90,32 @@ abstract class CommonSlidePageState extends State } else { isSliding = false; } + } else { + isSliding = false; } } else if (isSliding == true) { - if (localPosition.dx < 0) { - return; - } _animController!.value = - max(0, (localPosition.dx - downPos!.dx)) / maxWidth; + (details.localPosition.dx - downPos!.dx).abs() / maxWidth; } } return GestureDetector( onPanDown: (details) { - if (details.localPosition.dx > 30) { - isSliding = false; - } else { + final dx = details.localPosition.dx; + const offset = 30; + final isLTR = dx <= offset; + final isRTF = dx >= maxWidth - offset; + if (isLTR || isRTF) { + _isRTF = isRTF; downPos = details.localPosition; + } else { + isSliding = false; } }, - onPanStart: (details) { - onPan(details.localPosition); - }, - onPanUpdate: (details) { - onPan(details.localPosition); - }, + onPanStart: onPan, + onPanUpdate: onPan, onPanCancel: onDismiss, - onPanEnd: (_) { - onDismiss(); - }, + onPanEnd: onDismiss, child: buildList(theme), ); }, diff --git a/lib/pages/setting/models/extra_settings.dart b/lib/pages/setting/models/extra_settings.dart index e07f6ab9..788defd7 100644 --- a/lib/pages/setting/models/extra_settings.dart +++ b/lib/pages/setting/models/extra_settings.dart @@ -692,7 +692,7 @@ List get extraSettings => [ ), SettingsModel( settingsType: SettingsType.sw1tch, - title: '侧滑关闭二级评论页面', + title: '侧滑关闭二级页面', leading: Transform.rotate( angle: pi * 1.5, child: const Icon(Icons.touch_app),