import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'core/logging/app_log.dart'; import 'core/providers/theme_provider.dart'; import 'ui/theme/app_theme.dart'; import 'ui/screens/bt_picker/bt_picker_screen.dart'; void main() { runZonedGuarded(() { WidgetsFlutterBinding.ensureInitialized(); // Catch every Dart-side error, log it (copyable from the Debug screen) // and keep the app running instead of showing a red/grey error screen. FlutterError.onError = (FlutterErrorDetails details) { AppLog.e('Flutter error', details.exception, details.stack); }; WidgetsBinding.instance.platformDispatcher.onError = (error, stack) { AppLog.e('Uncaught platform error', error, stack); return true; }; // Release only: keep Flutter's red error screen in debug builds so // layout/build errors stay visible during development. if (kReleaseMode) { ErrorWidget.builder = (FlutterErrorDetails details) => const Center( child: Padding( padding: EdgeInsets.all(16), child: Text( 'Something went wrong on this screen.\n' 'Open Debug → Copy log and send it to support.', textAlign: TextAlign.center, style: TextStyle(color: Colors.grey), ), ), ); } AppLog.i('App start'); runApp(const ProviderScope(child: HvbtApp())); }, (error, stack) { AppLog.e('Uncaught zone error', error, stack); }); } class HvbtApp extends ConsumerWidget { const HvbtApp({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final themeVariant = ref.watch(themeProvider); return MaterialApp( title: 'HV BT Dashboard', debugShowCheckedModeBanner: false, theme: AppTheme.build(themeVariant), home: const BtPickerScreen(), ); } }