From a6322b57b81231a1db8c3bb2dce781e78348af31 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 19 Oct 2026 18:16:35 +0200 Subject: [PATCH] Multi-IPTV : changer d'IPTV depuis le rail reste sur le tableau de bord MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- lib/core/router/app_router.dart | 41 ++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/lib/core/router/app_router.dart b/lib/core/router/app_router.dart index ae2268e..ba00cd6 100644 --- a/lib/core/router/app_router.dart +++ b/lib/core/router/app_router.dart @@ -72,21 +72,34 @@ final routerProvider = Provider((ref) { ), GoRoute( path: '/dashboard', - builder: (context, state) { - final playlist = ref.watch(selectedPlaylistProvider); - if (playlist == null) { - return const Scaffold( - body: ThemedLoading(), - ); - } + // Le `ref` du routeur ne doit pas surveiller la playlist : un + // `ref.watch` ici rend `routerProvider` dépendant de + // `selectedPlaylistProvider`, si bien que changer d'IPTV depuis le + // tableau de bord recréait le GoRouter, reparti de `/login` puis + // 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 - final isMobile = MediaQuery.sizeOf(context).width < 768; - if (isMobile) { - return MobileDashboardScreen(playlist: playlist); - } - return DashboardScreen(playlist: playlist); - }, + // Une clé par IPTV : les onglets chargent leur catalogue dans + // `initState` et ignorent un changement de `playlist`. Sans elle, + // le tableau de bord garderait le contenu de l'IPTV précédente. + final key = ValueKey(playlist.id); + + // 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( path: '/admin',