From a589cdaee367bf0e9d85b88b75b503281e85d82a Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 5 May 2025 08:02:02 -0700 Subject: [PATCH] Add settings screen --- lib/main_screen.dart | 9 +++- lib/settings_screen.dart | 103 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 lib/settings_screen.dart diff --git a/lib/main_screen.dart b/lib/main_screen.dart index d1b4239..3b57d41 100644 --- a/lib/main_screen.dart +++ b/lib/main_screen.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:traccar_client/status_screen.dart'; + +import 'status_screen.dart'; +import 'settings_screen.dart'; class MainScreen extends StatelessWidget { const MainScreen({super.key}); @@ -111,7 +113,10 @@ class MainScreen extends StatelessWidget { Align( alignment: Alignment.centerRight, child: OutlinedButton( - onPressed: () {}, + onPressed: () => Navigator.push( + context, + MaterialPageRoute(builder: (_) => const SettingsScreen()), + ), child: const Text('Advanced settings'), ), ), diff --git a/lib/settings_screen.dart b/lib/settings_screen.dart new file mode 100644 index 0000000..5c1c943 --- /dev/null +++ b/lib/settings_screen.dart @@ -0,0 +1,103 @@ +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class SettingsScreen extends StatefulWidget { + const SettingsScreen({super.key}); + + @override + State createState() => _SettingsScreenState(); +} + +class _SettingsScreenState extends State { + late SharedPreferences prefs; + + final deviceIdController = TextEditingController(); + final serverUrlController = TextEditingController(); + final accuracyController = TextEditingController(); + final distanceController = TextEditingController(); + final frequencyController = TextEditingController(); + bool offlineBuffering = false; + + @override + void initState() { + super.initState(); + _loadSettings(); + } + + Future _loadSettings() async { + prefs = await SharedPreferences.getInstance(); + + setState(() { + deviceIdController.text = prefs.getString('deviceId') ?? ''; + serverUrlController.text = prefs.getString('serverUrl') ?? ''; + accuracyController.text = prefs.getString('accuracy') ?? 'high'; + distanceController.text = prefs.getString('distance') ?? '50'; + frequencyController.text = prefs.getString('frequency') ?? '60'; + offlineBuffering = prefs.getBool('offlineBuffering') ?? true; + }); + } + + Future _saveSettings() async { + await prefs.setString('deviceId', deviceIdController.text); + await prefs.setString('serverUrl', serverUrlController.text); + await prefs.setString('accuracy', accuracyController.text); + await prefs.setString('distance', distanceController.text); + await prefs.setString('frequency', frequencyController.text); + await prefs.setBool('offlineBuffering', offlineBuffering); + + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Settings saved')), + ); + } + } + + @override + void dispose() { + deviceIdController.dispose(); + serverUrlController.dispose(); + accuracyController.dispose(); + distanceController.dispose(); + frequencyController.dispose(); + super.dispose(); + } + + Widget _buildTextField(String label, TextEditingController controller) { + return TextField( + controller: controller, + decoration: InputDecoration(labelText: label), + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Settings'), + actions: [ + IconButton( + icon: const Icon(Icons.save), + onPressed: _saveSettings, + ), + ], + ), + body: ListView( + padding: const EdgeInsets.all(16), + children: [ + _buildTextField('Device ID', deviceIdController), + _buildTextField('Server URL', serverUrlController), + _buildTextField('Location Accuracy', accuracyController), + _buildTextField('Distance (meters)', distanceController), + _buildTextField('Frequency (seconds)', frequencyController), + SwitchListTile( + title: const Text('Offline Buffering'), + value: offlineBuffering, + onChanged: (value) { + setState(() => offlineBuffering = value); + }, + ), + ], + ), + ); + } +}