git / moonbite-network / mobile/lib/main.dart · raw
import 'package:flutter/material.dart';import 'package:provider/provider.dart';import 'services/chain_service.dart';import 'screens/home_screen.dart';import 'screens/lock_screen.dart';import 'screens/onboarding_screen.dart';import 'wallet/wallet_controller.dart';void main() { runApp(const MoonBiteApp());}class MoonBiteApp extends StatelessWidget { const MoonBiteApp({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: [ Provider<ChainService>(create: (_) => ChainService()), ChangeNotifierProvider<WalletController>( create: (ctx) => WalletController(chain: ctx.read<ChainService>()), ), ], child: MaterialApp( title: 'MoonBite Wallet', debugShowCheckedModeBanner: false, theme: ThemeData.dark(useMaterial3: true).copyWith( scaffoldBackgroundColor: const Color(0xFF121212), colorScheme: const ColorScheme.dark( primary: Color(0xFF1F6FD9), secondary: Color(0xFF1F6FD9), ), appBarTheme: const AppBarTheme( backgroundColor: Color(0xFF1F1F1F), elevation: 0, ), bottomNavigationBarTheme: const BottomNavigationBarThemeData( backgroundColor: Color(0xFF1F1F1F), selectedItemColor: Color(0xFF1F6FD9), unselectedItemColor: Color(0xFF666666), ), ), home: const _Root(), ), ); }}/// Decides between onboarding and the main app depending on whether a wallet/// already exists on the device.class _Root extends StatefulWidget { const _Root(); @override State<_Root> createState() => _RootState();}class _RootState extends State<_Root> with WidgetsBindingObserver { late final Future<bool> _loaded; @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); _loaded = context.read<WalletController>().loadExisting(); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); super.dispose(); } @override void didChangeAppLifecycleState(AppLifecycleState state) { // Re-engage the lock whenever the app leaves the foreground so a stored // wallet always requires a fresh unlock on return. if (state == AppLifecycleState.paused || state == AppLifecycleState.detached) { context.read<WalletController>().lock(); } } @override Widget build(BuildContext context) { return FutureBuilder<bool>( future: _loaded, builder: (context, snap) { if (snap.connectionState != ConnectionState.done) { return const Scaffold( body: Center(child: CircularProgressIndicator()), ); } final controller = context.watch<WalletController>(); if (!controller.hasWallet) { return const OnboardingScreen(); } return controller.requiresUnlock ? const LockScreen() : const HomeScreen(); }, ); }}