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/screen.dart'; import 'package:okane/ui/navigation.dart'; import 'package:okane/ui/pages/transaction_details.dart'; import 'package:okane/ui/state/core.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); 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 MultiBlocProvider( providers: [ BlocProvider(create: (_) => GetIt.I.get()), ], child: MaterialApp( title: 'Flutter Demo', theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), ), home: const MyHomePage(), onGenerateRoute: (settings) => switch (settings.name) { "/transactions/details" => TransactionDetailsPage.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) { print("${snapshot.hasData}"); if (!snapshot.hasData) { return Center(child: CircularProgressIndicator()); } return Scaffold( bottomNavigationBar: switch (screenSize) { ScreenSize.normal => null, ScreenSize.small => OkaneNavigationBar(), }, body: switch (screenSize) { ScreenSize.normal => const Row( children: [ OkaneNavigationRail(), VerticalDivider(thickness: 1, width: 1), Expanded(child: OkaneNavigationLayout()), ], ), ScreenSize.small => const OkaneNavigationLayout(), }, ); }, ); } }