Files
gps-speedo/lib/main.dart
T
Mikkeli Matlock 9867fe8c46 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)
2026-02-10 22:15:31 +09:00

66 lines
1.8 KiB
Dart

import 'package:flutter/material.dart';
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() 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(),
),
);
}
@pragma("vm:entry-point")
void overlayMain() {
Logger.info('overlayMain() called', 'Overlay');
runApp(const MaterialApp(
debugShowCheckedModeBanner: false,
home: OverlaySpeedometer(),
));
}
class SpeedoApp extends StatelessWidget {
const SpeedoApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Speedo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
useMaterial3: true,
brightness: Brightness.dark,
colorSchemeSeed: Colors.green,
),
home: const SpeedometerScreen(),
);
}
}