import 'package:intl/date_symbol_data_local.dart'; import 'dart:developer'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:path_provider/path_provider.dart'; import 'package:timetracker/screens/main_screen.dart'; import 'package:timetracker/src/rust/api.dart'; import 'package:timetracker/src/rust/frb_generated.dart'; import 'package:timetracker/time_tracking_service.dart'; import 'package:provider/provider.dart'; Future main() async { log("main: Start"); try { WidgetsFlutterBinding.ensureInitialized(); await initializeDateFormatting('de_DE', null); try { await RustLib.init(); } catch (e) { runApp(ErrorApp(error: "RustLib Init Failed: $e")); } try { final dbDir = await getApplicationDocumentsDirectory(); await Directory(dbDir.path).create(recursive: true); await initApp(dbDirectoryPath: dbDir.path); } catch (e) { runApp(ErrorApp(error: "Database Init Failed: $e")); return; } runApp( ChangeNotifierProvider( create: (context) => TimeTrackingService(), child: const MyApp(), ), ); } catch (e) { runApp(ErrorApp(error: "Unhandled error in main: $e")); } } class ErrorApp extends StatelessWidget { final String error; const ErrorApp({required this.error, Key? key}) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text("Initialization Error")), body: Center( child: Padding( padding: const EdgeInsets.all(16.0), child: Text("Could not initialize the application:\n\n$error"), ), ), ), ); } } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Rust Time Tracker', supportedLocales: const [Locale('de', 'DE'), Locale('en', '')], localizationsDelegates: const [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], theme: ThemeData(primarySwatch: Colors.blue, useMaterial3: true), home: const InitializerWidget(), ); } } class InitializerWidget extends StatelessWidget { const InitializerWidget({super.key}); @override Widget build(BuildContext context) { final initStatus = context.select( (TimeTrackingService s) => s.isInitialized, ); final isLoading = context.select((TimeTrackingService s) => s.isLoading); if (isLoading) { return const Scaffold(body: Center(child: CircularProgressIndicator())); } else if (!initStatus) { return const Scaffold( body: Center( child: Text("Fehler bei der Initialisierung der Datenbank."), ), ); } else { return const MainScreen(); } } }