import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'screens/scan_screen.dart'; import 'services/ble_client.dart'; import 'services/protocol_log.dart'; import 'settings.dart'; import 'theme.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); await Future.wait([ProtocolLog.instance.init(), AppSettings.instance.load()]); SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( statusBarColor: Colors.transparent, statusBarIconBrightness: Brightness.light, systemNavigationBarColor: OsColors.background, )); runApp(const OpenScooterApp()); } /// Single BLE client for the whole app (one active connection at a time). final _ble = FlutterBleClient(); /// Logs route changes into the protocol log for field debugging. class _RouteLogger extends NavigatorObserver { @override void didPush(Route route, Route? previous) => ProtocolLog.instance.log('NAV', 'push ${route.settings.name ?? route.runtimeType}'); @override void didPop(Route route, Route? previous) => ProtocolLog.instance.log('NAV', 'pop ${route.settings.name ?? route.runtimeType}'); @override void didRemove(Route route, Route? previous) => ProtocolLog.instance.log('NAV', 'remove ${route.settings.name ?? route.runtimeType}'); } class OpenScooterApp extends StatelessWidget { const OpenScooterApp({super.key}); @override Widget build(BuildContext context) { final settings = AppSettings.instance; return ListenableBuilder( listenable: settings, builder: (context, _) => MaterialApp( title: 'OpenMotion', debugShowCheckedModeBanner: false, theme: buildOsTheme(settings.accent.color), navigatorObservers: [_RouteLogger()], home: ScanScreen(ble: _ble), ), ); } }