import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:qpay/auth_state.dart'; import 'package:qpay/routes.dart'; import 'package:qpay/url_strategy.dart'; import 'package:qpay/screens/transaction_controller.dart'; import 'package:qpay/screens/onboarding/onboarding_controller.dart'; import 'package:qpay/providers/splash_provider.dart'; import 'package:qpay/screens/workspaces/workspace_provider.dart'; import 'package:qpay/providers/uptime_provider.dart'; import 'package:qpay/theme/app_theme.dart'; import 'package:firebase_core/firebase_core.dart'; import 'firebase_options.dart'; import 'config/app_config.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); if (kIsWeb) { usePathUrlStrategy(); } await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); // Read the persisted auth token before the first frame so the router // knows whether the user is already signed in on cold start. Without // this we would briefly treat logged-in users as guests and bounce // them to the sign-in screen until the first refresh kicked in. await authState.initialize(); runApp( MultiProvider( providers: [ ChangeNotifierProvider( create: (_) => TransactionController(), ), ChangeNotifierProvider( create: (_) => OnboardingController(), ), ChangeNotifierProvider( create: (_) => SplashProvider(), ), ChangeNotifierProvider( create: (_) => WorkspaceProvider(), ), ChangeNotifierProvider( create: (_) => UptimeProvider(), ), ], child: const MyApp(), ), ); } class MyApp extends StatefulWidget { const MyApp({super.key}); @override State createState() => _MyAppState(); } class _MyAppState extends State { @override Widget build(BuildContext context) { return MaterialApp.router( title: 'Velocity', theme: AppTheme.lightTheme, themeMode: ThemeMode.light, debugShowCheckedModeBanner: false, routerConfig: buildRouter(), ); } }