From db08af6ca51e334b732739f0fc6342e456024c8c Mon Sep 17 00:00:00 2001 From: dom Date: Sat, 7 Mar 2026 10:06:37 +0800 Subject: [PATCH] correct scrollable position when hiding top bar Signed-off-by: dom --- lib/pages/common/common_page.dart | 27 +++++++++++++++++++++++++-- lib/pages/home/view.dart | 3 +++ lib/pages/search/view.dart | 2 +- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/pages/common/common_page.dart b/lib/pages/common/common_page.dart index 96ce224ad..5570e63ff 100644 --- a/lib/pages/common/common_page.dart +++ b/lib/pages/common/common_page.dart @@ -11,6 +11,8 @@ abstract class CommonPageState extends State { RxBool? _showBottomBar; final _mainController = Get.find(); + bool get needsCorrection => false; + @override void initState() { super.initState(); @@ -63,11 +65,32 @@ abstract class CommonPageState extends State { bool onNotificationType2(ScrollNotification notification) { if (!_mainController.useBottomNav) return false; - if (notification.metrics.axis == .horizontal) return false; + final metrics = notification.metrics; + if (metrics.axis == .horizontal) return false; if (notification is ScrollUpdateNotification) { if (notification.dragDetails == null) return false; - _updateOffset(notification.scrollDelta ?? 0.0); + final pixel = metrics.pixels; + final scrollDelta = notification.scrollDelta ?? 0; + if (pixel < 0.0 && scrollDelta > 0) return false; + if (needsCorrection) { + final value = _barOffset!.value; + final newValue = clampDouble( + value + scrollDelta, + 0.0, + StyleString.topBarHeight, + ); + final offset = newValue - value; + if (offset != 0) { + _barOffset!.value = newValue; + if (pixel < 0.0 && scrollDelta < 0.0 && value > 0.0) { + return false; + } + Scrollable.of(notification.context!).position.correctBy(-offset); + } + } else { + _updateOffset(scrollDelta); + } return false; } diff --git a/lib/pages/home/view.dart b/lib/pages/home/view.dart index ad4a63393..164237789 100644 --- a/lib/pages/home/view.dart +++ b/lib/pages/home/view.dart @@ -25,6 +25,9 @@ class _HomePageState extends CommonPageState final _homeController = Get.putOrFind(HomeController.new); final _mainController = Get.find(); + @override + bool get needsCorrection => _homeController.hideTopBar; + @override bool get wantKeepAlive => true; diff --git a/lib/pages/search/view.dart b/lib/pages/search/view.dart index 553a9c90b..58df6282f 100644 --- a/lib/pages/search/view.dart +++ b/lib/pages/search/view.dart @@ -14,7 +14,7 @@ import 'package:PiliPlus/utils/extension/size_ext.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/utils.dart'; -import 'package:flutter/material.dart'hide LayoutBuilder; +import 'package:flutter/material.dart' hide LayoutBuilder; import 'package:get/get.dart'; class SearchPage extends StatefulWidget {