99 lines
2.6 KiB
Dart
99 lines
2.6 KiB
Dart
import 'package:intl/date_symbol_data_local.dart';
|
|
import 'dart:developer';
|
|
import 'dart:io';
|
|
|
|
import 'package:flutter/material.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<void> 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',
|
|
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();
|
|
}
|
|
}
|
|
}
|