93 lines
2.4 KiB
Dart
93 lines
2.4 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
|
import 'package:flutter_native_splash/flutter_native_splash.dart';
|
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
import 'package:moneymgr_mobile/providers/settings.dart';
|
|
import 'package:moneymgr_mobile/services/storage/prefs.dart';
|
|
import 'package:moneymgr_mobile/utils/provider_observer.dart';
|
|
import 'package:moneymgr_mobile/utils/theme_utils.dart';
|
|
|
|
// Inspired from https://github.com/dhafinrayhan/dummymart
|
|
|
|
Future<void> main() async {
|
|
WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();
|
|
|
|
// We preserve the native splash screen, which will then removed once the main
|
|
// app is inserted to the widget tree.
|
|
FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
|
|
|
|
runApp(ProviderScope(
|
|
observers: [AppProviderObserver()],
|
|
child: const MoneyMgrApp(),
|
|
));
|
|
}
|
|
|
|
class MoneyMgrApp extends StatelessWidget {
|
|
const MoneyMgrApp({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return const _EagerInitialization(
|
|
child: _MainApp(),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _EagerInitialization extends ConsumerWidget {
|
|
const _EagerInitialization({required this.child});
|
|
final Widget child;
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final values = [
|
|
ref.watch(prefsProvider),
|
|
];
|
|
|
|
if (values.every((value) => value.hasValue)) {
|
|
return child;
|
|
}
|
|
|
|
return const SizedBox();
|
|
}
|
|
}
|
|
|
|
class _MainApp extends StatefulHookConsumerWidget {
|
|
const _MainApp();
|
|
|
|
@override
|
|
ConsumerState<_MainApp> createState() => _MainAppState();
|
|
}
|
|
|
|
|
|
class _MainAppState extends ConsumerState<_MainApp> {
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
FlutterNativeSplash.remove();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final router = ref.watch(routerProvider);
|
|
final themeMode = ref.watch(currentThemeModeProvider);
|
|
|
|
final (lightTheme, darkTheme) = useMemoized(() => createDualThemeData(
|
|
seedColor: Colors.blue,
|
|
useMaterial3: true,
|
|
transformer: (data) => data.copyWith(
|
|
inputDecorationTheme: const InputDecorationTheme(
|
|
border: OutlineInputBorder(),
|
|
),
|
|
),
|
|
));
|
|
|
|
return MaterialApp.router(
|
|
title: 'MoneyMgr',
|
|
themeMode: themeMode,
|
|
theme: lightTheme,
|
|
darkTheme: darkTheme,
|
|
routerConfig: router,
|
|
debugShowCheckedModeBanner: false,
|
|
);
|
|
}
|
|
} |