From 36c618170e22f5116d6f85d86c36a01a13292023 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 30 Jun 2025 23:00:08 -0700 Subject: [PATCH] Better error handling --- lib/main.dart | 13 +++++++++++-- lib/main_screen.dart | 18 ++++++++++++------ lib/quick_actions.dart | 1 - lib/settings_screen.dart | 4 ++-- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index b97a720..9984ed2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,5 @@ +import 'dart:developer' as developer; + import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/material.dart'; @@ -10,6 +12,8 @@ import 'l10n/app_localizations.dart'; import 'main_screen.dart'; import 'preferences.dart'; +final messengerKey = GlobalKey(); + void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); @@ -36,8 +40,12 @@ class _MainAppState extends State { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) async { await rateMyApp.init(); - if (mounted && rateMyApp.shouldOpenDialog) { - rateMyApp.showRateDialog(context); + if (mounted && rateMyApp.shouldOpenDialog) { + try { + await rateMyApp.showRateDialog(context); + } catch (error) { + developer.log('Failed to show rate dialog', error: error); + } } }); } @@ -45,6 +53,7 @@ class _MainAppState extends State { @override Widget build(BuildContext context) { return MaterialApp( + scaffoldMessengerKey: messengerKey, localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, theme: ThemeData( diff --git a/lib/main_screen.dart b/lib/main_screen.dart index c7693fc..d8d42c4 100644 --- a/lib/main_screen.dart +++ b/lib/main_screen.dart @@ -1,6 +1,6 @@ -import 'dart:developer' as developer; - import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:traccar_client/main.dart'; import 'package:traccar_client/password_service.dart'; import 'package:traccar_client/preferences.dart'; import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; @@ -97,8 +97,14 @@ class _MainScreenState extends State { onChanged: (bool value) async { if (await PasswordService.authenticate(context) && mounted) { if (value) { - bg.BackgroundGeolocation.start(); - _checkBatteryOptimizations(context); + try { + await bg.BackgroundGeolocation.start(); + if (mounted) { + _checkBatteryOptimizations(context); + } + } on PlatformException catch (error) { + messengerKey.currentState?.showSnackBar(SnackBar(content: Text(error.message ?? error.code))); + } } else { bg.BackgroundGeolocation.stop(); } @@ -126,8 +132,8 @@ class _MainScreenState extends State { onPressed: () async { try { await bg.BackgroundGeolocation.getCurrentPosition(samples: 1, persist: true, extras: {'manual': true}); - } catch (error) { - developer.log('Failed to fetch location', error: error); + } on PlatformException catch (error) { + messengerKey.currentState?.showSnackBar(SnackBar(content: Text(error.message ?? error.code))); } }, child: Text(AppLocalizations.of(context)!.locationButton), diff --git a/lib/quick_actions.dart b/lib/quick_actions.dart index ba8aee1..86948b6 100644 --- a/lib/quick_actions.dart +++ b/lib/quick_actions.dart @@ -21,7 +21,6 @@ class _QuickActionsInitializerState extends State { void initState() { super.initState(); quickActions.initialize((shortcutType) async { - developer.log('action $shortcutType'); switch (shortcutType) { case 'start': bg.BackgroundGeolocation.start(); diff --git a/lib/settings_screen.dart b/lib/settings_screen.dart index fb3de4a..6355a26 100644 --- a/lib/settings_screen.dart +++ b/lib/settings_screen.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; +import 'package:traccar_client/main.dart'; import 'package:traccar_client/password_service.dart'; import 'package:traccar_client/qr_code_screen.dart'; import 'package:wakelock_partial_android/wakelock_partial_android.dart'; @@ -35,7 +36,6 @@ class _SettingsScreenState extends State { : Preferences.instance.getString(key) ?? ''; final controller = TextEditingController(text: initialValue); - final scaffoldManager = ScaffoldMessenger.of(context); final errorMessage = AppLocalizations.of(context)!.invalidValue; final result = await showDialog( @@ -64,7 +64,7 @@ class _SettingsScreenState extends State { if (key == Preferences.url) { final uri = Uri.tryParse(result); if (uri == null || uri.host.isEmpty || !(uri.scheme == 'http' || uri.scheme == 'https')) { - scaffoldManager.showSnackBar(SnackBar(content: Text(errorMessage))); + messengerKey.currentState?.showSnackBar(SnackBar(content: Text(errorMessage))); return; } }