This commit is contained in:
Riccardo Usardi committed 2025-07-18 22:24:01 +02:00
commit e833bcaec4
224 files changed
+11812

No files matched your search

+250
View File
@@ -0,0 +1,250 @@
import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:latlong2/latlong.dart';
import 'package:u_vineyard/services/polygon.area.calculator.service.dart';
import 'package:u_vineyard/template/src/widgets/card.widget.dart';
import 'package:u_vineyard/template/src/widgets/responsive_widgets/repesponsive_grid_item.widget.dart';
import 'package:u_vineyard/template/src/widgets/responsive_widgets/responsive_grid.widget.dart';
import 'package:u_vineyard/widgets/map.widget.dart';
class NewVineyardScreen extends StatefulWidget {
const NewVineyardScreen({super.key});
@override
State<NewVineyardScreen> createState() => _NewVineyardScreenState(); // Correzione: nome della classe State
}
class _NewVineyardScreenState extends State<NewVineyardScreen> { // Correzione: nome della classe State
// Aggiungi un TextEditingController per il TextFormField
final TextEditingController _nomeVignaController = TextEditingController();
final TextEditingController _superficieController = TextEditingController();
List<LatLng> _polygonPoints = [];
double _calculatedArea = 0.0; // Area calcolata, inizialmente impostata a 0
final TextEditingController _localitaController = TextEditingController();
@override
void dispose() {
_nomeVignaController.dispose(); // Libera il controller quando il widget viene eliminato
_superficieController.dispose(); // Libera il controller quando il widget viene eliminato
_localitaController.dispose(); // Libera il controller quando il widget viene eliminato
super.dispose();
}
void _handleMapTap(TapPosition tapPosition, LatLng latLng) {
setState(() {
_polygonPoints.add(latLng);
_calculatedArea = PolygonAreaCalculator.calculateAreaInHectares(_polygonPoints);
});
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Punto aggiunto: ${latLng.latitude.toStringAsFixed(4)}, ${latLng.longitude.toStringAsFixed(4)}'),
duration: const Duration(milliseconds: 800),
),
);
}
void _clearPolygon() {
setState(() {
_polygonPoints.clear();
_calculatedArea = 0.0;
_superficieController.clear();
});
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Poligono e superficie resettati.'),
duration: Duration(milliseconds: 800),
),
);
}
void _showAreaConfirmationDialog() {
if (_calculatedArea > 0) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: const Text('Conferma Superficie'),
content: Text(
'L\'area calcolata del poligono è di ${_calculatedArea.toStringAsFixed(2)} ettari.\n\nVuoi utilizzare questo valore o inserirlo manualmente?'),
actions: <Widget>[
TextButton(
child: const Text('Inserisci Manualmente'),
onPressed: () {
Navigator.of(context).pop();
_superficieController.clear();
},
),
FilledButton(
child: const Text('Usa Valore Calcolato'),
onPressed: () {
setState(() {
_superficieController.text = _calculatedArea.toStringAsFixed(2);
});
Navigator.of(context).pop();
},
),
],
);
},
);
}
}
void _submitForm() {
//if (_formKey.currentState!.validate()) {
if (true) {
if (_polygonPoints.length < 3) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Disegna almeno 3 punti per il poligono della vigna.')),
);
return;
}
print('--- Dati Vigna ---');
print('Nome Vigna: ${_nomeVignaController.text}');
print('Località: ${_localitaController.text}');
print('Superficie (ha): ${_superficieController.text}');
print('Coordinate Poligono:');
_polygonPoints.forEach((point) {
print(' Lat: ${point.latitude}, Lng: ${point.longitude}');
});
print('-----------------');
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Dati inviati (simulato)! Controlla la console.')),
);
}
}
@override
Widget build(BuildContext context) {
return ResponsiveGrid(
childrenBuilder: (context, screen) {
return [
ResponsiveGridItem(
crossAxisCellCount: screen.setAxis(12, 12, 12, 12),
child: Container(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
CardWidget(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
'Aggiungi Nuova Vigna',
style: Theme.of(context).textTheme.titleLarge,
),
),
),
const SizedBox(height: 16.0), // Spazio dopo il CardWidget
// *** INIZIO DELLA CORREZIONE ***
Row(
children: [
Expanded( // <--- AVVOLGI IL TextFormField IN UN Expanded
child: TextFormField(
controller: _nomeVignaController, // Collega il controller
decoration: const InputDecoration(
labelText: 'Nome Vigna',
border: OutlineInputBorder(),
prefixIcon: Icon(Icons.grass),
),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Inserisci il nome della vigna';
}
return null;
},
),
),
],
),
const SizedBox(height: 12),
TextFormField(
controller: _localitaController,
decoration: const InputDecoration(
labelText: 'Località',
border: OutlineInputBorder(),
prefixIcon: Icon(Icons.location_on),
),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Inserisci la località';
}
return null;
},
),
const SizedBox(height: 12),
TextFormField(
//controller: superficieController,
keyboardType: TextInputType.number,
decoration: InputDecoration(
labelText: 'Superficie (ettari)',
border: const OutlineInputBorder(),
prefixIcon: const Icon(Icons.area_chart),
suffixIcon: _calculatedArea > 0
? IconButton(
icon: const Icon(Icons.auto_mode, color: Colors.green),
onPressed: _showAreaConfirmationDialog, // Mostra il dialogo di conferma
tooltip: 'Usa area calcolata',
)
: null,
),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Inserisci la superficie';
}
if (double.tryParse(value) == null) {
return 'Inserisci un numero valido';
}
return null;
},
),
// *** FINE DELLA CORREZIONE ***
// Add your form or content here
Row(
children: [
Expanded(
child: VignaMapWidget(
polygonPoints: _polygonPoints,
onMapTap: _handleMapTap,
onClearPolygon: _clearPolygon,
calculatedArea: _calculatedArea,
),
),
],
),
Row(
children: [
Expanded(
child: SizedBox(
width: double.infinity,
child: ElevatedButton.icon(
onPressed: _submitForm,
icon: const Icon(Icons.send),
label: const Text(
'Invia Dati Vigna',
style: TextStyle(fontSize: 18),
),
style: ElevatedButton.styleFrom(
backgroundColor: Colors.green[800],
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(vertical: 15),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
),
),
),
),
],
),
],
),
),
),
];
},
);
}
}