HydroNutrify_Ari_e41221567/lib/main.dart

124 lines
3.5 KiB
Dart

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:mobile_monitoring/core/firebase_options.dart';
import 'package:mobile_monitoring/core/constants/strings.dart';
import 'package:mobile_monitoring/core/theme/app_theme.dart';
import 'package:mobile_monitoring/ui/pages/splash_screen.dart';
import 'package:mobile_monitoring/ui/pages/login.dart';
import 'package:mobile_monitoring/ui/pages/home.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await dotenv.load(fileName: '.env');
FlutterError.onError = (details) {
FlutterError.presentError(details);
debugPrint('FlutterError: ${details.exceptionAsString()}');
debugPrint(details.stack?.toString());
};
await runZonedGuarded(
() async {
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
// Disable reCAPTCHA for development
FirebaseAuth.instance.setSettings(
appVerificationDisabledForTesting: true,
);
runApp(const MyApp());
},
(error, stack) {
debugPrint('Zoned error: $error');
debugPrint(stack.toString());
},
);
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: AppStrings.appName,
debugShowCheckedModeBanner: false,
theme: AppTheme.lightTheme,
navigatorObservers: [LoggingNavigatorObserver()],
home: const SplashScreen(
duration: Duration(seconds: 3),
nextPage: AuthWrapper(),
),
onGenerateRoute: (settings) {
switch (settings.name) {
case '/home':
return MaterialPageRoute(
builder: (context) => const HomePage(),
settings: settings,
);
default:
return null;
}
},
);
}
}
class LoggingNavigatorObserver extends NavigatorObserver {
LoggingNavigatorObserver();
@override
void didPush(Route route, Route? previousRoute) {
debugPrint('NAV push: ${route.settings.name ?? route.runtimeType}');
super.didPush(route, previousRoute);
}
@override
void didPop(Route route, Route? previousRoute) {
debugPrint('NAV pop: ${route.settings.name ?? route.runtimeType}');
super.didPop(route, previousRoute);
}
@override
void didReplace({Route? newRoute, Route? oldRoute}) {
debugPrint(
'NAV replace: ${oldRoute?.settings.name ?? oldRoute?.runtimeType} -> ${newRoute?.settings.name ?? newRoute?.runtimeType}',
);
super.didReplace(newRoute: newRoute, oldRoute: oldRoute);
}
}
class AuthWrapper extends StatefulWidget {
const AuthWrapper({super.key});
@override
State<AuthWrapper> createState() => _AuthWrapperState();
}
class _AuthWrapperState extends State<AuthWrapper> {
@override
Widget build(BuildContext context) {
return StreamBuilder<User?>(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, snapshot) {
// Show loading while checking auth state
if (snapshot.connectionState == ConnectionState.waiting) {
return const Scaffold(
body: Center(child: CircularProgressIndicator()),
);
}
// If user is logged in, show home page
if (snapshot.hasData) {
return const HomePage();
}
// If user is not logged in, show login page
return const LoginPage();
},
);
}
}