feat: adress save in localstorage
This commit is contained in:
@@ -1,15 +1,48 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
class Domicilio {
|
class Domicilio {
|
||||||
final String nombre;
|
final String nombre;
|
||||||
final String colonia;
|
final String colonia;
|
||||||
final String calle;
|
final String calle;
|
||||||
final String numero;
|
final String numero;
|
||||||
|
final String id;
|
||||||
|
|
||||||
Domicilio({
|
Domicilio({
|
||||||
required this.nombre,
|
required this.nombre,
|
||||||
required this.colonia,
|
required this.colonia,
|
||||||
required this.calle,
|
required this.calle,
|
||||||
required this.numero,
|
required this.numero,
|
||||||
|
required this.id,
|
||||||
});
|
});
|
||||||
|
|
||||||
String get direccionCompleta => '$colonia, $calle $numero';
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
|
// domicilios.dart
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'rutas.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 {
|
class DomiciliosView extends StatefulWidget {
|
||||||
const DomiciliosView({super.key});
|
const DomiciliosView({super.key});
|
||||||
@@ -11,6 +14,7 @@ class DomiciliosView extends StatefulWidget {
|
|||||||
|
|
||||||
class _DomiciliosViewState extends State<DomiciliosView> {
|
class _DomiciliosViewState extends State<DomiciliosView> {
|
||||||
List<Domicilio> domicilios = [];
|
List<Domicilio> domicilios = [];
|
||||||
|
bool _isLoading = true;
|
||||||
|
|
||||||
// Controladores para el formulario
|
// Controladores para el formulario
|
||||||
final TextEditingController nombreController = TextEditingController();
|
final TextEditingController nombreController = TextEditingController();
|
||||||
@@ -18,6 +22,12 @@ class _DomiciliosViewState extends State<DomiciliosView> {
|
|||||||
final TextEditingController calleController = TextEditingController();
|
final TextEditingController calleController = TextEditingController();
|
||||||
final TextEditingController numeroController = TextEditingController();
|
final TextEditingController numeroController = TextEditingController();
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_cargarDomicilios();
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
nombreController.dispose();
|
nombreController.dispose();
|
||||||
@@ -27,6 +37,41 @@ class _DomiciliosViewState extends State<DomiciliosView> {
|
|||||||
super.dispose();
|
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() {
|
void _mostrarDialogoAgregar() {
|
||||||
// Limpiar controladores
|
// Limpiar controladores
|
||||||
nombreController.clear();
|
nombreController.clear();
|
||||||
@@ -99,7 +144,7 @@ class _DomiciliosViewState extends State<DomiciliosView> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
Navigator.pop(context); // Cerrar diálogo sin guardar
|
Navigator.pop(context);
|
||||||
},
|
},
|
||||||
child: const Text(
|
child: const Text(
|
||||||
'Cancelar',
|
'Cancelar',
|
||||||
@@ -165,7 +210,7 @@ class _DomiciliosViewState extends State<DomiciliosView> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _agregarDomicilio() {
|
void _agregarDomicilio() async {
|
||||||
// Validar que todos los campos estén llenos
|
// Validar que todos los campos estén llenos
|
||||||
if (nombreController.text.isEmpty ||
|
if (nombreController.text.isEmpty ||
|
||||||
coloniaController.text.isEmpty ||
|
coloniaController.text.isEmpty ||
|
||||||
@@ -180,12 +225,13 @@ class _DomiciliosViewState extends State<DomiciliosView> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Crear nuevo domicilio
|
// Crear nuevo domicilio con ID único
|
||||||
final nuevoDomicilio = Domicilio(
|
final nuevoDomicilio = Domicilio(
|
||||||
nombre: nombreController.text,
|
nombre: nombreController.text,
|
||||||
colonia: coloniaController.text,
|
colonia: coloniaController.text,
|
||||||
calle: calleController.text,
|
calle: calleController.text,
|
||||||
numero: numeroController.text,
|
numero: numeroController.text,
|
||||||
|
id: DateTime.now().millisecondsSinceEpoch.toString(), // ID único
|
||||||
);
|
);
|
||||||
|
|
||||||
// Agregar a la lista
|
// Agregar a la lista
|
||||||
@@ -193,6 +239,9 @@ class _DomiciliosViewState extends State<DomiciliosView> {
|
|||||||
domicilios.add(nuevoDomicilio);
|
domicilios.add(nuevoDomicilio);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Guardar en SharedPreferences
|
||||||
|
await _guardarDomicilios();
|
||||||
|
|
||||||
// Cerrar el diálogo
|
// Cerrar el diálogo
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
|
|
||||||
@@ -206,7 +255,7 @@ class _DomiciliosViewState extends State<DomiciliosView> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _eliminarDomicilio(int index) {
|
void _eliminarDomicilio(int index) async {
|
||||||
showDialog(
|
showDialog(
|
||||||
context: context,
|
context: context,
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
@@ -219,10 +268,14 @@ class _DomiciliosViewState extends State<DomiciliosView> {
|
|||||||
child: const Text('Cancelar'),
|
child: const Text('Cancelar'),
|
||||||
),
|
),
|
||||||
TextButton(
|
TextButton(
|
||||||
onPressed: () {
|
onPressed: () async {
|
||||||
setState(() {
|
setState(() {
|
||||||
domicilios.removeAt(index);
|
domicilios.removeAt(index);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Guardar cambios en SharedPreferences
|
||||||
|
await _guardarDomicilios();
|
||||||
|
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
const SnackBar(
|
const SnackBar(
|
||||||
@@ -270,7 +323,13 @@ class _DomiciliosViewState extends State<DomiciliosView> {
|
|||||||
),
|
),
|
||||||
// Contenido
|
// Contenido
|
||||||
Expanded(
|
Expanded(
|
||||||
child: domicilios.isEmpty
|
child: _isLoading
|
||||||
|
? const Center(
|
||||||
|
child: CircularProgressIndicator(
|
||||||
|
color: colorAzul,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: domicilios.isEmpty
|
||||||
? Center(
|
? Center(
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
|||||||
Reference in New Issue
Block a user