import 'package:dynamic_color/dynamic_color.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:http/http.dart' as http; import 'package:neomovies_mobile/data/api/api_client.dart'; import 'package:neomovies_mobile/data/api/authenticated_http_client.dart'; import 'package:neomovies_mobile/data/models/movie.dart'; import 'package:neomovies_mobile/data/models/movie_preview.dart'; import 'package:neomovies_mobile/data/repositories/auth_repository.dart'; import 'package:neomovies_mobile/data/repositories/favorites_repository.dart'; import 'package:neomovies_mobile/data/repositories/movie_repository.dart'; import 'package:neomovies_mobile/data/repositories/reactions_repository.dart'; import 'package:neomovies_mobile/data/services/secure_storage_service.dart'; import 'package:neomovies_mobile/presentation/providers/auth_provider.dart'; import 'package:neomovies_mobile/presentation/providers/favorites_provider.dart'; import 'package:neomovies_mobile/presentation/providers/home_provider.dart'; import 'package:neomovies_mobile/presentation/providers/movie_detail_provider.dart'; import 'package:neomovies_mobile/presentation/providers/reactions_provider.dart'; import 'package:neomovies_mobile/presentation/screens/main_screen.dart'; import 'package:provider/provider.dart'; Future main() async { // Ensure widgets are initialized WidgetsFlutterBinding.ensureInitialized(); // Load environment variables await dotenv.load(fileName: ".env"); // Initialize Hive for local caching await Hive.initFlutter(); // Register Adapters Hive.registerAdapter(MovieAdapter()); Hive.registerAdapter(MoviePreviewAdapter()); runApp( MultiProvider( providers: [ // Core Services & Clients Provider(create: (_) => const FlutterSecureStorage()), Provider( create: (context) => SecureStorageService(context.read()), ), Provider(create: (_) => http.Client()), Provider( create: (context) => AuthenticatedHttpClient( context.read(), context.read(), ), ), Provider( create: (context) => ApiClient(context.read()), ), // Repositories Provider( create: (context) => MovieRepository(apiClient: context.read()), ), Provider( create: (context) => AuthRepository( apiClient: context.read(), storageService: context.read(), ), ), Provider( create: (context) => FavoritesRepository(context.read()), ), Provider( create: (context) => ReactionsRepository(context.read()), ), // State Notifiers (Providers) ChangeNotifierProvider( create: (context) => AuthProvider(authRepository: context.read()), ), ChangeNotifierProvider( create: (context) => HomeProvider(movieRepository: context.read())..init(), ), ChangeNotifierProvider( create: (context) => MovieDetailProvider( context.read(), context.read(), ), ), ChangeNotifierProvider( create: (context) => ReactionsProvider( context.read(), context.read(), )), ChangeNotifierProxyProvider( create: (context) => FavoritesProvider( context.read(), context.read(), ), update: (context, auth, previous) => previous!..update(auth), ), ], child: const MyApp(), ), ); } class MyApp extends StatelessWidget { const MyApp({super.key}); static final _defaultLightColorScheme = ColorScheme.fromSeed(seedColor: Colors.blue); static final _defaultDarkColorScheme = ColorScheme.fromSeed(seedColor: Colors.blue, brightness: Brightness.dark); @override Widget build(BuildContext context) { // Use dynamic_color to get colors from the system return DynamicColorBuilder( builder: (lightColorScheme, darkColorScheme) { return MaterialApp( title: 'NeoMovies', debugShowCheckedModeBanner: false, theme: ThemeData( colorScheme: lightColorScheme ?? _defaultLightColorScheme, useMaterial3: true, textTheme: GoogleFonts.manropeTextTheme( ThemeData(brightness: Brightness.light).textTheme, ), ), darkTheme: ThemeData( colorScheme: darkColorScheme ?? _defaultDarkColorScheme, useMaterial3: true, textTheme: GoogleFonts.manropeTextTheme( ThemeData(brightness: Brightness.dark).textTheme, ), ), themeMode: ThemeMode.system, home: const MainScreen(), ); }, ); } }