Multi-IPTV : changer d'IPTV depuis le rail reste sur le tableau de bord

La route /dashboard faisait ref.watch(selectedPlaylistProvider) avec le
ref du routerProvider : le GoRouter entier dépendait de la playlist. Un
choix dans le sélecteur du rail recréait le routeur, reparti de /login
puis redirigé vers /playlists.

Un Consumer limite la reconstruction à la route, et une clé par IPTV
réinitialise les onglets, qui ne chargent leur catalogue qu'en initState.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-19 18:16:35 +02:00
1 parent ccd983d968
commit a6322b57b8
1 file changed
+27 -14
+27 -14
View File
@@ -72,21 +72,34 @@ final routerProvider = Provider<GoRouter>((ref) {
), ),
GoRoute( GoRoute(
path: '/dashboard', path: '/dashboard',
builder: (context, state) { // Le `ref` du routeur ne doit pas surveiller la playlist : un
final playlist = ref.watch(selectedPlaylistProvider); // `ref.watch` ici rend `routerProvider` dépendant de
if (playlist == null) { // `selectedPlaylistProvider`, si bien que changer d'IPTV depuis le
return const Scaffold( // tableau de bord recréait le GoRouter, reparti de `/login` puis
body: ThemedLoading(), // redirigé vers `/playlists`. Le `Consumer` limite la reconstruction
); // à cette seule route.
} builder: (context, state) => Consumer(
builder: (context, ref, _) {
final playlist = ref.watch(selectedPlaylistProvider);
if (playlist == null) {
return const Scaffold(
body: ThemedLoading(),
);
}
// Adaptive layout without forcing a router rebuild on every pixel change // Une clé par IPTV : les onglets chargent leur catalogue dans
final isMobile = MediaQuery.sizeOf(context).width < 768; // `initState` et ignorent un changement de `playlist`. Sans elle,
if (isMobile) { // le tableau de bord garderait le contenu de l'IPTV précédente.
return MobileDashboardScreen(playlist: playlist); final key = ValueKey(playlist.id);
}
return DashboardScreen(playlist: playlist); // Adaptive layout without forcing a router rebuild on every pixel change
}, final isMobile = MediaQuery.sizeOf(context).width < 768;
if (isMobile) {
return MobileDashboardScreen(key: key, playlist: playlist);
}
return DashboardScreen(key: key, playlist: playlist);
},
),
), ),
GoRoute( GoRoute(
path: '/admin', path: '/admin',