import 'dart:io'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/material.dart'; import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; import 'package:rate_my_app/rate_my_app.dart'; import 'package:traccar_client/quick_actions.dart'; import 'l10n/app_localizations.dart'; import 'main_screen.dart'; import 'preferences.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError; await Preferences.init(); await bg.BackgroundGeolocation.ready(Preferences.geolocationConfig()); if (Platform.isAndroid) { await bg.BackgroundGeolocation.registerHeadlessTask(headlessTask); } bg.BackgroundGeolocation.onHeartbeat((bg.HeartbeatEvent event) async { await bg.BackgroundGeolocation.getCurrentPosition(samples: 1, persist: true); }); runApp(const MainApp()); } @pragma('vm:entry-point') void headlessTask(bg.HeadlessEvent headlessEvent) async { if (headlessEvent.name == bg.Event.HEARTBEAT) { await bg.BackgroundGeolocation.getCurrentPosition(samples: 1, persist: true); } } class MainApp extends StatefulWidget { const MainApp({super.key}); @override State createState() => _MainAppState(); } class _MainAppState extends State { RateMyApp rateMyApp = RateMyApp(minDays: 0, minLaunches: 0); @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) async { await rateMyApp.init(); if (mounted && rateMyApp.shouldOpenDialog) { rateMyApp.showRateDialog(context); } }); } @override Widget build(BuildContext context) { return MaterialApp( localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, localeResolutionCallback: (locale, supported) => supported.firstWhere((l) => l.languageCode == 'en'), theme: ThemeData( colorScheme: ColorScheme.fromSeed( seedColor: Colors.green, brightness: Brightness.light, ), ), darkTheme: ThemeData( colorScheme: ColorScheme.fromSeed( seedColor: Colors.green, brightness: Brightness.dark, ), ), home: Stack( children: const [ QuickActionsInitializer(), MainScreen(), ], ), ); } }