feat: adress save in localstorage

This commit is contained in:
imlildud
2026-05-22 21:00:22 -06:00
parent 04d56e18c6
commit 7cf5f13d88
2 changed files with 99 additions and 7 deletions

View File

@@ -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<String, dynamic> toJson() => {
'nombre': nombre,
'colonia': colonia,
'calle': calle,
'numero': numero,
'id': id,
};
factory Domicilio.fromJson(Map<String, dynamic> json) {
return Domicilio(
nombre: json['nombre'],
colonia: json['colonia'],
calle: json['calle'],
numero: json['numero'],
id: json['id'],
);
}
static String encode(List<Domicilio> domicilios) {
return json.encode(
domicilios.map((d) => d.toJson()).toList(),
);
}
static List<Domicilio> decode(String domiciliosString) {
final List<dynamic> data = json.decode(domiciliosString);
return data.map((item) => Domicilio.fromJson(item)).toList();
}
}

View File

@@ -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<DomiciliosView> {
List<Domicilio> domicilios = [];
bool _isLoading = true;
// Controladores para el formulario
final TextEditingController nombreController = TextEditingController();
@@ -18,6 +22,12 @@ class _DomiciliosViewState extends State<DomiciliosView> {
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<DomiciliosView> {
super.dispose();
}
// Cargar domicilios guardados
Future<void> _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<void> _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<DomiciliosView> {
),
),
onPressed: () {
Navigator.pop(context); // Cerrar diálogo sin guardar
Navigator.pop(context);
},
child: const Text(
'Cancelar',
@@ -165,7 +210,7 @@ class _DomiciliosViewState extends State<DomiciliosView> {
);
}
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<DomiciliosView> {
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<DomiciliosView> {
domicilios.add(nuevoDomicilio);
});
// Guardar en SharedPreferences
await _guardarDomicilios();
// Cerrar el diálogo
Navigator.pop(context);
@@ -206,7 +255,7 @@ class _DomiciliosViewState extends State<DomiciliosView> {
);
}
void _eliminarDomicilio(int index) {
void _eliminarDomicilio(int index) async {
showDialog(
context: context,
builder: (BuildContext context) {
@@ -219,10 +268,14 @@ class _DomiciliosViewState extends State<DomiciliosView> {
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<DomiciliosView> {
),
// Contenido
Expanded(
child: domicilios.isEmpty
child: _isLoading
? const Center(
child: CircularProgressIndicator(
color: colorAzul,
),
)
: domicilios.isEmpty
? Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,