259 lines
8.3 KiB
Dart
259 lines
8.3 KiB
Dart
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<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
|
|
@pragma('vm:entry-point')
|
|
Future<void> _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<void> 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<void> 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<MyApp> createState() => _MyAppState();
|
|
|
|
static _MyAppState of(BuildContext context) =>
|
|
context.findAncestorStateOfType<_MyAppState>()!;
|
|
}
|
|
|
|
class _MyAppState extends State<MyApp> {
|
|
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,
|
|
);
|
|
}
|
|
}
|