okane/lib/main.dart

108 lines
3.0 KiB
Dart

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/budgets/budget_details.dart';
import 'package:okane/ui/pages/transaction_details.dart';
import 'package:okane/ui/state/core.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
GetIt.I.registerSingleton<CoreCubit>(CoreCubit());
GetIt.I.registerSingleton<Isar>(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<CoreCubit>(create: (_) => GetIt.I.get<CoreCubit>()),
],
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,
"/budgets/details" => BudgetDetailsPage.mobileRoute,
_ => MaterialPageRoute<void>(builder: (_) => Text("Unknown!!")),
},
),
),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final Completer<int> _initCompleter = Completer();
@override
void initState() {
super.initState();
asyncInit();
}
Future<void> asyncInit() async {
print("Starting async init");
await GetIt.I.get<CoreCubit>().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(),
},
);
},
);
}
}