+add login save

This commit is contained in:
dmit.b
2026-07-05 09:51:18 +03:00
parent 2a3e6a642b
commit f011a121d7
3 changed files with 57 additions and 10 deletions
+1 -2
View File
@@ -12,7 +12,6 @@ import 'services/settings_service.dart';
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
final settings = SettingsService(); final settings = SettingsService();
await settings.initialize();
ApiConfig.setBaseUrl(settings.baseUrl); ApiConfig.setBaseUrl(settings.baseUrl);
final bgGeo = BackgroundGeoService(); final bgGeo = BackgroundGeoService();
await bgGeo.init(); await bgGeo.init();
@@ -47,7 +46,7 @@ class MyApp extends StatelessWidget {
supportedLocales: const [Locale('en', '')], supportedLocales: const [Locale('en', '')],
initialRoute: '/', initialRoute: '/',
routes: { routes: {
'/': (_) => const LoginScreen(), '/': (_) => LoginScreen(),
'/map': (_) => const MapScreen(), '/map': (_) => const MapScreen(),
}, },
), ),
+41 -7
View File
@@ -1,9 +1,7 @@
import 'dart:convert'; import 'package:provider/provider.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart'; import 'package:geolocator/geolocator.dart';
import 'package:provider/provider.dart';
import '../config/api.dart'; import '../config/api.dart';
import '../providers/auth_provider.dart'; import '../providers/auth_provider.dart';
import '../services/settings_service.dart'; import '../services/settings_service.dart';
@@ -23,6 +21,8 @@ class _LoginScreenState extends State<LoginScreen>
final TextEditingController _secretKeyController = TextEditingController(); final TextEditingController _secretKeyController = TextEditingController();
final TextEditingController _serverUrlController = TextEditingController(); final TextEditingController _serverUrlController = TextEditingController();
bool savedAuth = false;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@@ -32,6 +32,11 @@ class _LoginScreenState extends State<LoginScreen>
}); });
final settings = context.read<SettingsService>(); final settings = context.read<SettingsService>();
_serverUrlController.text = settings.baseUrl; _serverUrlController.text = settings.baseUrl;
_loginController.text = settings.login ?? "";
_passwordController.text = settings.pwd ?? "";
if (settings.login != null && settings.pwd != null) {
savedAuth = true;
}
} }
@override @override
@@ -48,7 +53,15 @@ class _LoginScreenState extends State<LoginScreen>
Widget build(BuildContext context) { Widget build(BuildContext context) {
final authProvider = context.watch<AuthProvider>(); final authProvider = context.watch<AuthProvider>();
final settings = context.read<SettingsService>(); final settings = context.read<SettingsService>();
if (savedAuth) {
login(
_loginController.text,
_passwordController.text,
context,
authProvider,
settings,
);
}
return Scaffold( return Scaffold(
resizeToAvoidBottomInset: true, resizeToAvoidBottomInset: true,
body: SingleChildScrollView( body: SingleChildScrollView(
@@ -76,7 +89,7 @@ class _LoginScreenState extends State<LoginScreen>
TextField( TextField(
controller: _serverUrlController, controller: _serverUrlController,
decoration: const InputDecoration( decoration: const InputDecoration(
labelText: 'Server URL', labelText: 'Адрес сервера',
hintText: 'https://example.com/api', hintText: 'https://example.com/api',
border: OutlineInputBorder(), border: OutlineInputBorder(),
prefixIcon: Icon(Icons.cloud_outlined), prefixIcon: Icon(Icons.cloud_outlined),
@@ -175,11 +188,15 @@ class _LoginScreenState extends State<LoginScreen>
} }
} else { } else {
if (_loginController.text.length <= 4) { if (_loginController.text.length <= 4) {
authProvider.setError('Login must be more than 4 characters'); authProvider.setError(
'Login must be more than 4 characters',
);
return; return;
} }
if (_passwordController.text.length <= 8) { if (_passwordController.text.length <= 8) {
authProvider.setError('Password must be more than 8 characters'); authProvider.setError(
'Password must be more than 8 characters',
);
return; return;
} }
try { try {
@@ -212,4 +229,21 @@ class _LoginScreenState extends State<LoginScreen>
), ),
); );
} }
Future<void> login(
String login,
String pwd,
BuildContext ctx,
AuthProvider authProvider,
SettingsService settings,
) async {
try {
await authProvider.login(login, pwd);
settings.saveAuth(login, pwd);
if (!ctx.mounted) return;
Navigator.of(ctx).pushReplacementNamed('/map');
} catch (e) {
// Error is handled by provider
}
}
} }
+15 -1
View File
@@ -1,19 +1,25 @@
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
class SettingsService { class SettingsService {
SettingsService(){initialize();}
static const String _baseUrlKey = 'server_base_url'; static const String _baseUrlKey = 'server_base_url';
static const String _defaultBaseUrl = static const String _defaultBaseUrl =
'https://family-safety.onrender.com/api'; 'https://family-safety.onrender.com/api';
static const String _loginKey = "login";
static const String _pwdKey = "pwd";
String _baseUrl = _defaultBaseUrl; String _baseUrl = _defaultBaseUrl;
bool _initialized = false; bool _initialized = false;
String get baseUrl => _baseUrl; String get baseUrl => _baseUrl;
String? login;
String? pwd;
Future<void> initialize() async { Future<void> initialize() async {
if (_initialized) return; if (_initialized) return;
final prefs = await SharedPreferences.getInstance(); final prefs = await SharedPreferences.getInstance();
_baseUrl = prefs.getString(_baseUrlKey) ?? _defaultBaseUrl; _baseUrl = prefs.getString(_baseUrlKey) ?? _defaultBaseUrl;
login = prefs.getString(_loginKey);
pwd = prefs.getString(_pwdKey);
_initialized = true; _initialized = true;
} }
@@ -23,6 +29,14 @@ class SettingsService {
await prefs.setString(_baseUrlKey, url); await prefs.setString(_baseUrlKey, url);
} }
Future<void> saveAuth(String user, String pass) async {
login = user;
pwd = pass;
final prefs = await SharedPreferences.getInstance();
await prefs.setString(_loginKey, user);
await prefs.setString(_loginKey, user);
}
void resetToDefault() { void resetToDefault() {
_baseUrl = _defaultBaseUrl; _baseUrl = _defaultBaseUrl;
} }