fix(mobile): stabilize router and add loading timeout/retry on playlists screen

This commit is contained in:
Michael committed 2026-03-09 17:35:09 +01:00
1 parent 180b57e1b7
commit e4f8ebcf8f
2 files changed
+26 -4

No files matched your search

+5 -3
View File
@@ -13,12 +13,11 @@ import '../widgets/themed_loading_screen.dart';
import '../../features/iptv/providers/xtream_provider.dart'; import '../../features/iptv/providers/xtream_provider.dart';
final routerProvider = Provider<GoRouter>((ref) { final routerProvider = Provider<GoRouter>((ref) {
final authState = ref.watch(authProvider);
return GoRouter( return GoRouter(
initialLocation: '/login', initialLocation: '/login',
refreshListenable: RouterRefreshNotifier(ref), refreshListenable: RouterRefreshNotifier(ref),
redirect: (context, state) { redirect: (context, state) {
final authState = ref.read(authProvider);
final isLoggedIn = authState.isAuthenticated; final isLoggedIn = authState.isAuthenticated;
final isLoginRoute = state.matchedLocation == '/login'; final isLoginRoute = state.matchedLocation == '/login';
@@ -97,12 +96,15 @@ final routerProvider = Provider<GoRouter>((ref) {
); );
}); });
/// Notifier that triggers router refresh when auth state changes /// Notifier that triggers router refresh when auth state or selected playlist changes
class RouterRefreshNotifier extends ChangeNotifier { class RouterRefreshNotifier extends ChangeNotifier {
RouterRefreshNotifier(this._ref) { RouterRefreshNotifier(this._ref) {
_ref.listen(authProvider, (_, __) { _ref.listen(authProvider, (_, __) {
notifyListeners(); notifyListeners();
}); });
_ref.listen(selectedPlaylistProvider, (_, __) {
notifyListeners();
});
} }
final Ref _ref; final Ref _ref;
@@ -40,7 +40,27 @@ class MobilePlaylistSelectionScreen extends ConsumerWidget {
], ],
), ),
body: playlistsAsync.when( body: playlistsAsync.when(
loading: () => const Center(child: CircularProgressIndicator()), loading: () => Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const CircularProgressIndicator(),
const SizedBox(height: 24),
FutureBuilder(
future: Future.delayed(const Duration(seconds: 5)),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return TextButton(
onPressed: () => ref.refresh(playlistsProvider),
child: const Text('Still loading? Tap to retry'),
);
}
return const SizedBox.shrink();
},
),
],
),
),
error: (error, stack) => Center( error: (error, stack) => Center(
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,