+add login save
This commit is contained in:
+1
-2
@@ -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(),
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user