diff --git a/lib/src/models/domicilio_model.dart b/lib/src/models/domicilio_model.dart index 9e1bfef..b246c81 100644 --- a/lib/src/models/domicilio_model.dart +++ b/lib/src/models/domicilio_model.dart @@ -1,15 +1,48 @@ +import 'dart:convert'; + class Domicilio { final String nombre; final String colonia; final String calle; final String numero; + final String id; Domicilio({ required this.nombre, required this.colonia, required this.calle, required this.numero, + required this.id, }); String get direccionCompleta => '$colonia, $calle $numero'; + + Map toJson() => { + 'nombre': nombre, + 'colonia': colonia, + 'calle': calle, + 'numero': numero, + 'id': id, + }; + + factory Domicilio.fromJson(Map json) { + return Domicilio( + nombre: json['nombre'], + colonia: json['colonia'], + calle: json['calle'], + numero: json['numero'], + id: json['id'], + ); + } + + static String encode(List domicilios) { + return json.encode( + domicilios.map((d) => d.toJson()).toList(), + ); + } + + static List decode(String domiciliosString) { + final List data = json.decode(domiciliosString); + return data.map((item) => Domicilio.fromJson(item)).toList(); + } } \ No newline at end of file diff --git a/lib/src/views/domicilios.dart b/lib/src/views/domicilios.dart index e3c9fda..2907179 100644 --- a/lib/src/views/domicilios.dart +++ b/lib/src/views/domicilios.dart @@ -1,6 +1,9 @@ +// domicilios.dart import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'rutas.dart'; -import '../models/domicilio_model.dart'; // Ruta corregida a src/models/ +import '../models/domicilio_model.dart'; +import 'dart:math'; class DomiciliosView extends StatefulWidget { const DomiciliosView({super.key}); @@ -11,6 +14,7 @@ class DomiciliosView extends StatefulWidget { class _DomiciliosViewState extends State { List domicilios = []; + bool _isLoading = true; // Controladores para el formulario final TextEditingController nombreController = TextEditingController(); @@ -18,6 +22,12 @@ class _DomiciliosViewState extends State { final TextEditingController calleController = TextEditingController(); final TextEditingController numeroController = TextEditingController(); + @override + void initState() { + super.initState(); + _cargarDomicilios(); + } + @override void dispose() { nombreController.dispose(); @@ -27,6 +37,41 @@ class _DomiciliosViewState extends State { super.dispose(); } + // Cargar domicilios guardados + Future _cargarDomicilios() async { + try { + final prefs = await SharedPreferences.getInstance(); + final String? domiciliosString = prefs.getString('domicilios'); + + if (domiciliosString != null && domiciliosString.isNotEmpty) { + setState(() { + domicilios = Domicilio.decode(domiciliosString); + _isLoading = false; + }); + } else { + setState(() { + _isLoading = false; + }); + } + } catch (e) { + print('Error al cargar domicilios: $e'); + setState(() { + _isLoading = false; + }); + } + } + + // Guardar domicilios en SharedPreferences + Future _guardarDomicilios() async { + try { + final prefs = await SharedPreferences.getInstance(); + final String domiciliosString = Domicilio.encode(domicilios); + await prefs.setString('domicilios', domiciliosString); + } catch (e) { + print('Error al guardar domicilios: $e'); + } + } + void _mostrarDialogoAgregar() { // Limpiar controladores nombreController.clear(); @@ -99,7 +144,7 @@ class _DomiciliosViewState extends State { ), ), onPressed: () { - Navigator.pop(context); // Cerrar diálogo sin guardar + Navigator.pop(context); }, child: const Text( 'Cancelar', @@ -165,7 +210,7 @@ class _DomiciliosViewState extends State { ); } - void _agregarDomicilio() { + void _agregarDomicilio() async { // Validar que todos los campos estén llenos if (nombreController.text.isEmpty || coloniaController.text.isEmpty || @@ -180,12 +225,13 @@ class _DomiciliosViewState extends State { return; } - // Crear nuevo domicilio + // Crear nuevo domicilio con ID único final nuevoDomicilio = Domicilio( nombre: nombreController.text, colonia: coloniaController.text, calle: calleController.text, numero: numeroController.text, + id: DateTime.now().millisecondsSinceEpoch.toString(), // ID único ); // Agregar a la lista @@ -193,6 +239,9 @@ class _DomiciliosViewState extends State { domicilios.add(nuevoDomicilio); }); + // Guardar en SharedPreferences + await _guardarDomicilios(); + // Cerrar el diálogo Navigator.pop(context); @@ -206,7 +255,7 @@ class _DomiciliosViewState extends State { ); } - void _eliminarDomicilio(int index) { + void _eliminarDomicilio(int index) async { showDialog( context: context, builder: (BuildContext context) { @@ -219,10 +268,14 @@ class _DomiciliosViewState extends State { child: const Text('Cancelar'), ), TextButton( - onPressed: () { + onPressed: () async { setState(() { domicilios.removeAt(index); }); + + // Guardar cambios en SharedPreferences + await _guardarDomicilios(); + Navigator.pop(context); ScaffoldMessenger.of(context).showSnackBar( const SnackBar( @@ -270,7 +323,13 @@ class _DomiciliosViewState extends State { ), // Contenido Expanded( - child: domicilios.isEmpty + child: _isLoading + ? const Center( + child: CircularProgressIndicator( + color: colorAzul, + ), + ) + : domicilios.isEmpty ? Center( child: Column( mainAxisAlignment: MainAxisAlignment.center,