import 'dart:developer'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_web_plugins/url_strategy.dart'; import 'package:hub/app_state.dart'; import 'package:hub/firebase_options.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/internationalization.dart'; import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:provider/provider.dart'; import 'package:responsive_framework/responsive_framework.dart'; final GlobalKey navigatorKey = GlobalKey(); @pragma('vm:entry-point') Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); await setupFlutterNotifications(); showFlutterNotification(message); log('Handling a background message ${message.messageId}'); } late AndroidNotificationChannel channel; late DarwinInitializationSettings iosSettings; late InitializationSettings initializationSettings; late AndroidInitializationSettings initializationSettingsAndroid; bool isFlutterLocalNotificationsInitialized = false; @pragma('vm:entry-point') Future setupFlutterNotifications() async { if (isFlutterLocalNotificationsInitialized) { return; } channel = const AndroidNotificationChannel( 'high_importance_channel', 'High Importance Notifications', description: 'This channel is used for important notifications.', importance: Importance.high, ); initializationSettingsAndroid = const AndroidInitializationSettings('mipmap/ic_fre_black'); iosSettings = const DarwinInitializationSettings( requestAlertPermission: true, requestBadgePermission: true, requestSoundPermission: true, ); initializationSettings = InitializationSettings( android: initializationSettingsAndroid, iOS: iosSettings, ); flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); await flutterLocalNotificationsPlugin .resolvePlatformSpecificImplementation< AndroidFlutterLocalNotificationsPlugin>() ?.createNotificationChannel(channel) .then((_) async => await flutterLocalNotificationsPlugin.initialize( initializationSettings, onDidReceiveNotificationResponse: (response) async { log('Notification: ${response.payload}'); }, onDidReceiveBackgroundNotificationResponse: (response) async { log('Notification: ${response.payload}'); }, )); await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions( alert: true, badge: true, sound: true, ); isFlutterLocalNotificationsInitialized = true; } void showFlutterNotification(RemoteMessage message) { log('Handling a background message ${message.messageId}'); RemoteNotification? notification = message.notification; AndroidNotification? android = message.notification?.android; if (notification != null && android != null && !kIsWeb) { flutterLocalNotificationsPlugin.show( notification.hashCode, notification.title, notification.body, NotificationDetails( android: AndroidNotificationDetails( channel.id, channel.name, channelDescription: channel.description, icon: 'launch_background', ), ), ); } } late FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); if (!kIsWeb) { await setupFlutterNotifications(); } SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); await init().then((_) { runApp(ChangeNotifierProvider( create: (context) => AppState(), child: const MyApp(), )); }); } Future init() async { log('Setting up Crashlytics...'); final crashlyticsInstance = FirebaseCrashlytics.instance; if (crashlyticsInstance.isCrashlyticsCollectionEnabled) { FlutterError.onError = crashlyticsInstance.recordFlutterError; } else { log('Crashlytics instance is null'); } log('Crashlytics set up.'); log('Initializing FlutterFlowTheme...'); await FlutterFlowTheme.initialize(); log('FlutterFlowTheme initialized.'); log('Initializing FFLocalizations...'); await FFLocalizations.initialize(); log('FFLocalizations initialized.'); log('Initializing app state...'); final appState = AppState(); await appState.initializePersistedState(); log('App state initialized.'); log('Initializing GoRouter...'); GoRouter.optionURLReflectsImperativeAPIs = true; usePathUrlStrategy(); log('GoRouter initialized.'); } class MyApp extends StatefulWidget { const MyApp({super.key}); @override State createState() => _MyAppState(); static _MyAppState of(BuildContext context) => context.findAncestorStateOfType<_MyAppState>()!; } class _MyAppState extends State { Locale? _locale = FFLocalizations.getStoredLocale(); ThemeMode _themeMode = FlutterFlowTheme.themeMode; late AppStateNotifier _appStateNotifier; late GoRouter _router; bool displaySplashImage = true; @override void initState() { super.initState(); FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); _appStateNotifier = AppStateNotifier.instance; _router = createRouter(_appStateNotifier); Future.delayed(const Duration(milliseconds: 1000), () => setState(() => _appStateNotifier.stopShowingSplashImage())); } void setLocale(String language) { setState(() => _locale = createLocale(language)); FFLocalizations.storeLocale(language); } void setThemeMode(ThemeMode mode) { setState(() { _themeMode = mode; FlutterFlowTheme.saveThemeMode(mode); }); } @override Widget build(BuildContext context) { return MaterialApp.router( title: 'FREHub', builder: (context, widget) => ResponsiveBreakpoints.builder( child: BouncingScrollWrapper.builder(context, widget!), breakpoints: [ const Breakpoint(start: 0, end: 450, name: MOBILE), const Breakpoint(start: 451, end: 800, name: TABLET), const Breakpoint(start: 801, end: 1920, name: DESKTOP), const Breakpoint(start: 1921, end: double.infinity, name: '4K'), ], ), localizationsDelegates: const [ FFLocalizationsDelegate(), GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], locale: _locale, supportedLocales: const [ Locale('pt'), Locale('en'), ], theme: ThemeData( brightness: Brightness.light, scrollbarTheme: ScrollbarThemeData( thumbVisibility: WidgetStateProperty.all(false), interactive: false, thumbColor: WidgetStateProperty.resolveWith((states) { if (states.contains(WidgetState.dragged)) { return const Color(0xff1aab5f); } if (states.contains(WidgetState.hovered)) { return const Color(0xff1aab5f); } return const Color(0xff1aab5f); }), ), ), darkTheme: ThemeData( brightness: Brightness.dark, scrollbarTheme: ScrollbarThemeData( thumbVisibility: WidgetStateProperty.all(false), interactive: false, thumbColor: WidgetStateProperty.resolveWith((states) { if (states.contains(WidgetState.dragged)) { return const Color(0xff1aab5f); } if (states.contains(WidgetState.hovered)) { return const Color(0xff1aab5f); } return const Color(0xff1aab5f); }), ), ), themeMode: _themeMode, routerConfig: _router, ); } }