From 9867fe8c46c3f251095d161c0a069e0ab50a0f1c Mon Sep 17 00:00:00 2001 From: Mikkeli Matlock Date: Tue, 10 Feb 2026 22:15:31 +0900 Subject: [PATCH] feat(02-02): wire MultiProvider with pre-initialized SharedPreferences - Make main() async with WidgetsFlutterBinding.ensureInitialized() - Pre-initialize SharedPreferences before runApp() to eliminate flash of defaults - Wire MultiProvider with 4 providers in dependency order: 1. Provider.value(SharedPreferences) - pre-initialized dependency 2. ChangeNotifierProvider(SettingsProvider) - theme + unit state 3. ChangeNotifierProvider(GpsDataManager) - GPS data stream 4. ChangeNotifierProxyProvider2(OverlayProvider) - depends on GPS + Settings - Remove isOverlayMode parameter from SpeedoApp (unused, overlay runs in separate isolate) - Keep overlayMain() unchanged (separate isolate entry point) --- lib/main.dart | 44 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index d482d32..af15133 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,14 +1,42 @@ import 'package:flutter/material.dart'; -import 'package:flutter/foundation.dart'; // For kDebugMode +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'screens/speedometer_screen.dart'; import 'screens/overlay_screen.dart'; +import 'services/gps_data_manager.dart'; +import 'providers/settings_provider.dart'; +import 'providers/overlay_provider.dart'; import 'services/logger.dart'; -void main() { - runApp(const SpeedoApp()); +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + final prefs = await SharedPreferences.getInstance(); + + runApp( + MultiProvider( + providers: [ + Provider.value(value: prefs), + ChangeNotifierProvider( + create: (context) => SettingsProvider(context.read()), + ), + ChangeNotifierProvider( + create: (_) => GpsDataManager(), + ), + ChangeNotifierProxyProvider2( + create: (_) => OverlayProvider(), + update: (_, gpsManager, settings, overlay) => overlay! + ..updateDependencies( + gpsManager: gpsManager, + currentUnit: settings.currentUnit, + currentThemeIndex: settings.currentThemeIndex, + ), + ), + ], + child: const SpeedoApp(), + ), + ); } -// Entry point for overlay window @pragma("vm:entry-point") void overlayMain() { Logger.info('overlayMain() called', 'Overlay'); @@ -19,9 +47,7 @@ void overlayMain() { } class SpeedoApp extends StatelessWidget { - final bool isOverlayMode; - - const SpeedoApp({super.key, this.isOverlayMode = false}); + const SpeedoApp({super.key}); @override Widget build(BuildContext context) { @@ -33,7 +59,7 @@ class SpeedoApp extends StatelessWidget { brightness: Brightness.dark, colorSchemeSeed: Colors.green, ), - home: SpeedometerScreen(isOverlayMode: isOverlayMode), + home: const SpeedometerScreen(), ); } -} \ No newline at end of file +}