From b6ce93cbd29b65a92bc1c1d1fe7db0a9bbfa93e6 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Thu, 21 Aug 2025 10:57:48 +0800 Subject: [PATCH] tweak Signed-off-by: bggRGjQaUbCoE --- lib/common/widgets/pendant_avatar.dart | 16 ++-- .../common/publish/common_publish_page.dart | 50 +--------- .../publish/common_rich_text_pub_page.dart | 49 +++++++++- .../common/publish/common_text_pub_page.dart | 9 +- lib/pages/common/reply_controller.dart | 6 +- lib/pages/fav/pgc/view.dart | 2 +- lib/pages/member/view.dart | 16 +--- lib/pages/member/widget/user_info_card.dart | 13 +-- lib/pages/pgc_review/post/view.dart | 32 +++---- lib/pages/save_panel/view.dart | 93 ++++++++++--------- lib/utils/page_utils.dart | 7 +- 11 files changed, 150 insertions(+), 143 deletions(-) diff --git a/lib/common/widgets/pendant_avatar.dart b/lib/common/widgets/pendant_avatar.dart index 0092706f..2b12011a 100644 --- a/lib/common/widgets/pendant_avatar.dart +++ b/lib/common/widgets/pendant_avatar.dart @@ -43,16 +43,17 @@ class PendantAvatar extends StatelessWidget { @override Widget build(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; + final isMemberAvatar = size == 80; return Stack( alignment: Alignment.bottomCenter, clipBehavior: Clip.none, children: [ onTap == null - ? _buildAvatar(colorScheme) + ? _buildAvatar(colorScheme, isMemberAvatar) : GestureDetector( behavior: HitTestBehavior.opaque, onTap: onTap, - child: _buildAvatar(colorScheme), + child: _buildAvatar(colorScheme, isMemberAvatar), ), if (showDynDecorate && !garbPendantImage.isNullOrEmpty) Positioned( @@ -100,12 +101,13 @@ class PendantAvatar extends StatelessWidget { ), ) else if (_badgeType != BadgeType.none) - _buildBadge(colorScheme), + _buildBadge(colorScheme, isMemberAvatar), ], ); } - Widget _buildAvatar(ColorScheme colorScheme) => size == 80 + Widget _buildAvatar(ColorScheme colorScheme, bool isMemberAvatar) => + isMemberAvatar ? DecoratedBox( decoration: BoxDecoration( border: Border.all( @@ -131,7 +133,7 @@ class PendantAvatar extends StatelessWidget { type: ImageType.avatar, ); - Widget _buildBadge(ColorScheme colorScheme) { + Widget _buildBadge(ColorScheme colorScheme, bool isMemberAvatar) { final child = switch (_badgeType) { BadgeType.vip => Image.asset( 'assets/images/big-vip.png', @@ -146,8 +148,8 @@ class PendantAvatar extends StatelessWidget { ), }; return Positioned( - right: 0, - bottom: 0, + right: isMemberAvatar ? 2 : 0, + bottom: isMemberAvatar ? 2 : 0, child: IgnorePointer( child: DecoratedBox( decoration: BoxDecoration( diff --git a/lib/pages/common/publish/common_publish_page.dart b/lib/pages/common/publish/common_publish_page.dart index 741e9c6c..61c97565 100644 --- a/lib/pages/common/publish/common_publish_page.dart +++ b/lib/pages/common/publish/common_publish_page.dart @@ -2,17 +2,11 @@ import 'dart:async'; import 'dart:io'; import 'dart:math' show max; -import 'package:PiliPlus/http/msg.dart'; import 'package:PiliPlus/models/common/publish_panel_type.dart'; -import 'package:PiliPlus/models_new/upload_bfs/data.dart'; import 'package:PiliPlus/utils/context_ext.dart'; -import 'package:PiliPlus/utils/feed_back.dart'; import 'package:chat_bottom_container/chat_bottom_container.dart'; -import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart' hide ContextExtensionss; -import 'package:image_picker/image_picker.dart'; abstract class CommonPublishPage extends StatefulWidget { const CommonPublishPage({ @@ -40,10 +34,6 @@ abstract class CommonPublishPageState late final RxBool readOnly = false.obs; late final RxBool enablePublish = false.obs; - late final imagePicker = ImagePicker(); - late final RxList pathList = [].obs; - int get limit => widget.imageLengthLimit ?? 9; - bool? hasPub; void initPubState(); @@ -87,7 +77,8 @@ abstract class CommonPublishPageState if (state == AppLifecycleState.resumed) { if (mounted && widget.autofocus && - panelType.value == PanelType.keyboard) { + (panelType.value == PanelType.keyboard || + panelType.value == PanelType.none)) { controller.restoreChatPanel(); WidgetsBinding.instance.addPostFrameCallback((_) { if (focusNode.hasFocus) { @@ -211,42 +202,7 @@ abstract class CommonPublishPageState ); } - Future onPublish() async { - feedBack(); - List>? pictures; - if (pathList.isNotEmpty) { - SmartDialog.showLoading(msg: '正在上传图片...'); - final cancelToken = CancelToken(); - try { - pictures = await Future.wait>( - pathList.map((path) async { - Map result = await MsgHttp.uploadBfs( - path: path, - category: 'daily', - biz: 'new_dyn', - cancelToken: cancelToken, - ); - if (!result['status']) throw HttpException(result['msg']); - UploadBfsResData data = result['data']; - return { - 'img_width': data.imageWidth, - 'img_height': data.imageHeight, - 'img_size': data.imgSize, - 'img_src': data.imageUrl, - }; - }), - eagerError: true, - ); - SmartDialog.dismiss(); - } on HttpException catch (e) { - cancelToken.cancel(); - SmartDialog.dismiss(); - SmartDialog.showToast(e.message); - return; - } - } - onCustomPublish(pictures: pictures); - } + Future onPublish(); Future onCustomPublish({List? pictures}); diff --git a/lib/pages/common/publish/common_rich_text_pub_page.dart b/lib/pages/common/publish/common_rich_text_pub_page.dart index 45d3b89b..b11f37ba 100644 --- a/lib/pages/common/publish/common_rich_text_pub_page.dart +++ b/lib/pages/common/publish/common_rich_text_pub_page.dart @@ -4,14 +4,18 @@ import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/button/toolbar_icon_button.dart'; import 'package:PiliPlus/common/widgets/text_field/controller.dart'; import 'package:PiliPlus/common/widgets/text_field/text_field.dart'; +import 'package:PiliPlus/http/msg.dart'; import 'package:PiliPlus/models/common/image_preview_type.dart'; import 'package:PiliPlus/models/common/publish_panel_type.dart'; import 'package:PiliPlus/models_new/dynamic/dyn_mention/item.dart'; import 'package:PiliPlus/models_new/emote/emote.dart' as e; import 'package:PiliPlus/models_new/live/live_emote/emoticon.dart'; +import 'package:PiliPlus/models_new/upload_bfs/data.dart'; import 'package:PiliPlus/pages/common/publish/common_publish_page.dart'; import 'package:PiliPlus/pages/dynamics_mention/view.dart'; +import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/page_utils.dart'; +import 'package:dio/dio.dart' show CancelToken; import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -36,6 +40,9 @@ abstract class CommonRichTextPubPage abstract class CommonRichTextPubPageState extends CommonPublishPageState { final key = GlobalKey(); + late final imagePicker = ImagePicker(); + late final RxList pathList = [].obs; + int get limit => widget.imageLengthLimit ?? 9; @override late final RichTextEditingController editController = @@ -380,9 +387,7 @@ abstract class CommonRichTextPubPageState } @override - void onSave() { - widget.onSave?.call(editController.items); - } + void onSave() => widget.onSave?.call(editController.items); Widget get emojiBtn => Obx( () { @@ -430,4 +435,42 @@ abstract class CommonRichTextPubPageState ); }, ); + + @override + Future onPublish() async { + feedBack(); + List>? pictures; + if (pathList.isNotEmpty) { + SmartDialog.showLoading(msg: '正在上传图片...'); + final cancelToken = CancelToken(); + try { + pictures = await Future.wait>( + pathList.map((path) async { + Map result = await MsgHttp.uploadBfs( + path: path, + category: 'daily', + biz: 'new_dyn', + cancelToken: cancelToken, + ); + if (!result['status']) throw HttpException(result['msg']); + UploadBfsResData data = result['data']; + return { + 'img_width': data.imageWidth, + 'img_height': data.imageHeight, + 'img_size': data.imgSize, + 'img_src': data.imageUrl, + }; + }), + eagerError: true, + ); + SmartDialog.dismiss(); + } on HttpException catch (e) { + cancelToken.cancel(); + SmartDialog.dismiss(); + SmartDialog.showToast(e.message); + return; + } + } + onCustomPublish(pictures: pictures); + } } diff --git a/lib/pages/common/publish/common_text_pub_page.dart b/lib/pages/common/publish/common_text_pub_page.dart index 12615355..d04412a0 100644 --- a/lib/pages/common/publish/common_text_pub_page.dart +++ b/lib/pages/common/publish/common_text_pub_page.dart @@ -1,4 +1,5 @@ import 'package:PiliPlus/pages/common/publish/common_publish_page.dart'; +import 'package:PiliPlus/utils/feed_back.dart'; import 'package:flutter/material.dart'; abstract class CommonTextPubPage extends CommonPublishPage { @@ -24,7 +25,11 @@ abstract class CommonTextPubPageState } @override - void onSave() { - widget.onSave?.call(editController.text); + void onSave() => widget.onSave?.call(editController.text); + + @override + Future onPublish() { + feedBack(); + return onCustomPublish(); } } diff --git a/lib/pages/common/reply_controller.dart b/lib/pages/common/reply_controller.dart index a0acea08..9c2ac48c 100644 --- a/lib/pages/common/reply_controller.dart +++ b/lib/pages/common/reply_controller.dart @@ -12,6 +12,7 @@ import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/reply_utils.dart'; import 'package:PiliPlus/utils/request_utils.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; +import 'package:PiliPlus/utils/utils.dart'; import 'package:easy_debounce/easy_throttle.dart'; import 'package:fixnum/fixnum.dart'; import 'package:flutter/material.dart'; @@ -181,7 +182,10 @@ abstract class ReplyController extends CommonListController { child: child, ); }, - settings: RouteSettings(arguments: Get.arguments), + settings: RouteSettings( + arguments: Get.arguments, + name: '${Get.currentRoute}-copy-${Utils.generateRandomString(3)}', + ), ), ) .then( diff --git a/lib/pages/fav/pgc/view.dart b/lib/pages/fav/pgc/view.dart index 9a120196..1dec60ba 100644 --- a/lib/pages/fav/pgc/view.dart +++ b/lib/pages/fav/pgc/view.dart @@ -41,7 +41,7 @@ class _FavPgcPageState extends State children: [ Expanded( child: TabBar( - overlayColor: WidgetStatePropertyAll(Colors.transparent), + overlayColor: const WidgetStatePropertyAll(Colors.transparent), splashFactory: NoSplash.splashFactory, isScrollable: true, tabAlignment: TabAlignment.start, diff --git a/lib/pages/member/view.dart b/lib/pages/member/view.dart index 37644436..c11cf0fc 100644 --- a/lib/pages/member/view.dart +++ b/lib/pages/member/view.dart @@ -59,14 +59,10 @@ class _MemberPageState extends State { controller: _userController.scrollController, onlyOneScrollInBody: true, pinnedHeaderSliverHeightBuilder: () => - kToolbarHeight + padding.top, + kToolbarHeight + MediaQuery.viewPaddingOf(context).top, headerSliverBuilder: (context, innerBoxIsScrolled) { return [ - _buildUserInfo( - theme, - padding, - _userController.loadingState.value, - ), + _buildUserInfo(theme, _userController.loadingState.value), ]; }, body: _userController.tab2?.isNotEmpty == true @@ -91,11 +87,7 @@ class _MemberPageState extends State { ); } return Center( - child: _buildUserInfo( - theme, - padding, - _userController.loadingState.value, - ), + child: _buildUserInfo(theme, _userController.loadingState.value), ); }, ), @@ -316,7 +308,6 @@ class _MemberPageState extends State { Widget _buildUserInfo( ThemeData theme, - EdgeInsets padding, LoadingState userState, ) { switch (userState) { @@ -338,7 +329,6 @@ class _MemberPageState extends State { onFollow: () => _userController.onFollow(context), live: _userController.live, silence: _userController.silence, - padding: padding, ), ), ); diff --git a/lib/pages/member/widget/user_info_card.dart b/lib/pages/member/widget/user_info_card.dart index a5f4b048..3b7a561e 100644 --- a/lib/pages/member/widget/user_info_card.dart +++ b/lib/pages/member/widget/user_info_card.dart @@ -1,6 +1,7 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/pendant_avatar.dart'; +import 'package:PiliPlus/common/widgets/view_safe_area.dart'; import 'package:PiliPlus/models/common/image_preview_type.dart'; import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/models_new/space/space/card.dart'; @@ -29,7 +30,6 @@ class UserInfoCard extends StatelessWidget { required this.onFollow, this.live, this.silence, - required this.padding, }); final bool isOwner; @@ -39,7 +39,6 @@ class UserInfoCard extends StatelessWidget { final VoidCallback onFollow; final Live? live; final int? silence; - final EdgeInsets padding; @override Widget build(BuildContext context) { @@ -420,7 +419,7 @@ class UserInfoCard extends StatelessWidget { child: PendantAvatar( avatar: card.face, size: 80, - badgeSize: 22, + badgeSize: 20, officialType: card.officialVerify?.type, isVip: (card.vip?.status ?? -1) > 0, garbPendantImage: card.pendant!.image!, @@ -531,12 +530,8 @@ class UserInfoCard extends StatelessWidget { children: [ // _buildHeader(context), const SizedBox(height: 56), - Padding( - padding: EdgeInsets.only( - top: padding.top, - left: padding.left, - right: padding.right, - ), + ViewSafeArea( + top: true, child: Row( children: [ const SizedBox(width: 20), diff --git a/lib/pages/pgc_review/post/view.dart b/lib/pages/pgc_review/post/view.dart index bf2c2291..768fafa0 100644 --- a/lib/pages/pgc_review/post/view.dart +++ b/lib/pages/pgc_review/post/view.dart @@ -1,13 +1,12 @@ import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/custom_icon.dart'; import 'package:PiliPlus/http/pgc.dart'; -import 'package:PiliPlus/pages/common/slide/common_collapse_slide_page.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; -class PgcReviewPostPanel extends CommonCollapseSlidePage { +class PgcReviewPostPanel extends StatefulWidget { const PgcReviewPostPanel({ super.key, required this.name, @@ -28,8 +27,7 @@ class PgcReviewPostPanel extends CommonCollapseSlidePage { State createState() => _PgcReviewPostPanelState(); } -class _PgcReviewPostPanelState - extends CommonCollapseSlidePageState { +class _PgcReviewPostPanelState extends State { late final _controller = TextEditingController(text: widget.content); late final RxInt _score = (widget.score ?? 0).obs; late final RxBool _shareFeed = false.obs; @@ -49,7 +47,7 @@ class _PgcReviewPostPanelState } @override - Widget buildPage(ThemeData theme) { + Widget build(BuildContext context) { final theme = Theme.of(context); return Column( mainAxisSize: MainAxisSize.min, @@ -84,7 +82,7 @@ class _PgcReviewPostPanelState ), Center( child: Padding( - padding: const EdgeInsets.only(top: 20, bottom: 10), + padding: const EdgeInsets.only(top: 10, bottom: 8), child: GestureDetector( behavior: HitTestBehavior.opaque, onHorizontalDragUpdate: (details) => @@ -139,17 +137,19 @@ class _PgcReviewPostPanelState }, ), ), - Padding( - padding: const EdgeInsets.all(12), - child: TextField( - maxLength: 100, - minLines: 5, - maxLines: 5, - controller: _controller, - decoration: const InputDecoration( - border: OutlineInputBorder(), + Flexible( + child: Padding( + padding: const EdgeInsets.all(12), + child: TextField( + maxLength: 100, + minLines: 5, + maxLines: 5, + controller: _controller, + decoration: const InputDecoration( + border: OutlineInputBorder(), + ), + textInputAction: TextInputAction.done, ), - textInputAction: TextInputAction.done, ), ), if (!_isMod) diff --git a/lib/pages/save_panel/view.dart b/lib/pages/save_panel/view.dart index 76bdcf93..d2baee12 100644 --- a/lib/pages/save_panel/view.dart +++ b/lib/pages/save_panel/view.dart @@ -515,9 +515,9 @@ class _SavePanelState extends State { ), ), Positioned( - left: padding.left, - right: padding.right, - bottom: 25 + padding.bottom, + left: 0, + right: 0, + bottom: 0, child: DecoratedBox( decoration: const BoxDecoration( gradient: LinearGradient( @@ -529,45 +529,54 @@ class _SavePanelState extends State { ], ), ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - iconButton( - size: 42, - tooltip: '关闭', - context: context, - icon: Icons.clear, - onPressed: Get.back, - bgColor: theme.colorScheme.onInverseSurface, - iconColor: theme.colorScheme.onSurfaceVariant, - ), - const SizedBox(width: 40), - iconButton( - size: 42, - tooltip: showBottom ? '隐藏' : '显示', - context: context, - icon: showBottom ? Icons.visibility_off : Icons.visibility, - onPressed: () => setState(() { - showBottom = !showBottom; - }), - ), - const SizedBox(width: 40), - iconButton( - size: 42, - tooltip: '分享', - context: context, - icon: Icons.share, - onPressed: () => _onSaveOrSharePic(true), - ), - const SizedBox(width: 40), - iconButton( - size: 42, - tooltip: '保存', - context: context, - icon: Icons.save_alt, - onPressed: _onSaveOrSharePic, - ), - ], + child: Padding( + padding: EdgeInsets.only( + left: padding.left, + right: padding.right, + bottom: 25 + padding.bottom, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + iconButton( + size: 42, + tooltip: '关闭', + context: context, + icon: Icons.clear, + onPressed: Get.back, + bgColor: theme.colorScheme.onInverseSurface, + iconColor: theme.colorScheme.onSurfaceVariant, + ), + const SizedBox(width: 40), + iconButton( + size: 42, + tooltip: showBottom ? '隐藏' : '显示', + context: context, + icon: showBottom + ? Icons.visibility_off + : Icons.visibility, + onPressed: () => setState(() { + showBottom = !showBottom; + }), + ), + const SizedBox(width: 40), + iconButton( + size: 42, + tooltip: '分享', + context: context, + icon: Icons.share, + onPressed: () => _onSaveOrSharePic(true), + ), + const SizedBox(width: 40), + iconButton( + size: 42, + tooltip: '保存', + context: context, + icon: Icons.save_alt, + onPressed: _onSaveOrSharePic, + ), + ], + ), ), ), ), diff --git a/lib/utils/page_utils.dart b/lib/utils/page_utils.dart index c2144426..be44cf81 100644 --- a/lib/utils/page_utils.dart +++ b/lib/utils/page_utils.dart @@ -43,14 +43,17 @@ class PageUtils { ValueChanged? onDismissed, int? quality, }) { - bool isMemberPage = Get.currentRoute.startsWith('/member?'); + final currentRoute = Get.currentRoute; + bool noneSet = + currentRoute.startsWith('/videoV') || + currentRoute.startsWith('/member?'); return Navigator.of(Get.context!).push( HeroDialogRoute( builder: (context) => InteractiveviewerGallery( sources: imgList, initIndex: initialPage, onDismissed: onDismissed, - setStatusBar: !isMemberPage, + setStatusBar: !noneSet, quality: quality ?? GlobalData().imgQuality, ), ),