From e0e28aee381612143ce37d225a13af36a16b58be Mon Sep 17 00:00:00 2001 From: zarzet Date: Mon, 29 Jun 2026 06:46:47 +0700 Subject: [PATCH] fix: preview player lifecycle and minor safety cleanups - search_screen caches PreviewPlayerController in initState to avoid ref access during dispose - extension_provider: convert enabledExtensions/searchProviders getters to methods - artist_screen: drop redundant null assertions on motion banner inputs --- lib/providers/extension_provider.dart | 8 +++----- lib/screens/artist_screen.dart | 4 ++-- lib/screens/search_screen.dart | 4 +++- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/providers/extension_provider.dart b/lib/providers/extension_provider.dart index 92727cb9..078d38f0 100644 --- a/lib/providers/extension_provider.dart +++ b/lib/providers/extension_provider.dart @@ -1670,7 +1670,7 @@ class ExtensionNotifier extends Notifier { } } - List get enabledExtensions { + List enabledExtensions() { return state.extensions.where((ext) => ext.enabled).toList(); } @@ -1747,7 +1747,7 @@ class ExtensionNotifier extends Notifier { return result; } - List get searchProviders { + List searchProviders() { return state.extensions .where((ext) => ext.enabled && ext.hasCustomSearch) .toList(); @@ -1761,9 +1761,7 @@ class ExtensionNotifier extends Notifier { void scan(Object? settingsList) { if (settingsList is! List) return; for (final entry in settingsList) { - if (entry is Map && - entry['secret'] == true && - entry['key'] is String) { + if (entry is Map && entry['secret'] == true && entry['key'] is String) { keys.add(entry['key'] as String); } } diff --git a/lib/screens/artist_screen.dart b/lib/screens/artist_screen.dart index caa16083..6dee6e2a 100644 --- a/lib/screens/artist_screen.dart +++ b/lib/screens/artist_screen.dart @@ -1206,10 +1206,10 @@ class _ArtistScreenState extends ConsumerState { children: [ if (hasMotionBanner) MotionHeaderBanner( - videoUrl: headerVideoUrl!, + videoUrl: headerVideoUrl, fallback: hasValidImage ? CachedCoverImage( - imageUrl: imageUrl!, + imageUrl: imageUrl, fit: BoxFit.cover, alignment: Alignment.topCenter, memCacheWidth: 800, diff --git a/lib/screens/search_screen.dart b/lib/screens/search_screen.dart index bd36b1b5..f7db367c 100644 --- a/lib/screens/search_screen.dart +++ b/lib/screens/search_screen.dart @@ -25,11 +25,13 @@ class SearchScreen extends ConsumerStatefulWidget { class _SearchScreenState extends ConsumerState { late TextEditingController _searchController; + late PreviewPlayerController _previewPlayerController; @override void initState() { super.initState(); _searchController = TextEditingController(text: widget.query); + _previewPlayerController = ref.read(previewPlayerProvider.notifier); if (widget.query.isNotEmpty) { WidgetsBinding.instance.addPostFrameCallback((_) { ref.read(trackProvider.notifier).search(widget.query); @@ -39,7 +41,7 @@ class _SearchScreenState extends ConsumerState { @override void dispose() { - ref.read(previewPlayerProvider.notifier).stop(); + _previewPlayerController.stop(); _searchController.dispose(); super.dispose(); }