Waaaay big enchancements
This commit is contained in:
@@ -17,6 +17,8 @@ class _HomeEditScreenState extends ConsumerState<HomeEditScreen> {
|
||||
final _nameCtrl = TextEditingController();
|
||||
final _urlCtrl = TextEditingController();
|
||||
final _keyCtrl = TextEditingController();
|
||||
final _latCtrl = TextEditingController();
|
||||
final _lonCtrl = TextEditingController();
|
||||
bool _saving = false;
|
||||
|
||||
bool get _isEdit => widget.home != null;
|
||||
@@ -28,6 +30,12 @@ class _HomeEditScreenState extends ConsumerState<HomeEditScreen> {
|
||||
_nameCtrl.text = widget.home!.name;
|
||||
_urlCtrl.text = widget.home!.url;
|
||||
_keyCtrl.text = widget.home!.apiKey;
|
||||
if (widget.home!.latitude != null) {
|
||||
_latCtrl.text = widget.home!.latitude.toString();
|
||||
}
|
||||
if (widget.home!.longitude != null) {
|
||||
_lonCtrl.text = widget.home!.longitude.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,6 +44,8 @@ class _HomeEditScreenState extends ConsumerState<HomeEditScreen> {
|
||||
_nameCtrl.dispose();
|
||||
_urlCtrl.dispose();
|
||||
_keyCtrl.dispose();
|
||||
_latCtrl.dispose();
|
||||
_lonCtrl.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -45,9 +55,10 @@ class _HomeEditScreenState extends ConsumerState<HomeEditScreen> {
|
||||
appBar: AppBar(
|
||||
title: Text(_isEdit ? 'РЕДАКТИРОВАТЬ ДОМ' : 'НОВЫЙ ДОМ'),
|
||||
),
|
||||
body: Padding(
|
||||
body: SingleChildScrollView(
|
||||
padding: const EdgeInsets.all(20),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
TextField(
|
||||
controller: _nameCtrl,
|
||||
@@ -75,6 +86,54 @@ class _HomeEditScreenState extends ConsumerState<HomeEditScreen> {
|
||||
),
|
||||
obscureText: true,
|
||||
),
|
||||
|
||||
const SizedBox(height: 24),
|
||||
|
||||
// ─── GPS-координаты (опционально) ───
|
||||
const Text(
|
||||
'Координаты дома (опционально)',
|
||||
style: TextStyle(
|
||||
color: Colors.white54,
|
||||
fontSize: 13,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
const Text(
|
||||
'Для автоматизации по геолокации',
|
||||
style: TextStyle(color: Colors.white30, fontSize: 12),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: TextField(
|
||||
controller: _latCtrl,
|
||||
decoration: const InputDecoration(
|
||||
labelText: 'Широта',
|
||||
prefixIcon: Icon(Icons.location_on, size: 20),
|
||||
hintText: '51.128',
|
||||
),
|
||||
keyboardType: const TextInputType.numberWithOptions(
|
||||
decimal: true, signed: true),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 12),
|
||||
Expanded(
|
||||
child: TextField(
|
||||
controller: _lonCtrl,
|
||||
decoration: const InputDecoration(
|
||||
labelText: 'Долгота',
|
||||
prefixIcon: Icon(Icons.location_on, size: 20),
|
||||
hintText: '71.430',
|
||||
),
|
||||
keyboardType: const TextInputType.numberWithOptions(
|
||||
decimal: true, signed: true),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
const SizedBox(height: 24),
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
@@ -97,6 +156,8 @@ class _HomeEditScreenState extends ConsumerState<HomeEditScreen> {
|
||||
: Text(_isEdit ? 'СОХРАНИТЬ' : 'ДОБАВИТЬ'),
|
||||
),
|
||||
),
|
||||
// Отступ внизу для системных кнопок
|
||||
SizedBox(height: MediaQuery.of(context).padding.bottom + 16),
|
||||
],
|
||||
),
|
||||
),
|
||||
@@ -107,23 +168,47 @@ class _HomeEditScreenState extends ConsumerState<HomeEditScreen> {
|
||||
final name = _nameCtrl.text.trim();
|
||||
final url = _urlCtrl.text.trim();
|
||||
final key = _keyCtrl.text.trim();
|
||||
final latText = _latCtrl.text.trim();
|
||||
final lonText = _lonCtrl.text.trim();
|
||||
|
||||
if (name.isEmpty || url.isEmpty || key.isEmpty) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(content: Text('Заполните все поля')),
|
||||
const SnackBar(content: Text('Заполните все обязательные поля')),
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
double? lat;
|
||||
double? lon;
|
||||
if (latText.isNotEmpty && lonText.isNotEmpty) {
|
||||
lat = double.tryParse(latText);
|
||||
lon = double.tryParse(lonText);
|
||||
if (lat == null || lon == null) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(content: Text('Некорректные координаты')),
|
||||
);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
setState(() => _saving = true);
|
||||
|
||||
final home = _isEdit
|
||||
? widget.home!.copyWith(name: name, url: url, apiKey: key)
|
||||
? widget.home!.copyWith(
|
||||
name: name,
|
||||
url: url,
|
||||
apiKey: key,
|
||||
latitude: lat,
|
||||
longitude: lon,
|
||||
clearCoordinates: latText.isEmpty && lonText.isEmpty,
|
||||
)
|
||||
: HomeConfig(
|
||||
id: DateTime.now().millisecondsSinceEpoch.toString(),
|
||||
name: name,
|
||||
url: url,
|
||||
apiKey: key,
|
||||
latitude: lat,
|
||||
longitude: lon,
|
||||
);
|
||||
|
||||
if (_isEdit) {
|
||||
|
||||
Reference in New Issue
Block a user