1+ import 'package:flutter/foundation.dart' ;
12import 'package:flutter_riverpod/flutter_riverpod.dart' ;
23import 'package:go_router/go_router.dart' ;
34import 'package:riverpod_annotation/riverpod_annotation.dart' ;
@@ -12,13 +13,38 @@ import 'app_shell.dart';
1213
1314part '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 )
1639GoRouter 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 },
0 commit comments