import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:get_it/get_it.dart'; import 'package:isar/isar.dart'; import 'package:okane/database/database.dart'; import 'package:okane/i18n/strings.g.dart'; import 'package:okane/screen.dart'; import 'package:okane/ui/navigation.dart'; import 'package:okane/ui/pages/budgets/budget_details.dart'; import 'package:okane/ui/pages/transaction_details.dart'; import 'package:okane/ui/state/core.dart'; import 'package:okane/ui/state/settings.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); LocaleSettings.useDeviceLocale(); final settings = SettingsCubit(); await settings.loadSettings(); GetIt.I.registerSingleton(settings); GetIt.I.registerSingleton(CoreCubit()); GetIt.I.registerSingleton(await openDatabase()); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); // This widget is the root of your application. @override Widget build(BuildContext context) { return SafeArea( child: MultiBlocProvider( providers: [ BlocProvider(create: (_) => GetIt.I.get()), BlocProvider( create: (_) => GetIt.I.get(), ), ], child: BlocBuilder( builder: (context, state) => MaterialApp( title: 'Okane', theme: ThemeData( colorSchemeSeed: Colors.deepPurple, brightness: switch (state.settings.colorScheme) { ColorSchemeSettings.dark => Brightness.dark, ColorSchemeSettings.light => Brightness.light, ColorSchemeSettings.system => View.of(context).platformDispatcher.platformBrightness, }, pageTransitionsTheme: PageTransitionsTheme( builders: Map.fromIterable( TargetPlatform.values, value: (_) => const FadeForwardsPageTransitionsBuilder(), ), ), ), home: const MyHomePage(), onGenerateRoute: (settings) => switch (settings.name) { "/transactions/details" => TransactionDetailsPage.mobileRoute, "/budgets/details" => BudgetDetailsPage.mobileRoute, _ => MaterialPageRoute( builder: (_) => Text("Unknown!!"), ), }, ), ), ), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key}); @override State createState() => _MyHomePageState(); } class _MyHomePageState extends State { final Completer _initCompleter = Completer(); @override void initState() { super.initState(); asyncInit(); } Future asyncInit() async { print("Starting async init"); await GetIt.I.get().init(); _initCompleter.complete(1); print("Async init done"); } @override Widget build(BuildContext context) { final screenSize = getScreenSize(context); if (screenSize == ScreenSize.normal) { SchedulerBinding.instance.addPostFrameCallback((_) { Navigator.of(context).popUntil((route) => route.isFirst); }); } return FutureBuilder( future: _initCompleter.future, builder: (context, snapshot) { if (!snapshot.hasData) { return Center(child: CircularProgressIndicator()); } return Scaffold( drawer: OkaneNavigationDrawer(), body: switch (screenSize) { ScreenSize.normal => const Row( children: [ OkaneNavigationRail(), VerticalDivider(thickness: 1, width: 1), Expanded(child: OkaneNavigationLayout()), ], ), ScreenSize.small => const OkaneNavigationLayout(), }, ); }, ); } }