import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'connector/meshcore_connector.dart'; import 'screens/scanner_screen.dart'; import 'services/storage_service.dart'; import 'services/message_retry_service.dart'; import 'services/path_history_service.dart'; import 'services/app_settings_service.dart'; import 'services/notification_service.dart'; import 'services/ble_debug_log_service.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); // Initialize services final storage = StorageService(); final connector = MeshCoreConnector(); final pathHistoryService = PathHistoryService(storage); final retryService = MessageRetryService(storage); final appSettingsService = AppSettingsService(); final bleDebugLogService = BleDebugLogService(); // Load settings await appSettingsService.loadSettings(); // Initialize notification service final notificationService = NotificationService(); await notificationService.initialize(); // Wire up connector with services connector.initialize( retryService: retryService, pathHistoryService: pathHistoryService, appSettingsService: appSettingsService, bleDebugLogService: bleDebugLogService, ); await connector.loadContactCache(); await connector.loadChannelSettings(); // Load persisted channel messages await connector.loadAllChannelMessages(); await connector.loadUnreadState(); runApp(MeshCoreApp( connector: connector, retryService: retryService, pathHistoryService: pathHistoryService, storage: storage, appSettingsService: appSettingsService, bleDebugLogService: bleDebugLogService, )); } class MeshCoreApp extends StatelessWidget { final MeshCoreConnector connector; final MessageRetryService retryService; final PathHistoryService pathHistoryService; final StorageService storage; final AppSettingsService appSettingsService; final BleDebugLogService bleDebugLogService; const MeshCoreApp({ super.key, required this.connector, required this.retryService, required this.pathHistoryService, required this.storage, required this.appSettingsService, required this.bleDebugLogService, }); @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider.value(value: connector), ChangeNotifierProvider.value(value: retryService), ChangeNotifierProvider.value(value: pathHistoryService), ChangeNotifierProvider.value(value: appSettingsService), ChangeNotifierProvider.value(value: bleDebugLogService), Provider.value(value: storage), ], child: Consumer( builder: (context, settingsService, child) { return MaterialApp( title: 'MeshCore Open', debugShowCheckedModeBanner: false, theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue), useMaterial3: true, ), darkTheme: ThemeData( colorScheme: ColorScheme.fromSeed( seedColor: Colors.blue, brightness: Brightness.dark, ), useMaterial3: true, ), themeMode: _themeModeFromSetting(settingsService.settings.themeMode), home: const ScannerScreen(), ); }, ), ); } ThemeMode _themeModeFromSetting(String value) { switch (value) { case 'light': return ThemeMode.light; case 'dark': return ThemeMode.dark; default: return ThemeMode.system; } } }