import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'cache/metadata_prefetcher.dart'; import 'cache/prefetcher.dart'; import 'cache/sync_controller.dart'; import 'shared/routing.dart'; import 'theme/theme_data.dart'; import 'theme/theme_mode_provider.dart'; class MinstrelApp extends ConsumerStatefulWidget { const MinstrelApp({super.key}); @override ConsumerState createState() => _MinstrelAppState(); } class _MinstrelAppState extends ConsumerState { @override void initState() { super.initState(); // Activate offline-mode infrastructure once the first frame ships. // SyncController.sync() is connectivity-aware (no-ops on no auth / // no server URL), so calling it unconditionally is safe. // Reading prefetcherProvider runs its constructor, which wires the // queue + settings listeners. WidgetsBinding.instance.addPostFrameCallback((_) { // ignore: unawaited_futures ref.read(syncControllerProvider.notifier).sync(); ref.read(prefetcherProvider); // Metadata prefetcher: when /api/home returns, fire background // albumProvider/artistProvider reads for the top-N items in // each section so subsequent taps are drift hits, not network // round trips. ref.read(metadataPrefetcherProvider); }); } @override Widget build(BuildContext context) { final router = ref.watch(routerProvider); final mode = ref.watch(themeModeProvider).value ?? AppThemeMode.system; return MaterialApp.router( title: 'Minstrel', theme: buildLightTheme(), darkTheme: buildDarkTheme(), themeMode: mode.materialMode, routerConfig: router, ); } }