From 859ee82367162c82a92d1cd7bd0f15fa8122d18a Mon Sep 17 00:00:00 2001 From: guozhigq Date: Mon, 25 Nov 2024 23:40:48 +0800 Subject: [PATCH] opt: bottomSheet DragHandle --- lib/common/widgets/drag_handle.dart | 25 +++ lib/common/widgets/video_card_h.dart | 20 +-- lib/common/widgets/video_card_v.dart | 20 +-- lib/pages/bangumi/introduction/view.dart | 20 +-- .../introduction/widgets/intro_detail.dart | 154 ++++++++---------- lib/pages/dynamics/widgets/author_panel.dart | 21 +-- .../detail/reply/widgets/reply_item.dart | 20 +-- lib/pages/video/detail/widgets/ai_detail.dart | 36 ++-- .../video/detail/widgets/header_control.dart | 18 +- .../pl_gallery/interactiveviewer_gallery.dart | 22 +-- 10 files changed, 129 insertions(+), 227 deletions(-) create mode 100644 lib/common/widgets/drag_handle.dart diff --git a/lib/common/widgets/drag_handle.dart b/lib/common/widgets/drag_handle.dart new file mode 100644 index 00000000..1143a732 --- /dev/null +++ b/lib/common/widgets/drag_handle.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +class DragHandle extends StatelessWidget { + const DragHandle({super.key}); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: Navigator.of(context).pop, + child: SizedBox( + height: 36, + child: Center( + child: Container( + width: 32, + height: 4, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.outline, + borderRadius: BorderRadius.circular(4), + ), + ), + ), + ), + ); + } +} diff --git a/lib/common/widgets/video_card_h.dart b/lib/common/widgets/video_card_h.dart index 78c4ba87..b662a3b0 100644 --- a/lib/common/widgets/video_card_h.dart +++ b/lib/common/widgets/video_card_h.dart @@ -12,6 +12,7 @@ import '../../http/video.dart'; import '../../utils/utils.dart'; import '../constants.dart'; import 'badge.dart'; +import 'drag_handle.dart'; import 'network_img_layer.dart'; import 'stat/danmu.dart'; import 'stat/view.dart'; @@ -373,27 +374,12 @@ class MorePanel extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( + return Padding( padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom), child: Column( mainAxisSize: MainAxisSize.min, children: [ - InkWell( - onTap: () => Get.back(), - child: Container( - height: 35, - padding: const EdgeInsets.only(bottom: 2), - child: Center( - child: Container( - width: 32, - height: 3, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.outline, - borderRadius: const BorderRadius.all(Radius.circular(3))), - ), - ), - ), - ), + const DragHandle(), ListTile( onTap: () async => await menuActionHandler('block'), minLeadingWidth: 0, diff --git a/lib/common/widgets/video_card_v.dart b/lib/common/widgets/video_card_v.dart index 8cec3523..72cfb998 100644 --- a/lib/common/widgets/video_card_v.dart +++ b/lib/common/widgets/video_card_v.dart @@ -5,6 +5,7 @@ import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/image_save.dart'; import 'package:pilipala/utils/route_push.dart'; import '../../models/model_rec_video_item.dart'; +import 'drag_handle.dart'; import 'stat/danmu.dart'; import 'stat/view.dart'; import '../../http/dynamics.dart'; @@ -368,27 +369,12 @@ class MorePanel extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( + return Padding( padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom), child: Column( mainAxisSize: MainAxisSize.min, children: [ - InkWell( - onTap: () => Get.back(), - child: Container( - height: 35, - padding: const EdgeInsets.only(bottom: 2), - child: Center( - child: Container( - width: 32, - height: 3, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.outline, - borderRadius: const BorderRadius.all(Radius.circular(3))), - ), - ), - ), - ), + const DragHandle(), ListTile( onTap: () async => await menuActionHandler('block'), minLeadingWidth: 0, diff --git a/lib/pages/bangumi/introduction/view.dart b/lib/pages/bangumi/introduction/view.dart index 75e293c4..4fc6a1b1 100644 --- a/lib/pages/bangumi/introduction/view.dart +++ b/lib/pages/bangumi/introduction/view.dart @@ -5,6 +5,7 @@ import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:pilipala/common/constants.dart'; import 'package:pilipala/common/widgets/badge.dart'; +import 'package:pilipala/common/widgets/drag_handle.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/stat/danmu.dart'; import 'package:pilipala/common/widgets/stat/view.dart'; @@ -445,27 +446,12 @@ class BangumiStatusWidget extends StatelessWidget { } Widget morePanel(BuildContext context, BangumiIntroController ctr) { - return Container( + return Padding( padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom), child: Column( mainAxisSize: MainAxisSize.min, children: [ - InkWell( - onTap: () => Get.back(), - child: Container( - height: 35, - padding: const EdgeInsets.only(bottom: 2), - child: Center( - child: Container( - width: 32, - height: 3, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.outline, - borderRadius: const BorderRadius.all(Radius.circular(3))), - ), - ), - ), - ), + const DragHandle(), ...ctr.followStatusList .map( (e) => ListTile( diff --git a/lib/pages/bangumi/introduction/widgets/intro_detail.dart b/lib/pages/bangumi/introduction/widgets/intro_detail.dart index a4c469de..04c035ed 100644 --- a/lib/pages/bangumi/introduction/widgets/intro_detail.dart +++ b/lib/pages/bangumi/introduction/widgets/intro_detail.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hive/hive.dart'; +import 'package:pilipala/common/widgets/drag_handle.dart'; import 'package:pilipala/common/widgets/stat/danmu.dart'; import 'package:pilipala/common/widgets/stat/view.dart'; import 'package:pilipala/utils/storage.dart'; @@ -23,94 +24,81 @@ class IntroDetail extends StatelessWidget { color: Theme.of(context).colorScheme.onSurface, ); return Container( - color: Theme.of(context).colorScheme.surface, - padding: const EdgeInsets.only(left: 14, right: 14), + padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom), height: sheetHeight, child: Column( children: [ - Container( - height: 35, - padding: const EdgeInsets.only(bottom: 2), - child: Center( - child: Container( - width: 32, - height: 3, - decoration: BoxDecoration( - color: Theme.of(context) - .colorScheme - .onSecondaryContainer - .withOpacity(0.5), - borderRadius: const BorderRadius.all(Radius.circular(3))), - ), - ), - ), + const DragHandle(), Expanded( - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - bangumiDetail!.title, - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, + child: Padding( + padding: const EdgeInsets.only(left: 16, right: 16), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + bangumiDetail!.title, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + ), ), - ), - const SizedBox(height: 4), - Row( - children: [ - StatView( - view: bangumiDetail!.stat!['views'], - size: 'medium', - ), - const SizedBox(width: 6), - StatDanMu( - danmu: bangumiDetail!.stat!['danmakus'], - size: 'medium', - ), - ], - ), - const SizedBox(height: 4), - Row( - children: [ - Text( - bangumiDetail!.areas!.first['name'], - style: smallTitle, - ), - const SizedBox(width: 6), - Text( - bangumiDetail!.publish!['pub_time_show'], - style: smallTitle, - ), - const SizedBox(width: 6), - Text( - bangumiDetail!.newEp!['desc'], - style: smallTitle, - ), - ], - ), - const SizedBox(height: 20), - Text( - '简介:', - style: Theme.of(context).textTheme.titleMedium, - ), - const SizedBox(height: 4), - Text( - '${bangumiDetail!.evaluate!}', - style: smallTitle.copyWith(fontSize: 13), - ), - const SizedBox(height: 20), - Text( - '声优:', - style: Theme.of(context).textTheme.titleMedium, - ), - const SizedBox(height: 4), - Text( - bangumiDetail.actors, - style: smallTitle.copyWith(fontSize: 13), - ), - SizedBox(height: MediaQuery.of(context).padding.bottom + 20) - ], + const SizedBox(height: 4), + Row( + children: [ + StatView( + view: bangumiDetail!.stat!['views'], + size: 'medium', + ), + const SizedBox(width: 6), + StatDanMu( + danmu: bangumiDetail!.stat!['danmakus'], + size: 'medium', + ), + ], + ), + const SizedBox(height: 4), + Row( + children: [ + Text( + bangumiDetail!.areas!.first['name'], + style: smallTitle, + ), + const SizedBox(width: 6), + Text( + bangumiDetail!.publish!['pub_time_show'], + style: smallTitle, + ), + const SizedBox(width: 6), + Text( + bangumiDetail!.newEp!['desc'], + style: smallTitle, + ), + ], + ), + const SizedBox(height: 20), + Text( + '简介:', + style: Theme.of(context).textTheme.titleMedium, + ), + const SizedBox(height: 4), + Text( + '${bangumiDetail!.evaluate!}', + style: smallTitle.copyWith(fontSize: 13), + ), + const SizedBox(height: 20), + Text( + '声优:', + style: Theme.of(context).textTheme.titleMedium, + ), + const SizedBox(height: 4), + Text( + bangumiDetail.actors, + style: smallTitle.copyWith(fontSize: 13), + ), + SizedBox(height: MediaQuery.of(context).padding.bottom + 20) + ], + ), ), ), ) diff --git a/lib/pages/dynamics/widgets/author_panel.dart b/lib/pages/dynamics/widgets/author_panel.dart index 8acdc26a..64068b0a 100644 --- a/lib/pages/dynamics/widgets/author_panel.dart +++ b/lib/pages/dynamics/widgets/author_panel.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; +import 'package:pilipala/common/widgets/drag_handle.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/http/user.dart'; import 'package:pilipala/utils/feed_back.dart'; @@ -108,28 +109,12 @@ class MorePanel extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( + return Padding( padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom), - // clipBehavior: Clip.hardEdge, child: Column( mainAxisSize: MainAxisSize.min, children: [ - InkWell( - onTap: () => Get.back(), - child: Container( - height: 35, - padding: const EdgeInsets.only(bottom: 2), - child: Center( - child: Container( - width: 32, - height: 3, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.outline, - borderRadius: const BorderRadius.all(Radius.circular(3))), - ), - ), - ), - ), + const DragHandle(), ListTile( onTap: () async { try { diff --git a/lib/pages/video/detail/reply/widgets/reply_item.dart b/lib/pages/video/detail/reply/widgets/reply_item.dart index e0a6d07f..a453a0fb 100644 --- a/lib/pages/video/detail/reply/widgets/reply_item.dart +++ b/lib/pages/video/detail/reply/widgets/reply_item.dart @@ -7,6 +7,7 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:pilipala/common/widgets/badge.dart'; +import 'package:pilipala/common/widgets/drag_handle.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/http/reply.dart'; import 'package:pilipala/models/common/reply_type.dart'; @@ -1117,27 +1118,12 @@ class MorePanel extends StatelessWidget { ColorScheme colorScheme = Theme.of(context).colorScheme; TextTheme textTheme = Theme.of(context).textTheme; Color errorColor = colorScheme.error; - return Container( + return Padding( padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom), child: Column( mainAxisSize: MainAxisSize.min, children: [ - InkWell( - onTap: () => Get.back(), - child: Container( - height: 35, - padding: const EdgeInsets.only(bottom: 2), - child: Center( - child: Container( - width: 32, - height: 3, - decoration: BoxDecoration( - color: colorScheme.outline, - borderRadius: const BorderRadius.all(Radius.circular(3))), - ), - ), - ), - ), + const DragHandle(), ListTile( onTap: () async => await menuActionHandler('copyAll'), minLeadingWidth: 0, diff --git a/lib/pages/video/detail/widgets/ai_detail.dart b/lib/pages/video/detail/widgets/ai_detail.dart index c17591fb..a82e3506 100644 --- a/lib/pages/video/detail/widgets/ai_detail.dart +++ b/lib/pages/video/detail/widgets/ai_detail.dart @@ -1,6 +1,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:pilipala/common/widgets/drag_handle.dart'; import 'package:pilipala/models/video/ai.dart'; import 'package:pilipala/pages/video/detail/index.dart'; import 'package:pilipala/utils/global_data_cache.dart'; @@ -17,21 +18,24 @@ class AiDetail extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - padding: const EdgeInsets.only(left: 16, right: 16), + padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom), height: GlobalDataCache.sheetHeight, child: Column( children: [ - _buildHeader(context), + const DragHandle(), Expanded( child: SingleChildScrollView( - child: Column( - children: [ - if (modelResult!.summary != '') ...[ - _buildSummaryText(modelResult!.summary!), - const SizedBox(height: 20), + child: Padding( + padding: const EdgeInsets.only(left: 16, right: 16), + child: Column( + children: [ + if (modelResult!.summary != '') ...[ + _buildSummaryText(modelResult!.summary!), + const SizedBox(height: 20), + ], + _buildOutlineList(context), ], - _buildOutlineList(context), - ], + ), ), ), ), @@ -40,20 +44,6 @@ class AiDetail extends StatelessWidget { ); } - Widget _buildHeader(BuildContext context) { - return Center( - child: Container( - decoration: BoxDecoration( - color: Theme.of(context).hintColor, - borderRadius: const BorderRadius.all(Radius.circular(10)), - ), - height: 4, - width: 40, - margin: const EdgeInsets.symmetric(vertical: 16), - ), - ); - } - Widget _buildSummaryText(String summary) { return SelectableText( summary, diff --git a/lib/pages/video/detail/widgets/header_control.dart b/lib/pages/video/detail/widgets/header_control.dart index 5b2c51ae..0fbdc493 100644 --- a/lib/pages/video/detail/widgets/header_control.dart +++ b/lib/pages/video/detail/widgets/header_control.dart @@ -8,6 +8,7 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:ns_danmaku/ns_danmaku.dart'; +import 'package:pilipala/common/widgets/drag_handle.dart'; import 'package:pilipala/http/user.dart'; import 'package:pilipala/models/video/play/quality.dart'; import 'package:pilipala/models/video/play/url.dart'; @@ -102,22 +103,7 @@ class _HeaderControlState extends State { margin: const EdgeInsets.all(12), child: Column( children: [ - SizedBox( - height: 35, - child: Center( - child: Container( - width: 32, - height: 3, - decoration: BoxDecoration( - color: Theme.of(context) - .colorScheme - .onSecondaryContainer - .withOpacity(0.5), - borderRadius: - const BorderRadius.all(Radius.circular(3))), - ), - ), - ), + const DragHandle(), Expanded( child: Material( child: ListView( diff --git a/lib/plugin/pl_gallery/interactiveviewer_gallery.dart b/lib/plugin/pl_gallery/interactiveviewer_gallery.dart index 88c9129c..6776b10c 100644 --- a/lib/plugin/pl_gallery/interactiveviewer_gallery.dart +++ b/lib/plugin/pl_gallery/interactiveviewer_gallery.dart @@ -7,8 +7,8 @@ import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:pilipala/common/widgets/drag_handle.dart'; import 'package:pilipala/utils/download.dart'; import 'package:share_plus/share_plus.dart'; import 'package:status_bar_control/status_bar_control.dart'; @@ -423,29 +423,13 @@ class _InteractiveviewerGalleryState extends State useRootNavigator: true, isScrollControlled: true, builder: (context) { - return Container( + return Padding( padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom), child: Column( mainAxisSize: MainAxisSize.min, children: [ - InkWell( - onTap: () => Get.back(), - child: Container( - height: 35, - padding: const EdgeInsets.only(bottom: 2), - child: Center( - child: Container( - width: 32, - height: 3, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.outline, - borderRadius: - const BorderRadius.all(Radius.circular(3))), - ), - ), - ), - ), + const DragHandle(), ..._buildListTitles(), ], ),