import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'providers/device_provider.dart'; import 'providers/debug_provider.dart'; import 'providers/ble_provider.dart'; import 'providers/player_provider.dart'; import 'providers/wifi_provider.dart'; import 'screens/app_shell.dart'; import 'screens/ble_provision_screen.dart'; import 'screens/debug_screen.dart'; import 'screens/home_screen.dart'; import 'screens/network_screen.dart'; import 'screens/playback_screen.dart'; import 'screens/settings_screen.dart'; import 'screens/trigger_screen.dart'; import 'services/device_storage_service.dart'; import 'services/http_api_service.dart'; import 'services/web_socket_service.dart'; import 'theme/app_theme.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); final deviceStorageService = DeviceStorageService(); final lastDevice = await deviceStorageService.getLastDevice(); final initialDeviceIp = lastDevice?.ip ?? '127.0.0.1'; final initialDevicePort = lastDevice?.port ?? 5000; final httpApiService = HttpApiService( baseUrl: 'http://$initialDeviceIp:$initialDevicePort', ); final webSocketService = WebSocketService(); runApp( MultiProvider( providers: [ Provider.value(value: webSocketService), ChangeNotifierProvider( create: (_) => DebugProvider(webSocketService: webSocketService), ), ChangeNotifierProvider( create: (context) => DeviceProvider( httpApiService: httpApiService, webSocketService: webSocketService, deviceStorageService: deviceStorageService, debugProvider: context.read(), initialDeviceIp: initialDeviceIp, initialDevicePort: initialDevicePort, initialDeviceName: lastDevice?.name, )..initialize(), ), ChangeNotifierProvider( create: (context) => BleProvider( debugProvider: context.read(), ), ), ChangeNotifierProvider( create: (context) => PlayerProvider( httpApiService: httpApiService, webSocketService: webSocketService, debugProvider: context.read(), )..bootstrap(), ), ChangeNotifierProvider( create: (context) => WifiProvider( httpApiService: httpApiService, webSocketService: webSocketService, debugProvider: context.read(), )..bootstrap(), ), ], child: const ShowenApp(), ), ); } final GoRouter _router = GoRouter( initialLocation: '/', routes: [ StatefulShellRoute.indexedStack( builder: (context, state, navigationShell) => AppShell(navigationShell: navigationShell), branches: [ StatefulShellBranch( routes: [ GoRoute( path: '/', name: 'home', builder: (context, state) => const HomeScreen(), ), ], ), StatefulShellBranch( routes: [ GoRoute( path: '/playback', name: 'playback', builder: (context, state) => const PlaybackScreen(), ), ], ), StatefulShellBranch( routes: [ GoRoute( path: '/trigger', name: 'trigger', builder: (context, state) => const TriggerScreen(), ), ], ), StatefulShellBranch( routes: [ GoRoute( path: '/network', name: 'network', builder: (context, state) => const NetworkScreen(), routes: [ GoRoute( path: 'ble-provision', name: 'ble-provision', builder: (context, state) => const BleProvisionScreen(), ), ], ), ], ), StatefulShellBranch( routes: [ GoRoute( path: '/settings', name: 'settings', builder: (context, state) => const SettingsScreen(), ), ], ), StatefulShellBranch( routes: [ GoRoute( path: '/debug', name: 'debug', builder: (context, state) => const DebugScreen(), ), ], ), ], ), ], ); class ShowenApp extends StatelessWidget { const ShowenApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp.router( title: 'ShowenV2', debugShowCheckedModeBanner: false, themeMode: ThemeMode.dark, darkTheme: AppTheme.dark(), theme: AppTheme.dark(), routerConfig: _router, ); } }