From 8ab63e3da4cb0641b552d91d60d089d907dcbdb1 Mon Sep 17 00:00:00 2001 From: canxin Date: Fri, 12 Jul 2024 14:50:43 +0800 Subject: [PATCH] [Test] fix ios top padding --- .../music_container_pulldown_menu.dart | 3 +- .../local_music_container_listview_page.dart | 8 +- lib/pages/local_music_list_gridview_page.dart | 2 +- ..._local_music_container_listview_page.dart} | 168 +++++++++--------- ...elect_local_music_list_gridview_page.dart} | 55 +++--- .../reorder_local_music_list_grid_page.dart | 131 +++++++------- .../reorder_local_music_list_page.dart | 126 ++++++------- lib/utils/music_api_helper.dart | 17 +- 8 files changed, 260 insertions(+), 250 deletions(-) rename lib/pages/muti_select_pages/{muti_select_local_music_list_page.dart => muti_select_local_music_container_listview_page.dart} (63%) rename lib/pages/muti_select_pages/{muti_select_local_music_list_grid_page.dart => muti_select_local_music_list_gridview_page.dart} (88%) diff --git a/lib/comps/music_container_comp/music_container_pulldown_menu.dart b/lib/comps/music_container_comp/music_container_pulldown_menu.dart index 1e87527..97eadbf 100644 --- a/lib/comps/music_container_comp/music_container_pulldown_menu.dart +++ b/lib/comps/music_container_comp/music_container_pulldown_menu.dart @@ -106,7 +106,8 @@ class _MusicContainerMenuState extends State { ), if (hasCache) PullDownMenuItem( - onTap: () => delMusicCache(widget.musicContainer), + onTap: () => delMusicCache(widget.musicContainer, + showToastWhenNoMsuicCache: true), title: '删除缓存', icon: CupertinoIcons.delete_solid, ) diff --git a/lib/pages/local_music_container_listview_page.dart b/lib/pages/local_music_container_listview_page.dart index 891c633..867da76 100644 --- a/lib/pages/local_music_container_listview_page.dart +++ b/lib/pages/local_music_container_listview_page.dart @@ -1,4 +1,4 @@ -import 'package:app_rhyme/pages/muti_select_pages/muti_select_local_music_list_page.dart'; +import 'package:app_rhyme/pages/muti_select_pages/muti_select_local_music_container_listview_page.dart'; import 'package:app_rhyme/pages/reorder_pages/reorder_local_music_list_page.dart'; import 'package:app_rhyme/utils/logger.dart'; import 'package:chinese_font_library/chinese_font_library.dart'; @@ -285,10 +285,12 @@ class LocalMusicListChoicMenu extends StatelessWidget { PullDownMenuItem( onTap: () async { for (var musicContainer in musicContainers) { - await delMusicCache(musicContainer); + await delMusicCache(musicContainer, showToast: false); } + LogToast.success("删除所有音乐缓存", "删除所有音乐缓存成功", + "[LocalMusicListChoicMenu] Successfully deleted all music caches"); }, - title: '取消缓存所有音乐', + title: '删除所有音乐缓存', ), PullDownMenuItem( onTap: () { diff --git a/lib/pages/local_music_list_gridview_page.dart b/lib/pages/local_music_list_gridview_page.dart index 2dc17d6..c9fb1ec 100644 --- a/lib/pages/local_music_list_gridview_page.dart +++ b/lib/pages/local_music_list_gridview_page.dart @@ -1,6 +1,6 @@ import 'dart:io'; -import 'package:app_rhyme/pages/muti_select_pages/muti_select_local_music_list_grid_page.dart'; +import 'package:app_rhyme/pages/muti_select_pages/muti_select_local_music_list_gridview_page.dart'; import 'package:app_rhyme/pages/reorder_pages/reorder_local_music_list_grid_page.dart'; import 'package:app_rhyme/utils/global_vars.dart'; import 'package:app_rhyme/utils/logger.dart'; diff --git a/lib/pages/muti_select_pages/muti_select_local_music_list_page.dart b/lib/pages/muti_select_pages/muti_select_local_music_container_listview_page.dart similarity index 63% rename from lib/pages/muti_select_pages/muti_select_local_music_list_page.dart rename to lib/pages/muti_select_pages/muti_select_local_music_container_listview_page.dart index c85de10..b5597ce 100644 --- a/lib/pages/muti_select_pages/muti_select_local_music_list_page.dart +++ b/lib/pages/muti_select_pages/muti_select_local_music_container_listview_page.dart @@ -4,6 +4,7 @@ import 'package:app_rhyme/pages/local_music_container_listview_page.dart'; import 'package:app_rhyme/src/rust/api/factory_bind.dart'; import 'package:app_rhyme/src/rust/api/mirrors.dart'; import 'package:app_rhyme/utils/cache_helper.dart'; +import 'package:app_rhyme/utils/logger.dart'; import 'package:app_rhyme/utils/music_api_helper.dart'; import 'package:chinese_font_library/chinese_font_library.dart'; import 'package:flutter/cupertino.dart'; @@ -40,9 +41,7 @@ class MutiSelectLocalMusicContainerListPageState super.initState(); WidgetsBinding.instance.addObserver(this); controller.addListener(() { - setState(() { - print(111); - }); + setState(() {}); }); } @@ -114,91 +113,90 @@ class MutiSelectLocalMusicContainerListPageState return CupertinoPageScaffold( backgroundColor: backgroundColor, - navigationBar: CupertinoNavigationBar( - padding: const EdgeInsetsDirectional.only(end: 16), - backgroundColor: backgroundColor, - leading: CupertinoButton( - padding: const EdgeInsets.all(0), - child: Icon(CupertinoIcons.back, color: activeIconRed), - onPressed: () { - Navigator.pop(context); - }, - ), - trailing: MutiSelectLocalMusicContainerListChoiceMenu( - delSelected: handleDeleteSelected, - refresh: handleRefresh, - builder: (context, showMenu) => CupertinoButton( + child: Column(children: [ + CupertinoNavigationBar( + padding: const EdgeInsetsDirectional.only(end: 16), + backgroundColor: backgroundColor, + leading: CupertinoButton( padding: const EdgeInsets.all(0), - onPressed: showMenu, - child: Text( - '选项', - style: TextStyle(color: activeIconRed).useSystemChineseFont(), + child: Icon(CupertinoIcons.back, color: activeIconRed), + onPressed: () { + Navigator.pop(context); + }, + ), + trailing: MutiSelectLocalMusicContainerListChoiceMenu( + delSelected: handleDeleteSelected, + refresh: handleRefresh, + builder: (context, showMenu) => CupertinoButton( + padding: const EdgeInsets.all(0), + onPressed: showMenu, + child: Text( + '选项', + style: TextStyle(color: activeIconRed).useSystemChineseFont(), + ), ), + musicListW: widget.musicList, + musicContainers: controller.value.selectedIndexes + .map((index) => widget.musicContainers[index]) + .toList(), + cancelSelectAll: handleCancelSelectAll, + selectAll: handleSelectAll, + reverseSelect: handleReverseSelect, ), - musicListW: widget.musicList, - musicContainers: controller.value.selectedIndexes - .map((index) => widget.musicContainers[index]) - .toList(), - cancelSelectAll: handleCancelSelectAll, - selectAll: handleSelectAll, - reverseSelect: handleReverseSelect, ), - ), - child: Column(children: [ - SafeArea(child: SizedBox(height: Platform.isIOS ? 0 : 10)), - widget.musicContainers.isEmpty - ? Center( - child: Text( - "没有音乐", - style: TextStyle( - color: isDarkMode - ? CupertinoColors.white - : CupertinoColors.black), - ), - ) - : Align( - key: ValueKey(controller.hashCode), - alignment: Alignment.topCenter, - child: DragSelectGridView( - gridController: controller, - padding: - const EdgeInsets.only(bottom: 100, left: 10, right: 10), - itemCount: widget.musicContainers.length, - triggerSelectionOnTap: true, - itemBuilder: (context, index, selected) { - final musicContainer = widget.musicContainers[index]; - return Row( - key: ValueKey( - "${selected}_${musicContainer.hasCache()}_${musicContainer.hashCode}"), - children: [ - Expanded( - child: MusicContainerListItem( - key: ValueKey( - "${musicContainer.hasCache()}_${musicContainer.hashCode}"), - showMenu: false, - musicContainer: musicContainer, - musicListW: widget.musicList, - ), - ), - Icon( - selected - ? CupertinoIcons.check_mark_circled - : CupertinoIcons.circle, - color: selected - ? CupertinoColors.systemGreen - : CupertinoColors.systemGrey4, - ), - ], - ); - }, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 1, - mainAxisSpacing: 8.0, - crossAxisSpacing: 8.0, - childAspectRatio: 8 / 1, - ), - ), - ) + Expanded( + child: widget.musicContainers.isEmpty + ? Center( + child: Text( + "没有音乐", + style: TextStyle( + color: isDarkMode + ? CupertinoColors.white + : CupertinoColors.black), + ), + ) + : Align( + key: ValueKey(controller.hashCode), + alignment: Alignment.topCenter, + child: DragSelectGridView( + gridController: controller, + padding: const EdgeInsets.only( + bottom: 100, top: 10, left: 10, right: 10), + itemCount: widget.musicContainers.length, + triggerSelectionOnTap: true, + itemBuilder: (context, index, selected) { + final musicContainer = widget.musicContainers[index]; + return Row( + key: + ValueKey("${selected}_${musicContainer.info.id}"), + children: [ + Expanded( + child: MusicContainerListItem( + showMenu: false, + musicContainer: musicContainer, + musicListW: widget.musicList, + ), + ), + Icon( + selected + ? CupertinoIcons.check_mark_circled + : CupertinoIcons.circle, + color: selected + ? CupertinoColors.systemGreen + : CupertinoColors.systemGrey4, + ), + ], + ); + }, + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 1, + mainAxisSpacing: 8.0, + crossAxisSpacing: 8.0, + childAspectRatio: 8 / 1, + ), + ), + )) ]), ); } @@ -239,6 +237,8 @@ class MutiSelectLocalMusicContainerListChoiceMenu extends StatelessWidget { await delMusicCache(musicContainer); refresh(); } + LogToast.success("删除选中音乐缓存", "删除选中音乐缓存成功", + "[MutiSelectLocalMusicContainerListChoiceMenu] Successfully deleted selected music caches"); } Future handleDeleteFromList() async { diff --git a/lib/pages/muti_select_pages/muti_select_local_music_list_grid_page.dart b/lib/pages/muti_select_pages/muti_select_local_music_list_gridview_page.dart similarity index 88% rename from lib/pages/muti_select_pages/muti_select_local_music_list_grid_page.dart rename to lib/pages/muti_select_pages/muti_select_local_music_list_gridview_page.dart index 4a23900..8231bca 100644 --- a/lib/pages/muti_select_pages/muti_select_local_music_list_grid_page.dart +++ b/lib/pages/muti_select_pages/muti_select_local_music_list_gridview_page.dart @@ -126,9 +126,31 @@ class MutiSelectLocalMusicListGridPageState return CupertinoPageScaffold( backgroundColor: backgroundColor, - navigationBar: _buildNavigationBar(), child: Column(children: [ - SafeArea(child: SizedBox(height: Platform.isIOS ? 0 : 10)), + CupertinoNavigationBar( + padding: const EdgeInsetsDirectional.all(0), + leading: CupertinoButton( + padding: const EdgeInsets.all(0), + child: Icon(CupertinoIcons.back, color: activeIconRed), + onPressed: () { + Navigator.pop(context); + }, + ), + trailing: MutiSelectMusicListGridPageMenu( + builder: (context, showMenu) => CupertinoButton( + padding: const EdgeInsets.only(right: 16), + onPressed: showMenu, + child: Text( + "选项", + style: TextStyle(color: activeIconRed), + ), + ), + deleteMusicList: deleteMusicList, + selectAll: handleSelectAll, + cancelSelectAll: handleCancelSelectAll, + reverseSelect: handleReverseSelect, + ), + ), widget.musicLists.isEmpty ? Center( child: Text("没有歌单", style: TextStyle(color: textColor)), @@ -140,7 +162,7 @@ class MutiSelectLocalMusicListGridPageState child: DragSelectGridView( gridController: controller, padding: const EdgeInsets.only( - bottom: 100, left: 10, right: 10), + bottom: 100, top: 10, left: 10, right: 10), itemCount: widget.musicLists.length, triggerSelectionOnTap: true, itemBuilder: (context, index, selected) { @@ -182,33 +204,6 @@ class MutiSelectLocalMusicListGridPageState ) ])); } - - CupertinoNavigationBar _buildNavigationBar() { - return CupertinoNavigationBar( - padding: const EdgeInsetsDirectional.all(0), - leading: CupertinoButton( - padding: const EdgeInsets.all(0), - child: Icon(CupertinoIcons.back, color: activeIconRed), - onPressed: () { - Navigator.pop(context); - }, - ), - trailing: MutiSelectMusicListGridPageMenu( - builder: (context, showMenu) => CupertinoButton( - padding: const EdgeInsets.only(right: 16), - onPressed: showMenu, - child: Text( - "选项", - style: TextStyle(color: activeIconRed), - ), - ), - deleteMusicList: deleteMusicList, - selectAll: handleSelectAll, - cancelSelectAll: handleCancelSelectAll, - reverseSelect: handleReverseSelect, - ), - ); - } } @immutable diff --git a/lib/pages/reorder_pages/reorder_local_music_list_grid_page.dart b/lib/pages/reorder_pages/reorder_local_music_list_grid_page.dart index c33d2ca..fef6753 100644 --- a/lib/pages/reorder_pages/reorder_local_music_list_grid_page.dart +++ b/lib/pages/reorder_pages/reorder_local_music_list_grid_page.dart @@ -52,72 +52,75 @@ class ReorderLocalMusicListGridPageState return CupertinoPageScaffold( backgroundColor: backgroundColor, - navigationBar: CupertinoNavigationBar( - padding: const EdgeInsetsDirectional.all(0), - leading: CupertinoButton( - padding: const EdgeInsets.all(0), - child: Icon(CupertinoIcons.back, color: activeIconRed), - onPressed: () { - Navigator.pop(context); - }, - ), - trailing: CupertinoButton( - padding: const EdgeInsets.all(0), - child: Icon(CupertinoIcons.checkmark, color: activeIconRed), - onPressed: () async { - try { - List musicIds = widget.musicLists - .map((ml) => ml.getMusiclistInfo().id) - .toList(); - await SqlFactoryW.reorderMusiclist( - newIds: Int64List.fromList(musicIds)); - LogToast.success("歌单排序成功", "歌单排序成功", - "[ReorderLocalMusicListGridPageState] Music list reordered successfully"); - globalMusicListGridPageRefreshFunction(); - } catch (e) { - LogToast.error("歌单排序失败", "歌单排序错误:$e", - "[ReorderLocalMusicListGridPageState] Failed to reorder music list: $e"); - } - if (context.mounted) { - Navigator.pop(context); - } - }, - ), - ), child: Column( children: [ - SafeArea(child: SizedBox(height: Platform.isIOS ? 0 : 10)), - widget.musicLists.isEmpty - ? Center( - child: Text("没有歌单", style: TextStyle(color: textColor)), - ) - : Align( - alignment: Alignment.topCenter, - child: ReorderableWrap( - padding: const EdgeInsets.only(bottom: 100), - spacing: 8.0, - runSpacing: 8.0, - needsLongPressDraggable: true, - children: widget.musicLists.map((musicList) { - return SizedBox( - width: screenWidth / 2 - 20, - child: MusicListImageCard( - key: ValueKey(musicList.getMusiclistInfo().id), - musicListW: musicList, - online: false, - onTap: () {}, - cachePic: globalConfig.savePicWhenAddMusicList, - )); - }).toList(), - onReorder: (int oldIndex, int newIndex) { - setState(() { - final MusicListW item = - widget.musicLists.removeAt(oldIndex); - widget.musicLists.insert(newIndex, item); - }); - }, - ), - ) + CupertinoNavigationBar( + padding: const EdgeInsetsDirectional.all(0), + leading: CupertinoButton( + padding: const EdgeInsets.all(0), + child: Icon(CupertinoIcons.back, color: activeIconRed), + onPressed: () { + Navigator.pop(context); + }, + ), + trailing: CupertinoButton( + padding: const EdgeInsets.all(0), + child: Icon(CupertinoIcons.checkmark, color: activeIconRed), + onPressed: () async { + try { + List musicIds = widget.musicLists + .map((ml) => ml.getMusiclistInfo().id) + .toList(); + await SqlFactoryW.reorderMusiclist( + newIds: Int64List.fromList(musicIds)); + LogToast.success("歌单排序成功", "歌单排序成功", + "[ReorderLocalMusicListGridPageState] Music list reordered successfully"); + globalMusicListGridPageRefreshFunction(); + } catch (e) { + LogToast.error("歌单排序失败", "歌单排序错误:$e", + "[ReorderLocalMusicListGridPageState] Failed to reorder music list: $e"); + } + if (context.mounted) { + Navigator.pop(context); + } + }, + ), + ), + Expanded( + child: widget.musicLists.isEmpty + ? Center( + child: Text("没有歌单", style: TextStyle(color: textColor)), + ) + : Align( + alignment: Alignment.topCenter, + child: ReorderableWrap( + padding: const EdgeInsets.only( + bottom: 100, left: 10, right: 10, top: 10), + spacing: 8.0, + runSpacing: 8.0, + needsLongPressDraggable: true, + children: widget.musicLists.map((musicList) { + return SizedBox( + width: screenWidth / 2 - 20, + child: MusicListImageCard( + key: + ValueKey(musicList.getMusiclistInfo().id), + musicListW: musicList, + online: false, + onTap: () {}, + cachePic: + globalConfig.savePicWhenAddMusicList, + )); + }).toList(), + onReorder: (int oldIndex, int newIndex) { + setState(() { + final MusicListW item = + widget.musicLists.removeAt(oldIndex); + widget.musicLists.insert(newIndex, item); + }); + }, + ), + )) ], )); } diff --git a/lib/pages/reorder_pages/reorder_local_music_list_page.dart b/lib/pages/reorder_pages/reorder_local_music_list_page.dart index f8638f3..ec55e7f 100644 --- a/lib/pages/reorder_pages/reorder_local_music_list_page.dart +++ b/lib/pages/reorder_pages/reorder_local_music_list_page.dart @@ -54,70 +54,72 @@ class ReorderLocalMusicListPageState extends State return CupertinoPageScaffold( backgroundColor: backgroundColor, - navigationBar: CupertinoNavigationBar( - padding: const EdgeInsetsDirectional.all(0), - leading: CupertinoButton( - padding: const EdgeInsets.all(0), - child: Icon(CupertinoIcons.back, color: activeIconRed), - onPressed: () { - Navigator.pop(context); - }, - ), - trailing: CupertinoButton( - padding: const EdgeInsets.all(0), - child: Icon(CupertinoIcons.checkmark, color: activeIconRed), - onPressed: () async { - try { - List musicIds = - widget.musicContainers.map((ml) => ml.info.id).toList(); - await SqlFactoryW.reorderMusics( - musicListName: widget.musicList.getMusiclistInfo().name, - newIds: Int64List.fromList(musicIds)); - await globalMusicContainerListPageRefreshFunction(); - LogToast.success("歌曲排序成功", "歌曲排序成功", - "[ReorderLocalMusicListPageState] Music list reordered successfully"); - } catch (e) { - LogToast.error("歌曲排序失败", "歌曲排序错误:$e", - "[ReorderLocalMusicListPageState] Failed to reorder music list: $e"); - } - if (context.mounted) { - Navigator.pop(context); - } - }, - ), - ), child: Column( children: [ - SafeArea(child: SizedBox(height: Platform.isIOS ? 0 : 10)), - widget.musicContainers.isEmpty - ? Center( - child: Text("没有歌曲", style: TextStyle(color: textColor)), - ) - : Align( - alignment: Alignment.topCenter, - child: ReorderableWrap( - padding: const EdgeInsets.only(bottom: 100), - spacing: 8.0, - runSpacing: 8.0, - needsLongPressDraggable: true, - children: widget.musicContainers.map((musicContainer) { - return SizedBox( - width: screenWidth - 20, - child: MusicContainerListItem( - musicListW: widget.musicList, - musicContainer: musicContainer, - onTap: () {}, - )); - }).toList(), - onReorder: (int oldIndex, int newIndex) { - setState(() { - final MusicContainer item = - widget.musicContainers.removeAt(oldIndex); - widget.musicContainers.insert(newIndex, item); - }); - }, - ), - ) + CupertinoNavigationBar( + padding: const EdgeInsetsDirectional.all(0), + leading: CupertinoButton( + padding: const EdgeInsets.all(0), + child: Icon(CupertinoIcons.back, color: activeIconRed), + onPressed: () { + Navigator.pop(context); + }, + ), + trailing: CupertinoButton( + padding: const EdgeInsets.all(0), + child: Icon(CupertinoIcons.checkmark, color: activeIconRed), + onPressed: () async { + try { + List musicIds = + widget.musicContainers.map((ml) => ml.info.id).toList(); + await SqlFactoryW.reorderMusics( + musicListName: widget.musicList.getMusiclistInfo().name, + newIds: Int64List.fromList(musicIds)); + await globalMusicContainerListPageRefreshFunction(); + LogToast.success("歌曲排序成功", "歌曲排序成功", + "[ReorderLocalMusicListPageState] Music list reordered successfully"); + } catch (e) { + LogToast.error("歌曲排序失败", "歌曲排序错误:$e", + "[ReorderLocalMusicListPageState] Failed to reorder music list: $e"); + } + if (context.mounted) { + Navigator.pop(context); + } + }, + ), + ), + Expanded( + child: widget.musicContainers.isEmpty + ? Center( + child: Text("没有歌曲", style: TextStyle(color: textColor)), + ) + : Align( + alignment: Alignment.topCenter, + child: ReorderableWrap( + padding: const EdgeInsets.only( + bottom: 100, left: 10, right: 10, top: 10), + spacing: 8.0, + runSpacing: 8.0, + needsLongPressDraggable: true, + children: + widget.musicContainers.map((musicContainer) { + return SizedBox( + width: screenWidth - 20, + child: MusicContainerListItem( + musicListW: widget.musicList, + musicContainer: musicContainer, + onTap: () {}, + )); + }).toList(), + onReorder: (int oldIndex, int newIndex) { + setState(() { + final MusicContainer item = + widget.musicContainers.removeAt(oldIndex); + widget.musicContainers.insert(newIndex, item); + }); + }, + ), + )) ], )); } diff --git a/lib/utils/music_api_helper.dart b/lib/utils/music_api_helper.dart index bcce4b6..b1c8cb7 100644 --- a/lib/utils/music_api_helper.dart +++ b/lib/utils/music_api_helper.dart @@ -31,19 +31,26 @@ Future deleteMusicsFromLocalMusicList(BuildContext context, } } -Future delMusicCache(MusicContainer musicContainer) async { +Future delMusicCache(MusicContainer musicContainer, + {bool showToast = true, bool showToastWhenNoMsuicCache = false}) async { + // 这个函数运行耗时短,连续使用时应showToast = false try { bool hasCache = await musicContainer.hasCache(); if (!hasCache) { - LogToast.error("删除缓存失败", "音乐没有缓存", - "[deleteMusicCache] Failed to delete cache: music has no cache"); + if (showToastWhenNoMsuicCache && showToast) { + LogToast.error("删除缓存失败", "音乐没有缓存", + "[deleteMusicCache] Failed to delete cache: music has no cache"); + } return; } await rust_api_music_cache.deleteMusicCache(musicInfo: musicContainer.info); await globalMusicContainerListPageRefreshFunction(); - LogToast.success("删除缓存成功", "成功删除缓存: ${musicContainer.info.name}", - "[deleteMusicCache] Successfully deleted cache: ${musicContainer.info.name}"); + if (showToast) { + LogToast.success("删除缓存成功", "成功删除缓存: ${musicContainer.info.name}", + "[deleteMusicCache] Successfully deleted cache: ${musicContainer.info.name}"); + } } catch (e) { + // 失败时总是要显示toast LogToast.error("删除缓存失败", "删除缓存'${musicContainer.info.name}'失败: $e", "[deleteMusicCache] Failed to delete cache: $e"); }