diff --git a/.gitignore b/.gitignore index 6b5629d..7f97c5a 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,4 @@ app.*.map.json lib/l10n/gen/ .superpowers/ CLAUDE.md +*.pid diff --git a/lib/state/providers.dart b/lib/state/providers.dart index cabff7f..34d1f52 100644 --- a/lib/state/providers.dart +++ b/lib/state/providers.dart @@ -41,9 +41,13 @@ final seasonFlowProvider = NotifierProvider( final contentRepositoryProvider = Provider((ref) => ContentRepository()); -final seasonsProvider = FutureProvider>( - (ref) => ref.read(contentRepositoryProvider).availableSeasons(), -); +final seasonsProvider = FutureProvider>((ref) { + // Watching (not awaiting) the one-shot sync makes this provider re-run + // once when the sync completes, picking up freshly cached packs. Local + // content loads immediately; the network never blocks this future. + ref.watch(seasonRefreshProvider); + return ref.read(contentRepositoryProvider).availableSeasons(); +}); /// One background content sync per app session. Home listens and refreshes /// the season list when new packs arrived. diff --git a/lib/ui/screens/home_screen.dart b/lib/ui/screens/home_screen.dart index 464ea9e..aa85a2d 100644 --- a/lib/ui/screens/home_screen.dart +++ b/lib/ui/screens/home_screen.dart @@ -21,11 +21,6 @@ class HomeScreen extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - ref.listen(seasonRefreshProvider, (_, next) { - if (next is AsyncData && next.value == true) { - ref.invalidate(seasonsProvider); - } - }); final l10n = AppLocalizations.of(context)!; final streak = ref.watch(streakProvider); final best = ref.watch(endlessBestProvider);