trcr/lib/main.dart
2025-06-13 15:20:06 -07:00

79 lines
2.4 KiB
Dart

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());
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<MainApp> createState() => _MainAppState();
}
class _MainAppState extends State<MainApp> {
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(),
],
),
);
}
}