From 8238e2fe6863294701c6be81f941d3b5ea8d907c Mon Sep 17 00:00:00 2001 From: zarzet Date: Thu, 7 May 2026 00:36:40 +0700 Subject: [PATCH] fix: prevent settings editor white screens --- lib/providers/extension_provider.dart | 25 ++++++++++++++----- lib/screens/settings/files_settings_page.dart | 14 ++++++++--- .../metadata_provider_priority_page.dart | 14 ++++------- .../settings/provider_priority_page.dart | 19 +++++--------- 4 files changed, 41 insertions(+), 31 deletions(-) diff --git a/lib/providers/extension_provider.dart b/lib/providers/extension_provider.dart index 0697132b..ac69c3b0 100644 --- a/lib/providers/extension_provider.dart +++ b/lib/providers/extension_provider.dart @@ -1645,10 +1645,11 @@ class ExtensionNotifier extends Notifier { } List getAllDownloadProviders() { - return state.extensions - .where((ext) => ext.enabled && ext.hasDownloadProvider) - .map((ext) => ext.id) - .toList(growable: false); + return _distinctProviderIds( + state.extensions + .where((ext) => ext.enabled && ext.hasDownloadProvider) + .map((ext) => ext.id), + ); } List getAllMetadataProviders() { @@ -1662,10 +1663,22 @@ class ExtensionNotifier extends Notifier { .where((ext) => ext.searchBehavior?.primary != true) .map((ext) => ext.id); - return [ + return _distinctProviderIds([ ...primarySearchMetadataExtensions, ...otherMetadataExtensions, - ]; + ]); + } + + List _distinctProviderIds(Iterable ids) { + final seen = {}; + final result = []; + for (final id in ids) { + final normalized = id.trim(); + if (normalized.isNotEmpty && seen.add(normalized)) { + result.add(normalized); + } + } + return result; } List _replaceRetiredBuiltInMetadataProviders(List input) { diff --git a/lib/screens/settings/files_settings_page.dart b/lib/screens/settings/files_settings_page.dart index 96bf6cc2..9e0edba6 100644 --- a/lib/screens/settings/files_settings_page.dart +++ b/lib/screens/settings/files_settings_page.dart @@ -755,8 +755,8 @@ class _FilesSettingsPageState extends ConsumerState { showModalBottomSheet( context: context, - useRootNavigator: true, isScrollControlled: true, + useSafeArea: true, backgroundColor: colorScheme.surface, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical(top: Radius.circular(28)), @@ -794,7 +794,15 @@ class _FilesSettingsPageState extends ConsumerState { const SizedBox(height: 8), Text( description ?? - context.l10n.downloadFilenameDescription as String, + context.l10n.downloadFilenameDescription( + '{album}', + '{artist}', + '{date}', + '{disc}', + '{title}', + '{track}', + '{year}', + ), style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: colorScheme.onSurfaceVariant, ), @@ -924,7 +932,7 @@ class _FilesSettingsPageState extends ConsumerState { ), ), ), - ); + ).whenComplete(controller.dispose); } void _showAlbumFolderStructurePicker( diff --git a/lib/screens/settings/metadata_provider_priority_page.dart b/lib/screens/settings/metadata_provider_priority_page.dart index c100bf34..45ee948a 100644 --- a/lib/screens/settings/metadata_provider_priority_page.dart +++ b/lib/screens/settings/metadata_provider_priority_page.dart @@ -114,14 +114,13 @@ class _MetadataProviderPriorityPageState await ref .read(extensionProvider.notifier) .setMetadataProviderPriority(_providers); + if (!mounted) return; setState(() { _hasChanges = false; }); - if (mounted) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(context.l10n.snackbarMetadataProviderSaved)), - ); - } + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(context.l10n.snackbarMetadataProviderSaved)), + ); } } @@ -188,10 +187,7 @@ class _MetadataProviderItem extends StatelessWidget { ), ), const SizedBox(width: 16), - Icon( - info.icon, - color: colorScheme.secondary, - ), + Icon(info.icon, color: colorScheme.secondary), const SizedBox(width: 12), Expanded( child: Column( diff --git a/lib/screens/settings/provider_priority_page.dart b/lib/screens/settings/provider_priority_page.dart index 8c4f7933..491efc14 100644 --- a/lib/screens/settings/provider_priority_page.dart +++ b/lib/screens/settings/provider_priority_page.dart @@ -220,14 +220,13 @@ class _ProviderPriorityPageState extends ConsumerState { Future _saveChanges() async { await ref.read(extensionProvider.notifier).setProviderPriority(_providers); + if (!mounted) return; setState(() { _hasChanges = false; }); - if (mounted) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(context.l10n.snackbarProviderPrioritySaved)), - ); - } + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(context.l10n.snackbarProviderPrioritySaved)), + ); } } @@ -294,10 +293,7 @@ class _ProviderItem extends StatelessWidget { ), ), const SizedBox(width: 16), - Icon( - info.icon, - color: colorScheme.secondary, - ), + Icon(info.icon, color: colorScheme.secondary), const SizedBox(width: 12), Expanded( child: Column( @@ -339,8 +335,5 @@ class _ProviderInfo { final String name; final IconData icon; - _ProviderInfo({ - required this.name, - required this.icon, - }); + _ProviderInfo({required this.name, required this.icon}); }