From c0c1d745f3afc90bdbf801440b05b148e5b6a4c4 Mon Sep 17 00:00:00 2001 From: zarzet Date: Tue, 30 Jun 2026 06:20:57 +0700 Subject: [PATCH] refactor: hoist lossless labels before async convert paths Capture lossless conversion labels before await boundaries in queue, downloaded album, and track metadata flows to avoid BuildContext usage across async gaps. --- lib/screens/downloaded_album_screen.dart | 9 +++---- lib/screens/queue_tab.dart | 9 +++---- lib/screens/track_metadata_edit_sheet.dart | 18 ++++---------- lib/screens/track_metadata_screen.dart | 29 +++++++++++++--------- 4 files changed, 30 insertions(+), 35 deletions(-) diff --git a/lib/screens/downloaded_album_screen.dart b/lib/screens/downloaded_album_screen.dart index ebf679bc..2654e23e 100644 --- a/lib/screens/downloaded_album_screen.dart +++ b/lib/screens/downloaded_album_screen.dart @@ -1199,6 +1199,7 @@ class _DownloadedAlbumScreenState extends ConsumerState { } final isLossless = isLosslessConversionTarget(targetFormat); + final losslessLabels = context.l10n.losslessConversionLabels; final confirmed = await showDialog( context: context, builder: (ctx) => AlertDialog( @@ -1210,10 +1211,8 @@ class _DownloadedAlbumScreenState extends ConsumerState { targetFormat, losslessQualityLabel( losslessQuality, - originalLabel: - context.l10n.losslessConversionLabels.original, - originalQualityLabel: - context.l10n.losslessConversionLabels.originalQuality, + originalLabel: losslessLabels.original, + originalQualityLabel: losslessLabels.originalQuality, ), ) : isLossless @@ -1367,7 +1366,7 @@ class _DownloadedAlbumScreenState extends ConsumerState { final newQuality = convertedAudioQualityLabel( targetFormat: targetFormat, bitrate: bitrate, - labels: context.l10n.losslessConversionLabels, + labels: losslessLabels, losslessQuality: losslessQuality, actualBitDepth: convertedBitDepth, actualSampleRate: convertedSampleRate, diff --git a/lib/screens/queue_tab.dart b/lib/screens/queue_tab.dart index 606256d8..473c88a0 100644 --- a/lib/screens/queue_tab.dart +++ b/lib/screens/queue_tab.dart @@ -5642,6 +5642,7 @@ class _QueueTabState extends ConsumerState { } final isLossless = isLosslessConversionTarget(targetFormat); + final losslessLabels = context.l10n.losslessConversionLabels; final confirmed = await showDialog( context: context, builder: (ctx) => AlertDialog( @@ -5653,10 +5654,8 @@ class _QueueTabState extends ConsumerState { targetFormat, losslessQualityLabel( losslessQuality, - originalLabel: - context.l10n.losslessConversionLabels.original, - originalQualityLabel: - context.l10n.losslessConversionLabels.originalQuality, + originalLabel: losslessLabels.original, + originalQualityLabel: losslessLabels.originalQuality, ), ) : isLossless @@ -5819,7 +5818,7 @@ class _QueueTabState extends ConsumerState { final newQuality = convertedAudioQualityLabel( targetFormat: targetFormat, bitrate: bitrate, - labels: context.l10n.losslessConversionLabels, + labels: losslessLabels, losslessQuality: losslessQuality, actualBitDepth: convertedBitDepth, actualSampleRate: convertedSampleRate, diff --git a/lib/screens/track_metadata_edit_sheet.dart b/lib/screens/track_metadata_edit_sheet.dart index 8663a0c5..5dd3a4bb 100644 --- a/lib/screens/track_metadata_edit_sheet.dart +++ b/lib/screens/track_metadata_edit_sheet.dart @@ -1309,10 +1309,7 @@ class _EditMetadataSheetState extends State<_EditMetadataSheet> { ], ), ), - Divider( - height: 1, - color: cs.outlineVariant.withValues(alpha: 0.5), - ), + Divider(height: 1, color: cs.outlineVariant.withValues(alpha: 0.5)), Expanded( child: ListView( controller: scrollController, @@ -1325,10 +1322,7 @@ class _EditMetadataSheetState extends State<_EditMetadataSheet> { title: context.l10n.trackMetadata, children: [ _field(context.l10n.editMetadataFieldTitle, _titleCtrl), - _field( - context.l10n.editMetadataFieldArtist, - _artistCtrl, - ), + _field(context.l10n.editMetadataFieldArtist, _artistCtrl), _field(context.l10n.editMetadataFieldAlbum, _albumCtrl), _field( context.l10n.editMetadataFieldAlbumArtist, @@ -1401,10 +1395,7 @@ class _EditMetadataSheetState extends State<_EditMetadataSheet> { expanded: _showAdvanced, children: [ if (_showAdvanced) ...[ - _field( - context.l10n.editMetadataFieldLabel, - _labelCtrl, - ), + _field(context.l10n.editMetadataFieldLabel, _labelCtrl), _field( context.l10n.editMetadataFieldCopyright, _copyrightCtrl, @@ -1632,7 +1623,8 @@ class _EditMetadataSheetState extends State<_EditMetadataSheet> { child: _buildCoverPreviewTile( cs: cs, path: _selectedCoverPath!, - label: _selectedCoverName == + label: + _selectedCoverName == _EditMetadataSheet._onlineCoverSentinel ? context.l10n.trackCoverOnline : (_selectedCoverName ?? diff --git a/lib/screens/track_metadata_screen.dart b/lib/screens/track_metadata_screen.dart index 48a6b2c1..619cabaa 100644 --- a/lib/screens/track_metadata_screen.dart +++ b/lib/screens/track_metadata_screen.dart @@ -4105,17 +4105,20 @@ class _TrackMetadataScreenState extends ConsumerState { selectedMaxBitDepth == null && selectedMaxSampleRate == null ? context.l10n.trackConvertLosslessHint - : context.l10n.trackConvertLosslessOutputWithCap( - losslessQualityLabel( - LosslessConversionQuality( - maxBitDepth: selectedMaxBitDepth, - maxSampleRate: selectedMaxSampleRate, + : context.l10n + .trackConvertLosslessOutputWithCap( + losslessQualityLabel( + LosslessConversionQuality( + maxBitDepth: + selectedMaxBitDepth, + maxSampleRate: + selectedMaxSampleRate, + ), + originalLabel: labels.original, + originalQualityLabel: + labels.originalQuality, + ), ), - originalLabel: labels.original, - originalQualityLabel: - labels.originalQuality, - ), - ), style: Theme.of(context).textTheme.bodySmall ?.copyWith(color: colorScheme.primary), ), @@ -4159,7 +4162,8 @@ class _TrackMetadataScreenState extends ConsumerState { maxSampleRate: selectedMaxSampleRate, ), originalLabel: labels.original, - originalQualityLabel: labels.originalQuality, + originalQualityLabel: + labels.originalQuality, ), ) : context.l10n.trackConvertActionLabelLossy( @@ -4701,6 +4705,7 @@ class _TrackMetadataScreenState extends ConsumerState { }) async { if (_isConverting) return; setState(() => _isConverting = true); + final losslessLabels = context.l10n.losslessConversionLabels; try { ScaffoldMessenger.of(context).showSnackBar( @@ -4819,7 +4824,7 @@ class _TrackMetadataScreenState extends ConsumerState { final newQuality = convertedAudioQualityLabel( targetFormat: targetFormat, bitrate: bitrate, - labels: context.l10n.losslessConversionLabels, + labels: losslessLabels, losslessQuality: losslessQuality, actualBitDepth: convertedBitDepth, actualSampleRate: convertedSampleRate,