From dd164e95ea271ce47dc4c53ea78f608bb3cd1ed8 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 10 May 2025 09:51:51 -0700 Subject: [PATCH] Initialize in main --- lib/main.dart | 2 ++ lib/main_screen.dart | 17 ++------- lib/preferences.dart | 77 ++++++++++++++++++++-------------------- lib/settings_screen.dart | 33 +++++++---------- 4 files changed, 56 insertions(+), 73 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 322a5ad..1e7f998 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; import 'main_screen.dart'; import 'preferences.dart'; @@ -7,6 +8,7 @@ import 'preferences.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Preferences.init(); + await bg.BackgroundGeolocation.ready(Preferences.geolocationConfig()); runApp(const MainApp()); } diff --git a/lib/main_screen.dart b/lib/main_screen.dart index 61d0521..57a02b1 100644 --- a/lib/main_screen.dart +++ b/lib/main_screen.dart @@ -2,7 +2,6 @@ import 'dart:developer' as developer; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:shared_preferences/shared_preferences.dart'; import 'package:traccar_client/preferences.dart'; import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; @@ -17,8 +16,6 @@ class MainScreen extends StatefulWidget { } class _MainScreenState extends State { - bool loading = true; - late SharedPreferences preferences; bool trackingEnabled = false; @override @@ -28,12 +25,8 @@ class _MainScreenState extends State { } void _initState() async { - preferences = await SharedPreferences.getInstance(); - final state = await bg.BackgroundGeolocation.ready( - Preferences.geolocationConfig(preferences), - ); + final state = await bg.BackgroundGeolocation.state; setState(() { - loading = false; trackingEnabled = state.enabled; }); bg.BackgroundGeolocation.onEnabledChange((bool enabled) { @@ -58,7 +51,7 @@ class _MainScreenState extends State { ListTile( contentPadding: EdgeInsets.zero, title: Text(AppLocalizations.of(context)!.idLabel), - trailing: Text(preferences.getString(Preferences.id) ?? ''), + trailing: Text(Preferences.instance.getString(Preferences.id) ?? ''), leadingAndTrailingTextStyle: Theme.of(context).textTheme.bodyLarge, ), SwitchListTile( @@ -117,7 +110,7 @@ class _MainScreenState extends State { ListTile( contentPadding: EdgeInsets.zero, title: Text(AppLocalizations.of(context)!.urlLabel), - trailing: Text(preferences.getString(Preferences.url) ?? ''), + trailing: Text(Preferences.instance.getString(Preferences.url) ?? ''), leadingAndTrailingTextStyle: Theme.of(context).textTheme.bodyLarge, ), const SizedBox(height: 8), @@ -140,10 +133,6 @@ class _MainScreenState extends State { @override Widget build(BuildContext context) { - if (loading) { - return const Center(child: CircularProgressIndicator()); - } - return Scaffold( appBar: AppBar( title: Text(AppLocalizations.of(context)!.mainTitle), diff --git a/lib/preferences.dart b/lib/preferences.dart index 3987e9a..292dd3a 100644 --- a/lib/preferences.dart +++ b/lib/preferences.dart @@ -6,6 +6,7 @@ import 'package:flutter_background_geolocation/flutter_background_geolocation.da import 'package:shared_preferences/shared_preferences.dart'; class Preferences { + static late SharedPreferences instance; static const String id = 'id'; static const String url = 'url'; static const String accuracy = 'accuracy'; @@ -14,80 +15,80 @@ class Preferences { static const String buffer = 'buffer'; static Future init() async { - SharedPreferences preferences = await SharedPreferences.getInstance(); + instance = await SharedPreferences.getInstance(); if (Platform.isIOS) { - await _migrate(preferences); + await _migrate(); } - await preferences.setString(id, preferences.getString(id) ?? (Random().nextInt(90000000) + 10000000).toString()); - await preferences.setString(url, preferences.getString(url) ?? 'http://demo.traccar.org:5055'); - await preferences.setString(accuracy, preferences.getString(accuracy) ?? 'medium'); - await preferences.setInt(interval, preferences.getInt(interval) ?? 300); - final distanceValue = preferences.getInt(distance); + await instance.setString(id, instance.getString(id) ?? (Random().nextInt(90000000) + 10000000).toString()); + await instance.setString(url, instance.getString(url) ?? 'http://demo.traccar.org:5055'); + await instance.setString(accuracy, instance.getString(accuracy) ?? 'medium'); + await instance.setInt(interval, instance.getInt(interval) ?? 300); + final distanceValue = instance.getInt(distance); if (distanceValue == null || distanceValue <= 0) { - await preferences.setInt(distance, 75); + await instance.setInt(distance, 75); } - await preferences.setBool(buffer, preferences.getBool(buffer) ?? true); + await instance.setBool(buffer, instance.getBool(buffer) ?? true); } - static bg.Config geolocationConfig(SharedPreferences preferences) { + static bg.Config geolocationConfig() { return bg.Config( stopOnTerminate: false, startOnBoot: true, - desiredAccuracy: switch (preferences.getString(accuracy)) { + desiredAccuracy: switch (instance.getString(accuracy)) { 'high' => bg.Config.DESIRED_ACCURACY_HIGH, 'low' => bg.Config.DESIRED_ACCURACY_LOW, _ => bg.Config.DESIRED_ACCURACY_MEDIUM, }, - url: preferences.getString(url), + url: instance.getString(url), params: { - "device_id": preferences.getString(id), + "device_id": instance.getString(id), }, - distanceFilter: preferences.getInt(distance)?.toDouble(), - locationUpdateInterval: (preferences.getInt(interval) ?? 0) * 1000, - maxRecordsToPersist: preferences.getBool(buffer) != false ? -1 : 0, + distanceFilter: instance.getInt(distance)?.toDouble(), + locationUpdateInterval: (instance.getInt(interval) ?? 0) * 1000, + maxRecordsToPersist: instance.getBool(buffer) != false ? -1 : 0, logLevel: bg.Config.LOG_LEVEL_INFO, logMaxDays: 1, ); } - static Future _migrate(SharedPreferences preferences) async { - final oldId = preferences.getString('device_id_preference'); + static Future _migrate() async { + final oldId = instance.getString('device_id_preference'); if (oldId != null) { - preferences.setString(id, oldId); - preferences.remove('device_id_preference'); + instance.setString(id, oldId); + instance.remove('device_id_preference'); } - final oldUrl = preferences.getString('server_url_preference'); + final oldUrl = instance.getString('server_url_preference'); if (oldUrl != null) { - preferences.setString(url, oldUrl); - preferences.remove('server_url_preference'); + instance.setString(url, oldUrl); + instance.remove('server_url_preference'); } - final oldAccuracy = preferences.getString('accuracy_preference'); + final oldAccuracy = instance.getString('accuracy_preference'); if (oldAccuracy != null) { - preferences.setString(accuracy, oldAccuracy); - preferences.remove('accuracy_preference'); + instance.setString(accuracy, oldAccuracy); + instance.remove('accuracy_preference'); } - final oldIntervalString = preferences.getString('frequency_preference'); + final oldIntervalString = instance.getString('frequency_preference'); final oldInterval = oldIntervalString != null ? int.tryParse(oldIntervalString) : null; if (oldInterval != null) { - preferences.setInt(interval, oldInterval); - preferences.remove('frequency_preference'); + instance.setInt(interval, oldInterval); + instance.remove('frequency_preference'); } - final oldDistanceString = preferences.getString('distance_preference'); + final oldDistanceString = instance.getString('distance_preference'); final oldDistance = oldDistanceString != null ? int.tryParse(oldDistanceString) : null; if (oldDistance != null) { - preferences.setInt(distance, oldDistance); - preferences.remove('distance_preference'); + instance.setInt(distance, oldDistance); + instance.remove('distance_preference'); } - final oldAngleString = preferences.getString('angle_preference'); + final oldAngleString = instance.getString('angle_preference'); final oldAngle = oldAngleString != null ? int.tryParse(oldAngleString) : null; if (oldAngle != null) { - preferences.setInt('angle', oldAngle); - preferences.remove('angle_preference'); + instance.setInt('angle', oldAngle); + instance.remove('angle_preference'); } - final oldBuffer = preferences.getBool('buffer_preference'); + final oldBuffer = instance.getBool('buffer_preference'); if (oldBuffer != null) { - preferences.setBool(buffer, oldBuffer); - preferences.remove('buffer_preference'); + instance.setBool(buffer, oldBuffer); + instance.remove('buffer_preference'); } } } diff --git a/lib/settings_screen.dart b/lib/settings_screen.dart index 5e36a2e..44ac5a7 100644 --- a/lib/settings_screen.dart +++ b/lib/settings_screen.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; @@ -14,8 +13,6 @@ class SettingsScreen extends StatefulWidget { } class _SettingsScreenState extends State { - bool loading = true; - late SharedPreferences preferences; bool buffering = true; @override @@ -25,10 +22,8 @@ class _SettingsScreenState extends State { } void _initState() async { - preferences = await SharedPreferences.getInstance(); setState(() { - loading = false; - buffering = preferences.getBool(Preferences.buffer) ?? true; + buffering = Preferences.instance.getBool(Preferences.buffer) ?? true; }); } @@ -42,8 +37,8 @@ class _SettingsScreenState extends State { Future _editSetting(String title, String key, bool isInt) async { final initialValue = isInt - ? preferences.getInt(key)?.toString() ?? '0' - : preferences.getString(key) ?? ''; + ? Preferences.instance.getInt(key)?.toString() ?? '0' + : Preferences.instance.getString(key) ?? ''; final controller = TextEditingController(text: initialValue); @@ -73,18 +68,18 @@ class _SettingsScreenState extends State { if (isInt) { final intValue = int.tryParse(result); if (intValue != null) { - await preferences.setInt(key, intValue); + await Preferences.instance.setInt(key, intValue); } } else { - await preferences.setString(key, result); + await Preferences.instance.setString(key, result); } - await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig(preferences)); + await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig()); setState(() {}); } } Widget _buildListTile(String title, String key, bool isInt) { - final value = isInt ? preferences.getInt(key)?.toString() : preferences.getString(key); + final value = isInt ? Preferences.instance.getInt(key)?.toString() : Preferences.instance.getString(key); return ListTile( title: Text(title), subtitle: Text(value ?? ''), @@ -96,7 +91,7 @@ class _SettingsScreenState extends State { final accuracyOptions = ['high', 'medium', 'low']; return ListTile( title: Text(AppLocalizations.of(context)!.accuracyLabel), - subtitle: Text(_getAccuracyLabel(preferences.getString(Preferences.accuracy))), + subtitle: Text(_getAccuracyLabel(Preferences.instance.getString(Preferences.accuracy))), onTap: () async { final selectedAccuracy = await showDialog( context: context, @@ -109,8 +104,8 @@ class _SettingsScreenState extends State { ), ); if (selectedAccuracy != null) { - await preferences.setString(Preferences.accuracy, selectedAccuracy); - await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig(preferences)); + await Preferences.instance.setString(Preferences.accuracy, selectedAccuracy); + await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig()); setState(() {}); } }, @@ -119,10 +114,6 @@ class _SettingsScreenState extends State { @override Widget build(BuildContext context) { - if (loading) { - return const Center(child: CircularProgressIndicator()); - } - return Scaffold( appBar: AppBar(title: Text(AppLocalizations.of(context)!.settingsTitle)), body: ListView( @@ -136,8 +127,8 @@ class _SettingsScreenState extends State { title: Text(AppLocalizations.of(context)!.bufferLabel), value: buffering, onChanged: (value) async { - await preferences.setBool(Preferences.buffer, value); - await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig(preferences)); + await Preferences.instance.setBool(Preferences.buffer, value); + await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig()); setState(() => buffering = value); }, ),