trcr/lib/main.dart

96 lines
2.7 KiB
Dart
Raw Normal View History

2025-08-30 06:26:56 -07:00
import 'dart:async';
2025-06-30 23:00:08 -07:00
import 'dart:developer' as developer;
2025-05-11 13:13:51 -07:00
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
2025-05-04 17:47:47 -07:00
import 'package:flutter/material.dart';
2025-08-30 06:26:56 -07:00
import 'package:app_links/app_links.dart';
2025-05-24 07:27:45 -07:00
import 'package:rate_my_app/rate_my_app.dart';
2025-06-14 13:26:13 -07:00
import 'package:traccar_client/geolocation_service.dart';
2026-02-01 15:17:33 -08:00
import 'package:traccar_client/password_service.dart';
2025-06-30 21:50:26 -07:00
import 'package:traccar_client/push_service.dart';
2025-05-10 11:16:46 -07:00
import 'package:traccar_client/quick_actions.dart';
2025-05-05 18:18:36 -07:00
2025-06-05 23:15:05 -07:00
import 'l10n/app_localizations.dart';
2025-05-05 18:18:36 -07:00
import 'main_screen.dart';
2025-05-05 22:43:43 -07:00
import 'preferences.dart';
2025-08-30 06:26:56 -07:00
import 'configuration_service.dart';
2025-05-04 17:47:47 -07:00
2025-06-30 23:00:08 -07:00
final messengerKey = GlobalKey<ScaffoldMessengerState>();
2025-05-05 22:43:43 -07:00
void main() async {
WidgetsFlutterBinding.ensureInitialized();
2025-05-11 13:13:51 -07:00
await Firebase.initializeApp();
FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError;
2025-05-05 22:43:43 -07:00
await Preferences.init();
2026-02-01 15:17:33 -08:00
await PasswordService.migrate();
2025-06-14 13:26:13 -07:00
await GeolocationService.init();
2025-06-30 21:50:26 -07:00
await PushService.init();
2025-05-04 17:47:47 -07:00
runApp(const MainApp());
}
2025-05-24 07:27:45 -07:00
class MainApp extends StatefulWidget {
2025-05-04 17:47:47 -07:00
const MainApp({super.key});
2025-05-24 07:27:45 -07:00
@override
State<MainApp> createState() => _MainAppState();
}
class _MainAppState extends State<MainApp> {
RateMyApp rateMyApp = RateMyApp(minDays: 0, minLaunches: 0);
@override
void initState() {
super.initState();
2025-08-30 06:26:56 -07:00
_initLinks();
2025-05-24 07:27:45 -07:00
WidgetsBinding.instance.addPostFrameCallback((_) async {
await rateMyApp.init();
2025-06-30 23:00:08 -07:00
if (mounted && rateMyApp.shouldOpenDialog) {
try {
await rateMyApp.showRateDialog(context);
} catch (error) {
developer.log('Failed to show rate dialog', error: error);
}
2025-05-24 07:27:45 -07:00
}
});
}
2025-08-30 06:26:56 -07:00
Future<void> _initLinks() async {
final appLinks = AppLinks();
final uri = await appLinks.getInitialLink();
if (uri != null) {
await ConfigurationService.applyUri(uri);
}
appLinks.uriLinkStream.listen((uri) async {
await ConfigurationService.applyUri(uri);
});
}
2025-05-04 17:47:47 -07:00
@override
Widget build(BuildContext context) {
2025-05-07 22:06:29 -07:00
return MaterialApp(
2025-06-30 23:00:08 -07:00
scaffoldMessengerKey: messengerKey,
2025-05-05 18:18:36 -07:00
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
2025-05-07 22:06:29 -07:00
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.green,
2025-05-20 17:48:08 -07:00
brightness: Brightness.light,
),
),
darkTheme: ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.green,
brightness: Brightness.dark,
2025-05-07 22:06:29 -07:00
),
),
2025-05-10 11:16:46 -07:00
home: Stack(
children: const [
QuickActionsInitializer(),
MainScreen(),
],
),
2025-05-04 17:47:47 -07:00
);
}
}