Add base skeleton

This commit is contained in:
2025-07-01 20:40:00 +02:00
parent ab8974c0a8
commit 29fec99b8f
19 changed files with 722 additions and 24 deletions

View File

@ -3,7 +3,9 @@ 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/router/router.dart';
import 'package:moneymgr_mobile/services/storage/prefs.dart';
import 'package:moneymgr_mobile/services/storage/secure_storage.dart';
import 'package:moneymgr_mobile/utils/provider_observer.dart';
import 'package:moneymgr_mobile/utils/theme_utils.dart';
@ -16,10 +18,12 @@ Future<void> main() async {
// app is inserted to the widget tree.
FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
runApp(ProviderScope(
observers: [AppProviderObserver()],
child: const MoneyMgrApp(),
));
runApp(
ProviderScope(
observers: [AppProviderObserver()],
child: const MoneyMgrApp(),
),
);
}
class MoneyMgrApp extends StatelessWidget {
@ -27,21 +31,18 @@ class MoneyMgrApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return const _EagerInitialization(
child: _MainApp(),
);
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),
];
final values = [ref.watch(prefsProvider), ref.watch(secureStorageProvider)];
if (values.every((value) => value.hasValue)) {
return child;
@ -58,7 +59,6 @@ class _MainApp extends StatefulHookConsumerWidget {
ConsumerState<_MainApp> createState() => _MainAppState();
}
class _MainAppState extends ConsumerState<_MainApp> {
@override
void initState() {
@ -71,15 +71,17 @@ class _MainAppState extends ConsumerState<_MainApp> {
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(),
final (lightTheme, darkTheme) = useMemoized(
() => createDualThemeData(
seedColor: Colors.blue,
useMaterial3: true,
transformer: (data) => data.copyWith(
inputDecorationTheme: const InputDecorationTheme(
border: OutlineInputBorder(),
),
),
),
));
);
return MaterialApp.router(
title: 'MoneyMgr',
@ -90,4 +92,4 @@ class _MainAppState extends ConsumerState<_MainApp> {
debugShowCheckedModeBanner: false,
);
}
}
}