opt iOS ScrollPhysics

Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-07-21 22:37:51 +08:00
parent 43843ca721
commit be07cafb54
14 changed files with 119 additions and 28 deletions

View File

@@ -9,6 +9,8 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/image_viewer/hero.dart';
import 'package:PiliPlus/common/widgets/progress_bar/audio_video_progress_bar.dart';
import 'package:PiliPlus/common/widgets/progress_bar/segment_progress_bar.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart'
show platformClampingPhysics;
import 'package:PiliPlus/common/widgets/selection_text.dart';
import 'package:PiliPlus/grpc/bilibili/app/listener/v1.pb.dart';
import 'package:PiliPlus/models/common/image_preview_type.dart';
@@ -918,7 +920,7 @@ class _AudioPageState extends State<AudioPage> {
child: ListView(
key: const PageStorageKey(_AudioPageState),
shrinkWrap: true,
physics: const ClampingScrollPhysics(),
physics: platformClampingPhysics,
children: [
Center(
child: GestureDetector(

View File

@@ -8,6 +8,8 @@ import 'package:PiliPlus/common/widgets/flutter/draggable_scrollable_sheet.dart'
import 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart';
import 'package:PiliPlus/common/widgets/flutter/text_field/text_field.dart';
import 'package:PiliPlus/common/widgets/pair.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart'
show platformClampingPhysics;
import 'package:PiliPlus/common/widgets/time_picker.dart';
import 'package:PiliPlus/http/dynamics.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -138,7 +140,7 @@ class _CreateDynPanelState extends CommonRichTextPubPageState<CreateDynPanel> {
child: ListView(
padding: EdgeInsets.zero,
controller: widget.scrollController,
physics: const ClampingScrollPhysics(),
physics: platformClampingPhysics,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
@@ -630,7 +632,7 @@ class _CreateDynPanelState extends CommonRichTextPubPageState<CreateDynPanel> {
return SizedBox(
height: height,
child: GridView(
physics: const ClampingScrollPhysics(),
physics: platformClampingPhysics,
padding: const EdgeInsets.only(left: 12, bottom: 12, right: 12),
gridDelegate: SliverGridDelegateWithExtentAndRatio(
maxCrossAxisExtent: 65,

View File

@@ -1,6 +1,8 @@
import 'package:PiliPlus/common/widgets/flutter/draggable_scrollable_sheet.dart';
import 'package:PiliPlus/common/widgets/flutter/text_field/text_field.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart'
show platformClampingPhysics;
import 'package:PiliPlus/http/dynamics.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/publish_panel_type.dart';
@@ -102,7 +104,7 @@ class _RepostPanelState extends CommonRichTextPubPageState<RepostPanel> {
child: ListView(
padding: EdgeInsets.zero,
controller: scrollController,
physics: const ClampingScrollPhysics(),
physics: platformClampingPhysics,
children: _buildEditPanel(theme),
),
),

View File

@@ -2,7 +2,8 @@ import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/custom_tooltip.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart'
show tabBarView, platformClampingPhysics;
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/image_type.dart';
import 'package:PiliPlus/models_new/emote/emote.dart';
@@ -68,7 +69,7 @@ class _EmotePanelState extends State<EmotePanel>
final size = flag ? 40.0 : 60.0;
final isTextEmote = e.type == 4;
return GridView.builder(
physics: const ClampingScrollPhysics(),
physics: platformClampingPhysics,
padding: const EdgeInsets.only(
left: 12,
right: 12,

View File

@@ -3,7 +3,8 @@ import 'dart:math';
import 'package:PiliPlus/common/widgets/custom_tooltip.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart'
show tabBarView, platformClampingPhysics;
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/image_type.dart';
import 'package:PiliPlus/models_new/live/live_emote/datum.dart';
@@ -81,7 +82,7 @@ class _LiveEmotePanelState extends State<LiveEmotePanel>
final width = widthFac * 38;
final height = heightFac * 38;
return GridView.builder(
physics: const ClampingScrollPhysics(),
physics: platformClampingPhysics,
padding: const EdgeInsets.only(
left: 12,
right: 12,

View File

@@ -1,3 +1,5 @@
import 'package:PiliPlus/common/widgets/scroll_physics.dart'
show platformClampingPhysics;
import 'package:PiliPlus/models/common/super_chat_type.dart';
import 'package:PiliPlus/pages/live_room/controller.dart';
import 'package:PiliPlus/pages/live_room/superchat/superchat_card.dart';
@@ -32,7 +34,7 @@ class _SuperChatPanelState extends DebounceStreamState<SuperChatPanel, bool>
() => ListView.separated(
key: const PageStorageKey(_SuperChatPanelState),
padding: const EdgeInsets.symmetric(horizontal: 12),
physics: const ClampingScrollPhysics(),
physics: platformClampingPhysics,
itemCount: widget.controller.superChatMsg.length,
findItemIndexCallback: (key) {
final index = widget.controller.superChatMsg.indexWhere(

View File

@@ -1,6 +1,8 @@
import 'package:PiliPlus/common/widgets/flutter/popup_menu.dart';
import 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart'
show platformClampingPhysics;
import 'package:PiliPlus/http/live.dart';
import 'package:PiliPlus/models_new/live/live_danmaku/danmaku_msg.dart';
import 'package:PiliPlus/models_new/live/live_superchat/item.dart';
@@ -54,7 +56,7 @@ class LiveRoomChatPanel extends StatelessWidget {
separatorBuilder: (_, _) => const SizedBox(height: 8),
itemCount: liveRoomController.builtLength =
liveRoomController.messages.length,
physics: const ClampingScrollPhysics(),
physics: platformClampingPhysics,
itemBuilder: (_, index) {
final item = liveRoomController.messages[index];
if (item is DanmakuMsg) {

View File

@@ -7,6 +7,8 @@ import 'package:PiliPlus/common/widgets/custom_icon.dart';
import 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart'
show RichTextType;
import 'package:PiliPlus/common/widgets/flutter/text_field/text_field.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart'
show platformClampingPhysics;
import 'package:PiliPlus/common/widgets/view_safe_area.dart';
import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'
show ReplyInfo;
@@ -284,7 +286,7 @@ class _ReplyPageState extends CommonRichTextPubPageState<ReplyPage> {
return SizedBox(
height: height,
child: GridView(
physics: const ClampingScrollPhysics(),
physics: platformClampingPhysics,
padding: const EdgeInsets.only(left: 12, bottom: 12, right: 12),
gridDelegate: gridDelegate,
children: [

View File

@@ -1,6 +1,8 @@
import 'dart:async';
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart'
show platformClampingPhysics;
import 'package:PiliPlus/common/widgets/view_safe_area.dart';
import 'package:PiliPlus/http/danmaku.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -174,7 +176,7 @@ class _SendDanmakuPanelState extends CommonTextPubPageState<SendDanmakuPanel> {
),
),
child: ListView(
physics: const ClampingScrollPhysics(),
physics: platformClampingPhysics,
padding: .only(
top: 12,
bottom: 12 + MediaQuery.viewPaddingOf(context).bottom,

View File

@@ -8,7 +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/keep_alive_wrapper.dart';
import 'package:PiliPlus/common/widgets/route_aware_mixin.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart' show tabBarView;
import 'package:PiliPlus/common/widgets/scroll_physics.dart'
show tabBarView, platformAlwaysClampingPhysics, platformClampingPhysics;
import 'package:PiliPlus/common/widgets/sliver/video_header.dart';
import 'package:PiliPlus/common/widgets/svg/play_icon.dart';
import 'package:PiliPlus/models/common/episode_panel_type.dart';
@@ -515,9 +516,10 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
),
),
body: ExtendedNestedScrollView(
onlyOneScrollInBody: true,
physics: platformClampingPhysics,
key: videoDetailController.scrollKey,
controller: videoDetailController.scrollCtr,
onlyOneScrollInBody: true,
pinnedHeaderSliverHeightBuilder: () {
double pinnedHeight = this.isFullScreen || !isPortrait
? maxHeight - (isWindowMode && !isPortrait ? 0 : padding.top)
@@ -1616,9 +1618,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
controller: needCtr
? videoDetailController.effectiveIntroScrollCtr
: null,
physics: !needCtr
? const AlwaysScrollableScrollPhysics(parent: ClampingScrollPhysics())
: null,
physics: !needCtr ? platformAlwaysClampingPhysics : null,
key: const PageStorageKey(CommonIntroController),
slivers: [
SliverPadding(
@@ -1649,11 +1649,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
controller: needCtr
? videoDetailController.effectiveIntroScrollCtr
: null,
physics: !needCtr
? const AlwaysScrollableScrollPhysics(
parent: ClampingScrollPhysics(),
)
: null,
physics: !needCtr ? platformAlwaysClampingPhysics : null,
slivers: [
if (videoDetailController.isUgc) ...[
UgcIntroPanel(

View File

@@ -7,6 +7,8 @@ import 'package:PiliPlus/common/widgets/flutter/chat_list_view.dart';
import 'package:PiliPlus/common/widgets/flutter/text_field/text_field.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart'
show platformAlwaysClampingPhysics;
import 'package:PiliPlus/grpc/bilibili/im/type.pb.dart' show Msg;
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/msg.dart';
@@ -158,9 +160,7 @@ class _WhisperDetailPageState
? ChatListView.separated(
itemCount: response.length,
padding: const .all(kChatListPadding),
physics: const AlwaysScrollableScrollPhysics(
parent: ClampingScrollPhysics(),
),
physics: platformAlwaysClampingPhysics,
controller: _whisperDetailController.scrollController,
itemBuilder: (context, int index) {
if (index == response.length - 1) {