opt ScrollBehavior

Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-07-23 20:00:00 +08:00
parent fa75f5c542
commit 47aaa28898
8 changed files with 54 additions and 17 deletions

View File

@@ -549,7 +549,6 @@ class RefreshIndicatorState extends State<RefreshIndicator>
if (widget.isClampingScrollPhysics) { if (widget.isClampingScrollPhysics) {
return ScrollConfiguration( return ScrollConfiguration(
behavior: RefreshScrollBehavior( behavior: RefreshScrollBehavior(
desktopDragDevices,
scrollPhysics: RefreshScrollPhysicsIOS( scrollPhysics: RefreshScrollPhysicsIOS(
parent: const RangeMaintainingScrollPhysics(), parent: const RangeMaintainingScrollPhysics(),
onDrag: _onDrag, onDrag: _onDrag,
@@ -562,7 +561,6 @@ class RefreshIndicatorState extends State<RefreshIndicator>
} }
return ScrollConfiguration( return ScrollConfiguration(
behavior: RefreshScrollBehavior( behavior: RefreshScrollBehavior(
desktopDragDevices,
scrollPhysics: RefreshScrollPhysics( scrollPhysics: RefreshScrollPhysics(
parent: const RangeMaintainingScrollPhysics(), parent: const RangeMaintainingScrollPhysics(),
onDrag: _onDrag, onDrag: _onDrag,
@@ -625,8 +623,7 @@ class RefreshIndicatorState extends State<RefreshIndicator>
typedef refreshIndicator = RefreshIndicator; typedef refreshIndicator = RefreshIndicator;
class RefreshScrollBehavior extends CustomScrollBehavior { class RefreshScrollBehavior extends CustomScrollBehavior {
const RefreshScrollBehavior( const RefreshScrollBehavior({
super.dragDevices, {
required this.scrollPhysics, required this.scrollPhysics,
}); });

View File

@@ -1,8 +1,19 @@
import 'dart:io' show Platform;
import 'package:flutter/gestures.dart' show PointerDeviceKind; import 'package:flutter/gestures.dart' show PointerDeviceKind;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
const Set<PointerDeviceKind> desktopDragDevices = {
.touch,
.mouse,
.trackpad,
.stylus,
.invertedStylus,
.unknown,
};
class CustomScrollBehavior extends MaterialScrollBehavior { class CustomScrollBehavior extends MaterialScrollBehavior {
const CustomScrollBehavior(this.dragDevices); const CustomScrollBehavior();
@override @override
Widget buildScrollbar( Widget buildScrollbar(
@@ -12,14 +23,32 @@ class CustomScrollBehavior extends MaterialScrollBehavior {
) => child; ) => child;
@override @override
final Set<PointerDeviceKind> dragDevices; Widget buildOverscrollIndicator(
BuildContext context,
Widget child,
ScrollableDetails details,
) {
if (Platform.isAndroid) {
return StretchingOverscrollIndicator(
axisDirection: details.direction,
clipBehavior: details.decorationClipBehavior ?? .hardEdge,
child: child,
);
}
return child;
}
@override
Set<PointerDeviceKind> get dragDevices => desktopDragDevices;
} }
const Set<PointerDeviceKind> desktopDragDevices = <PointerDeviceKind>{ class NoOverscrollIndicator extends CustomScrollBehavior {
PointerDeviceKind.touch, const NoOverscrollIndicator();
PointerDeviceKind.stylus,
PointerDeviceKind.invertedStylus, @override
PointerDeviceKind.trackpad, Widget buildOverscrollIndicator(
PointerDeviceKind.unknown, BuildContext context,
PointerDeviceKind.mouse, Widget child,
}; ScrollableDetails details,
) => child;
}

View File

@@ -288,7 +288,7 @@ class MyApp extends StatelessWidget {
FlutterSmartDialog.observer, FlutterSmartDialog.observer,
], ],
scrollBehavior: PlatformUtils.isDesktop scrollBehavior: PlatformUtils.isDesktop
? const CustomScrollBehavior(desktopDragDevices) ? const CustomScrollBehavior()
: null, : null,
); );
} }

View File

@@ -5,6 +5,8 @@ import 'package:PiliPlus/common/widgets/custom_icon.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart'; import 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart';
import 'package:PiliPlus/common/widgets/pair.dart'; import 'package:PiliPlus/common/widgets/pair.dart';
import 'package:PiliPlus/common/widgets/scroll_behavior.dart'
show NoOverscrollIndicator;
import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart'; import 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart';
import 'package:PiliPlus/common/widgets/sliver/sliver_to_box_adapter.dart'; import 'package:PiliPlus/common/widgets/sliver/sliver_to_box_adapter.dart';
@@ -412,6 +414,7 @@ class _DynamicDetailPageState
return Padding( return Padding(
padding: EdgeInsets.symmetric(horizontal: padding), padding: EdgeInsets.symmetric(horizontal: padding),
child: NestedScrollView( child: NestedScrollView(
scrollBehavior: const NoOverscrollIndicator(),
headerSliverBuilder: (context, innerBoxIsScrolled) { headerSliverBuilder: (context, innerBoxIsScrolled) {
return [ return [
SliverToBoxWithOffsetAdapter( SliverToBoxWithOffsetAdapter(

View File

@@ -1,6 +1,8 @@
import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart'; import 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/common/widgets/scroll_behavior.dart'
show NoOverscrollIndicator;
import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/common/widgets/sliver/sliver_pinned_header.dart'; import 'package:PiliPlus/common/widgets/sliver/sliver_pinned_header.dart';
import 'package:PiliPlus/models/common/live/live_dm_silent_type.dart'; import 'package:PiliPlus/models/common/live/live_dm_silent_type.dart';
@@ -93,6 +95,7 @@ class _LiveDmBlockPageState extends State<LiveDmBlockPage> {
isPortrait isPortrait
? ExtendedNestedScrollView( ? ExtendedNestedScrollView(
onlyOneScrollInBody: true, onlyOneScrollInBody: true,
scrollBehavior: const NoOverscrollIndicator(),
headerSliverBuilder: (context, innerBoxIsScrolled) { headerSliverBuilder: (context, innerBoxIsScrolled) {
return [ return [
SliverToBoxAdapter(child: left), SliverToBoxAdapter(child: left),

View File

@@ -7,6 +7,8 @@ import 'package:PiliPlus/common/widgets/dialog/report_member.dart';
import 'package:PiliPlus/common/widgets/dynamic_sliver_app_bar/dynamic_sliver_app_bar.dart'; import 'package:PiliPlus/common/widgets/dynamic_sliver_app_bar/dynamic_sliver_app_bar.dart';
import 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart'; import 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/common/widgets/scroll_behavior.dart'
show NoOverscrollIndicator;
import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/http/live.dart'; import 'package:PiliPlus/http/live.dart';
import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/loading_state.dart';
@@ -92,8 +94,9 @@ class _MemberPageState extends State<MemberPage> {
() => switch (_userController.loadingState.value) { () => switch (_userController.loadingState.value) {
Loading() => m3eLoading, Loading() => m3eLoading,
Success(:final response) => ExtendedNestedScrollView( Success(:final response) => ExtendedNestedScrollView(
key: _userController.scrollKey,
onlyOneScrollInBody: true, onlyOneScrollInBody: true,
key: _userController.scrollKey,
scrollBehavior: const NoOverscrollIndicator(),
pinnedHeaderSliverHeightBuilder: () => pinnedHeaderSliverHeightBuilder: () =>
kToolbarHeight + MediaQuery.viewPaddingOf(context).top, kToolbarHeight + MediaQuery.viewPaddingOf(context).top,
headerSliverBuilder: (context, innerBoxIsScrolled) { headerSliverBuilder: (context, innerBoxIsScrolled) {

View File

@@ -8,6 +8,8 @@ import 'package:PiliPlus/common/widgets/flutter/pop_scope.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart'; import 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';
import 'package:PiliPlus/common/widgets/route_aware_mixin.dart'; import 'package:PiliPlus/common/widgets/route_aware_mixin.dart';
import 'package:PiliPlus/common/widgets/scroll_behavior.dart'
show NoOverscrollIndicator;
import 'package:PiliPlus/common/widgets/scroll_physics.dart' import 'package:PiliPlus/common/widgets/scroll_physics.dart'
show tabBarView, platformAlwaysClampingPhysics, platformClampingPhysics; show tabBarView, platformAlwaysClampingPhysics, platformClampingPhysics;
import 'package:PiliPlus/common/widgets/sliver/video_header.dart'; import 'package:PiliPlus/common/widgets/sliver/video_header.dart';
@@ -520,6 +522,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
physics: platformClampingPhysics, physics: platformClampingPhysics,
key: videoDetailController.scrollKey, key: videoDetailController.scrollKey,
controller: videoDetailController.scrollCtr, controller: videoDetailController.scrollCtr,
scrollBehavior: const NoOverscrollIndicator(),
pinnedHeaderSliverHeightBuilder: () { pinnedHeaderSliverHeightBuilder: () {
double pinnedHeight = this.isFullScreen || !isPortrait double pinnedHeight = this.isFullScreen || !isPortrait
? maxHeight - (isWindowMode && !isPortrait ? 0 : padding.top) ? maxHeight - (isWindowMode && !isPortrait ? 0 : padding.top)

View File

@@ -84,7 +84,6 @@ $patches = @($ModalBarrierPatch, $TextSelectionPatch, $MouseCursorPatch,
switch ($platform.ToLower()) { switch ($platform.ToLower()) {
"android" { "android" {
$reverts += $NewOverScrollIndicator
$patches += $BottomSheetAndroidPatch $patches += $BottomSheetAndroidPatch
$patches += $ScrollViewPatch $patches += $ScrollViewPatch
$patches += $NavigatorPatch $patches += $NavigatorPatch