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)
This commit is contained in:
Mikkeli Matlock
2026-02-10 22:15:31 +09:00
parent 3c5ce89ded
commit 9867fe8c46
+34 -8
View File
@@ -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<SharedPreferences>.value(value: prefs),
ChangeNotifierProvider(
create: (context) => SettingsProvider(context.read<SharedPreferences>()),
),
ChangeNotifierProvider(
create: (_) => GpsDataManager(),
),
ChangeNotifierProxyProvider2<GpsDataManager, SettingsProvider, OverlayProvider>(
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(),
);
}
}