diff --git a/lib/common/widgets/image/custom_grid_view.dart b/lib/common/widgets/image/custom_grid_view.dart index 0f7fe8728..7ef2ddf14 100644 --- a/lib/common/widgets/image/custom_grid_view.dart +++ b/lib/common/widgets/image/custom_grid_view.dart @@ -29,6 +29,8 @@ import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:flutter/material.dart' hide CustomMultiChildLayout, MultiChildLayoutDelegate; +import 'package:get/get_core/src/get_main.dart'; +import 'package:get/get_navigation/get_navigation.dart'; class ImageModel { ImageModel({ @@ -74,6 +76,7 @@ class CustomGridView extends StatelessWidget { final bool fullScreen; static bool horizontalPreview = Pref.horizontalPreview; + static final _regex = RegExp(r'/(videoV|dynamicDetail)'); void onTap(BuildContext context, int index) { final imgList = picArr.map( @@ -90,6 +93,7 @@ class CustomGridView extends StatelessWidget { ).toList(); if (horizontalPreview && !fullScreen && + Get.currentRoute.startsWith(_regex) && !context.mediaQuerySize.isPortrait) { final scaffoldState = Scaffold.maybeOf(context); if (scaffoldState != null) { diff --git a/lib/pages/audio/view.dart b/lib/pages/audio/view.dart index 20e6ca98b..d0669face 100644 --- a/lib/pages/audio/view.dart +++ b/lib/pages/audio/view.dart @@ -78,6 +78,7 @@ class _AudioPageState extends State { final isPortrait = MediaQuery.sizeOf(context).isPortrait; final padding = MediaQuery.viewPaddingOf(context); return Scaffold( + resizeToAvoidBottomInset: false, appBar: AppBar( actions: [ Builder( diff --git a/lib/pages/dlna/view.dart b/lib/pages/dlna/view.dart index e2696d07f..39ed53944 100644 --- a/lib/pages/dlna/view.dart +++ b/lib/pages/dlna/view.dart @@ -71,6 +71,7 @@ class _DLNAPageState extends State { Widget build(BuildContext context) { final colorScheme = ColorScheme.of(context); return Scaffold( + resizeToAvoidBottomInset: false, appBar: AppBar( title: const Text('投屏'), actions: [ diff --git a/lib/pages/download/downloading/view.dart b/lib/pages/download/downloading/view.dart index 09cb2eb8f..ce9ab1071 100644 --- a/lib/pages/download/downloading/view.dart +++ b/lib/pages/download/downloading/view.dart @@ -41,6 +41,7 @@ class _DownloadingPageState extends State } }, child: Scaffold( + resizeToAvoidBottomInset: false, appBar: MultiSelectAppBarWidget( ctr: this, child: AppBar( diff --git a/lib/pages/follow/widgets/follow_item.dart b/lib/pages/follow/widgets/follow_item.dart index 2f95d029e..3b22772b1 100644 --- a/lib/pages/follow/widgets/follow_item.dart +++ b/lib/pages/follow/widgets/follow_item.dart @@ -79,28 +79,25 @@ class FollowItem extends StatelessWidget { ), ), if (isOwner ?? false) - SizedBox( - height: 34, - child: FilledButton.tonal( - onPressed: () => RequestUtils.actionRelationMod( - context: context, - mid: item.mid, - isFollow: item.attribute != -1, - callback: callback, - ), - style: FilledButton.styleFrom( - padding: const EdgeInsets.fromLTRB(15, 0, 15, 0), - foregroundColor: item.attribute == -1 - ? null - : colorScheme.outline, - backgroundColor: item.attribute == -1 - ? null - : colorScheme.onInverseSurface, - ), - child: Text( - '${item.attribute == -1 ? '' : '已'}关注', - style: const TextStyle(fontSize: 12), - ), + FilledButton.tonal( + onPressed: () => RequestUtils.actionRelationMod( + context: context, + mid: item.mid, + isFollow: item.attribute != -1, + callback: callback, + ), + style: FilledButton.styleFrom( + padding: const EdgeInsets.fromLTRB(15, 0, 15, 0), + foregroundColor: item.attribute == -1 + ? null + : colorScheme.outline, + backgroundColor: item.attribute == -1 + ? null + : colorScheme.onInverseSurface, + ), + child: Text( + '${item.attribute == -1 ? '' : '已'}关注', + style: const TextStyle(fontSize: 12), ), ), ], diff --git a/lib/pages/log_table/view.dart b/lib/pages/log_table/view.dart index 10d343810..34c7f5089 100644 --- a/lib/pages/log_table/view.dart +++ b/lib/pages/log_table/view.dart @@ -2,6 +2,7 @@ import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/pages/log_table/controller.dart'; +import 'package:PiliPlus/utils/extension.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -21,23 +22,18 @@ class _LogPageState extends State> { return Scaffold( resizeToAvoidBottomInset: false, appBar: AppBar(title: Text(_controller.title)), - body: Center( - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 680), - child: CustomScrollView( - slivers: [ - SliverPadding( - padding: EdgeInsets.only( - left: 10 + padding.left, - right: 10 + padding.right, - bottom: padding.bottom + 100, - ), - sliver: Obx(() => _buildBody(_controller.loadingState.value)), - ), - ], + body: CustomScrollView( + slivers: [ + SliverPadding( + padding: EdgeInsets.only( + left: 10 + padding.left, + right: 10 + padding.right, + bottom: padding.bottom + 100, + ), + sliver: Obx(() => _buildBody(_controller.loadingState.value)), ), - ), - ), + ], + ).constraintWidth(constraints: const BoxConstraints(maxWidth: 680)), ); } diff --git a/lib/pages/login/view.dart b/lib/pages/login/view.dart index e857dafa1..094484c39 100644 --- a/lib/pages/login/view.dart +++ b/lib/pages/login/view.dart @@ -612,13 +612,7 @@ class _LoginPageState extends State { Widget tabViewOuter(Widget child) { return SingleChildScrollView( padding: padding, - child: Align( - alignment: Alignment.topCenter, - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 600), - child: child, - ), - ), + child: child.constraintWidth(), ); } } diff --git a/lib/pages/login_devices/view.dart b/lib/pages/login_devices/view.dart index 17d690408..173684f84 100644 --- a/lib/pages/login_devices/view.dart +++ b/lib/pages/login_devices/view.dart @@ -5,6 +5,7 @@ import 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models_new/login_devices/device.dart'; import 'package:PiliPlus/pages/login_devices/controller.dart'; +import 'package:PiliPlus/utils/extension.dart'; import 'package:flutter/material.dart' hide ListTile; import 'package:get/get.dart'; @@ -22,27 +23,23 @@ class LoginDevicesPageState extends State { Widget build(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; return Scaffold( + resizeToAvoidBottomInset: false, appBar: AppBar(title: const Text('登录设备')), - body: Center( - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 650), - child: refreshIndicator( - onRefresh: _controller.onRefresh, - child: CustomScrollView( - slivers: [ - ViewSliverSafeArea( - sliver: Obx( - () => _buildBody( - colorScheme, - _controller.loadingState.value, - ), - ), + body: refreshIndicator( + onRefresh: _controller.onRefresh, + child: CustomScrollView( + slivers: [ + ViewSliverSafeArea( + sliver: Obx( + () => _buildBody( + colorScheme, + _controller.loadingState.value, ), - ], + ), ), - ), + ], ), - ), + ).constraintWidth(), ); } diff --git a/lib/pages/main_reply/view.dart b/lib/pages/main_reply/view.dart index 9b20ac707..d00d1b3a3 100644 --- a/lib/pages/main_reply/view.dart +++ b/lib/pages/main_reply/view.dart @@ -9,6 +9,7 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/pages/main_reply/controller.dart'; import 'package:PiliPlus/pages/video/reply/widgets/reply_item_grpc.dart'; import 'package:PiliPlus/pages/video/reply_reply/view.dart'; +import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; @@ -55,9 +56,8 @@ class _MainReplyPageState extends State { Widget build(BuildContext context) { final colorScheme = ColorScheme.of(context); return Scaffold( - appBar: AppBar( - title: const Text('查看评论'), - ), + resizeToAvoidBottomInset: false, + appBar: AppBar(title: const Text('查看评论')), body: NotificationListener( onNotification: (notification) { final direction = notification.direction; @@ -84,7 +84,7 @@ class _MainReplyPageState extends State { ], ), ), - ), + ).constraintWidth(), ), floatingActionButton: SlideTransition( position: _controller.fabAnim, @@ -247,7 +247,7 @@ class _MainReplyPageState extends State { replyType: _controller.replyType, firstFloor: replyItem, ), - ), + ).constraintWidth(), ), routeName: 'dynamicDetail-Copy', ); diff --git a/lib/pages/match_info/view.dart b/lib/pages/match_info/view.dart index 571c38f9a..56b2c6a4c 100644 --- a/lib/pages/match_info/view.dart +++ b/lib/pages/match_info/view.dart @@ -57,7 +57,7 @@ class _MatchInfoPageState extends CommonDynPageState { ], ), ), - ), + ).constraintWidth(), floatingActionButton: SlideTransition( position: fabAnim, child: replyButton, @@ -220,7 +220,7 @@ class _MatchInfoPageState extends CommonDynPageState { replyType: controller.replyType, firstFloor: replyItem, ), - ), + ).constraintWidth(), ), ); }); diff --git a/lib/pages/member_upower_rank/view.dart b/lib/pages/member_upower_rank/view.dart index d237f1b4e..cb80b8ff7 100644 --- a/lib/pages/member_upower_rank/view.dart +++ b/lib/pages/member_upower_rank/view.dart @@ -8,6 +8,7 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/models_new/upower_rank/rank_info.dart'; import 'package:PiliPlus/pages/member_upower_rank/controller.dart'; +import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart' hide ListTile; import 'package:get/get.dart'; @@ -93,76 +94,71 @@ class _UpowerRankPageState extends State ), body: Padding( padding: EdgeInsets.only(left: padding.left, right: padding.right), - child: Center( - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 625), - child: Obx( - () { - final tabs = _controller.tabs.value; - return tabs != null - ? DefaultTabController( - length: tabs.length, - child: Builder( - builder: (context) { - return Column( - children: [ - TabBar( - isScrollable: true, - tabAlignment: TabAlignment.start, - tabs: tabs - .map( - (e) => Tab( - text: - '${e.name!}(${e.memberTotal ?? 0})', - ), - ) - .toList(), - onTap: (index) { - if (!DefaultTabController.of( - context, - ).indexIsChanging) { - try { - if (index == 0) { - _controller.animateToTop(); - } else { - Get.find( - tag: - '$_tag${tabs[index].privilegeType}', - ).animateToTop(); - } - } catch (_) {} + child: Obx( + () { + final tabs = _controller.tabs.value; + return tabs != null + ? DefaultTabController( + length: tabs.length, + child: Builder( + builder: (context) { + return Column( + children: [ + TabBar( + isScrollable: true, + tabAlignment: TabAlignment.start, + tabs: tabs + .map( + (e) => Tab( + text: + '${e.name!}(${e.memberTotal ?? 0})', + ), + ) + .toList(), + onTap: (index) { + if (!DefaultTabController.of( + context, + ).indexIsChanging) { + try { + if (index == 0) { + _controller.animateToTop(); + } else { + Get.find( + tag: + '$_tag${tabs[index].privilegeType}', + ).animateToTop(); } - }, - ), - Expanded( - child: tabBarView( - children: [ - KeepAliveWrapper( - builder: (context) => child, - ), - ...tabs - .skip(1) - .map( - (e) => UpowerRankPage( - upMid: _upMid, - tag: _tag, - privilegeType: e.privilegeType, - ), - ), - ], + } catch (_) {} + } + }, + ), + Expanded( + child: tabBarView( + children: [ + KeepAliveWrapper( + builder: (context) => child, ), - ), - ], - ); - }, - ), - ) - : child; - }, - ), - ), + ...tabs + .skip(1) + .map( + (e) => UpowerRankPage( + upMid: _upMid, + tag: _tag, + privilegeType: e.privilegeType, + ), + ), + ], + ), + ), + ], + ); + }, + ), + ) + : child; + }, ), - ), + ).constraintWidth(), ); } else { return child; diff --git a/lib/pages/video/pay_coins/view.dart b/lib/pages/video/pay_coins/view.dart index 57490edd0..137c56e99 100644 --- a/lib/pages/video/pay_coins/view.dart +++ b/lib/pages/video/pay_coins/view.dart @@ -227,12 +227,9 @@ class _PayCoinsPageState extends State final isPortrait = size.isPortrait; return isPortrait ? _buildBody(isPortrait) - : Center( - child: ConstrainedBox( - constraints: BoxConstraints( - maxWidth: math.min(525, size.width * 0.6), - ), - child: _buildBody(isPortrait), + : _buildBody(isPortrait).constraintWidth( + constraints: BoxConstraints( + maxWidth: math.min(525, size.width * 0.6), ), ); } diff --git a/lib/pages/video/reply_reply/view.dart b/lib/pages/video/reply_reply/view.dart index 26c45a55c..a30be5a57 100644 --- a/lib/pages/video/reply_reply/view.dart +++ b/lib/pages/video/reply_reply/view.dart @@ -10,6 +10,7 @@ import 'package:PiliPlus/pages/common/slide/common_slide_page.dart'; import 'package:PiliPlus/pages/video/reply/widgets/reply_item_grpc.dart'; import 'package:PiliPlus/pages/video/reply_reply/controller.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; +import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'; @@ -83,7 +84,7 @@ class VideoReplyReplyPanel extends CommonSlidePage { firstFloor: null, id: rpId, ), - ), + ).constraintWidth(), ), ); } diff --git a/lib/pages/webview/view.dart b/lib/pages/webview/view.dart index 677dc7444..39d92babf 100644 --- a/lib/pages/webview/view.dart +++ b/lib/pages/webview/view.dart @@ -67,6 +67,7 @@ class _WebviewPageState extends State { if (Platform.isLinux) { return Scaffold( appBar: AppBar(), + resizeToAvoidBottomInset: false, body: Center( child: TextButton( onPressed: () => PageUtils.launchURL(_url), diff --git a/lib/pages/whisper_detail/view.dart b/lib/pages/whisper_detail/view.dart index 8eb28d74d..f5b5bad80 100644 --- a/lib/pages/whisper_detail/view.dart +++ b/lib/pages/whisper_detail/view.dart @@ -130,10 +130,7 @@ class _WhisperDetailPageState ], ), body: Padding( - padding: EdgeInsets.only( - left: padding.left, - right: padding.right, - ), + padding: EdgeInsets.only(left: padding.left, right: padding.right), child: Column( children: [ Expanded( @@ -161,7 +158,7 @@ class _WhisperDetailPageState SizedBox(height: padding.bottom), ], ), - ), + ).constraintWidth(), ); } diff --git a/lib/pages/whisper_detail/widget/chat_item.dart b/lib/pages/whisper_detail/widget/chat_item.dart index 006dc3280..26e217ba3 100644 --- a/lib/pages/whisper_detail/widget/chat_item.dart +++ b/lib/pages/whisper_detail/widget/chat_item.dart @@ -13,6 +13,7 @@ import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/duration_utils.dart'; +import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/image_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; @@ -754,20 +755,15 @@ class ChatItem extends StatelessWidget { Widget msgTypePictureCard_13(dynamic content) { final url = content['jump_url']; - return Center( - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 400.0), - child: ClipRRect( - borderRadius: StyleString.mdRadius, - child: GestureDetector( - onTap: url == null ? null : () => PiliScheme.routePushFromUrl(url), - child: CachedNetworkImage( - imageUrl: ImageUtils.thumbnailUrl(content['pic_url']), - ), - ), + return ClipRRect( + borderRadius: StyleString.mdRadius, + child: GestureDetector( + onTap: url == null ? null : () => PiliScheme.routePushFromUrl(url), + child: CachedNetworkImage( + imageUrl: ImageUtils.thumbnailUrl(content['pic_url']), ), ), - ); + ).constraintWidth(constraints: const BoxConstraints(maxWidth: 400.0)); } Widget def(Color textColor, {err}) { diff --git a/lib/pages/whisper_secondary/view.dart b/lib/pages/whisper_secondary/view.dart index ae2c14142..7c3e11700 100644 --- a/lib/pages/whisper_secondary/view.dart +++ b/lib/pages/whisper_secondary/view.dart @@ -78,7 +78,7 @@ class _WhisperSecPageState extends State { ), ], ), - ), + ).constraintWidth(), ); } diff --git a/lib/utils/extension.dart b/lib/utils/extension.dart index 132673999..2dbe88ffd 100644 --- a/lib/utils/extension.dart +++ b/lib/utils/extension.dart @@ -275,3 +275,17 @@ extension GetExt on GetInterface { S putOrFind(InstanceBuilderCallback dep, {String? tag}) => GetInstance().putOrFind(dep, tag: tag); } + +extension WidgetExt on Widget { + Widget constraintWidth({ + BoxConstraints constraints = const BoxConstraints(maxWidth: 625), + }) { + return Align( + alignment: Alignment.topCenter, + child: ConstrainedBox( + constraints: constraints, + child: this, + ), + ); + } +}