saveChanges function
Implementation
Future<void> saveChanges(
BuildContext context,
Map<String, dynamic> individuo,
Map<String, TextEditingController> controllers,
GlobalKey<FormState> formKey) async {
if (formKey.currentState!.validate()) {
final updatedIndividuo = Map<String, dynamic>.from(individuo);
final changedFields = <String, dynamic>{};
// 1) Identificar los campos que han cambiado en el formulario
controllers.forEach((key, controller) {
if (controller.text != individuo[key]?.toString()) {
updatedIndividuo[key] = controller.text;
changedFields[key] = controller.text;
}
});
// 2) Si no hay cambios, no hacer nada
if (changedFields.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('No se han realizado cambios.')),
);
return;
}
print('Campos modificados: $changedFields');
try {
final dbHelper = DatabaseHelper();
// 3) Guardar el individuo actualizado en la base de datos local
await dbHelper.updateIndividuo(updatedIndividuo);
print('Individuo actualizado en la base de datos local');
// 4) Revisar la conexión a Internet
var connectivityResult = await Connectivity().checkConnectivity();
if (connectivityResult == ConnectivityResult.none) {
// 5a) Sin conexión: guardar en pendientes
await _handleOfflineUpdate(context, dbHelper, updatedIndividuo);
} else {
// 5b) Con conexión: enviar a la API
await _handleOnlineUpdate(
context, dbHelper, updatedIndividuo, changedFields);
}
// 6) Regresar a la pantalla anterior después de guardar
Navigator.pop(context, true);
} catch (error) {
print('Error al actualizar el individuo: $error');
await notificationHelper.sendNotification(
'Error', 'Error al actualizar el individuo: $error');
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error al actualizar el individuo: $error')),
);
}
}
}