Skip to content

Commit 6a24db0

Browse files
committed
fix: Automatically exit Settings screen on save.
1 parent 60d55f3 commit 6a24db0

5 files changed

Lines changed: 54 additions & 9 deletions

File tree

lib/core/router/app_router.dart

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:flutter/foundation.dart';
12
import 'package:flutter_riverpod/flutter_riverpod.dart';
23
import 'package:go_router/go_router.dart';
34
import 'package:riverpod_annotation/riverpod_annotation.dart';
@@ -12,13 +13,38 @@ import 'app_shell.dart';
1213

1314
part 'app_router.g.dart';
1415

16+
/// A [ChangeNotifier] that fires whenever [settingsNotifierProvider] changes.
17+
/// Used as [GoRouter.refreshListenable] so the router re-runs redirect logic
18+
/// without being recreated (which would destroy the navigation stack).
19+
class _SettingsListenable extends ChangeNotifier {
20+
final ProviderSubscription<AsyncValue<AppSettings>> _sub;
21+
22+
_SettingsListenable(Ref ref)
23+
: _sub = ref.listen(
24+
settingsNotifierProvider,
25+
(prev, next) {},
26+
fireImmediately: false,
27+
) {
28+
ref.listen(settingsNotifierProvider, (prev, next) => notifyListeners());
29+
}
30+
31+
@override
32+
void dispose() {
33+
_sub.close();
34+
super.dispose();
35+
}
36+
}
37+
1538
@Riverpod(keepAlive: true)
1639
GoRouter appRouter(Ref ref) {
17-
final settingsAsync = ref.watch(settingsNotifierProvider);
40+
final listenable = _SettingsListenable(ref);
41+
ref.onDispose(listenable.dispose);
1842

1943
return GoRouter(
2044
initialLocation: '/queue',
45+
refreshListenable: listenable,
2146
redirect: (context, state) {
47+
final settingsAsync = ref.read(settingsNotifierProvider);
2248
final configured = settingsAsync.when(
2349
data: (s) => s.isConfigured,
2450
loading: () => true, // don't redirect while loading
@@ -27,8 +53,10 @@ GoRouter appRouter(Ref ref) {
2753

2854
final onSettings = state.matchedLocation.startsWith('/settings');
2955
if (!configured && !onSettings) return '/settings';
30-
if (configured && onSettings && state.matchedLocation == '/settings' && !settingsAsync.isLoading) {
31-
return null; // let user edit settings
56+
if (configured && onSettings &&
57+
state.matchedLocation == '/settings' &&
58+
!settingsAsync.isLoading) {
59+
return '/queue';
3260
}
3361
return null;
3462
},

lib/features/queue/queue_screen.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,22 @@ class QueueScreen extends ConsumerStatefulWidget {
2121
class _QueueScreenState extends ConsumerState<QueueScreen> {
2222
String _searchQuery = '';
2323
String? _selectedTag;
24+
bool _initialFilterApplied = false;
25+
26+
@override
27+
void didChangeDependencies() {
28+
super.didChangeDependencies();
29+
if (!_initialFilterApplied) {
30+
_initialFilterApplied = true;
31+
final routeTag =
32+
GoRouterState.of(context).uri.queryParameters['tag'];
33+
if (routeTag != null) {
34+
_selectedTag = routeTag;
35+
WidgetsBinding.instance
36+
.addPostFrameCallback((_) => _applyFilter());
37+
}
38+
}
39+
}
2440

2541
void _applyFilter() {
2642
ref.read(queueNotifierProvider.notifier).applyFilter(

lib/features/tags/tags_screen.dart

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,9 @@ class TagsScreen extends ConsumerWidget {
7272
return ListTile(
7373
leading: const Icon(Icons.label_outline),
7474
title: Text(tag.name),
75-
onTap: () {
76-
// Navigate to queue filtered by this tag
77-
context.go('/queue');
78-
// The filter is applied via QueueScreen's filter bar
79-
// For now, navigate to queue with tag query param
80-
},
75+
onTap: () => context.go(
76+
'/queue?tag=${Uri.encodeComponent(tag.name)}',
77+
),
8178
);
8279
},
8380
);

macos/Runner/DebugProfile.entitlements

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,7 @@
88
<true/>
99
<key>com.apple.security.network.server</key>
1010
<true/>
11+
<key>com.apple.security.network.client</key>
12+
<true/>
1113
</dict>
1214
</plist>

macos/Runner/Release.entitlements

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@
44
<dict>
55
<key>com.apple.security.app-sandbox</key>
66
<true/>
7+
<key>com.apple.security.network.client</key>
8+
<true/>
79
</dict>
810
</plist>

0 commit comments

Comments
 (0)