newLstMap static method
Retorna la lista de diferencias entre dataOriginal y dataActualizado,
teniendo en cuenta el esquema y las reglas de exclusión/mantenimiento.
Implementation
static List<Map<String, dynamic>> newLstMap({
required Map<String, dynamic> esquema,
required List<dynamic> dataOriginal,
required List<dynamic> dataActualizado,
List<String>? lstKeyExcluir,
List<String>? lstKeyMantener,
List<String>? lstPrefijosExcluir,
}) {
final List<Map<String, dynamic>> diferencias = [];
// Verifica que dataActualizado sea una lista de Map
if (!esUnaListaDeMapas(dataActualizado)) {
FlutterUtilsProvider.logDebug(
'error: dataActualizado no es una lista de mapas válida: $dataActualizado',
);
return diferencias;
}
// Verifica que dataOriginal, si no está vacía, sea una lista de Map
if (dataOriginal.isNotEmpty && !esUnaListaDeMapas(dataOriginal)) {
FlutterUtilsProvider.logDebug(
'error: dataOriginal no es una lista de mapas válida: $dataOriginal',
);
return diferencias;
}
for (final itemDataActualizada in dataActualizado) {
final String idValue = itemDataActualizada[EnvironmentApiRest.id] ?? '';
// final Map<String, dynamic>? original = (dataOriginal.isEmpty)
// ? <String, dynamic>{}
// : dataOriginal.firstWhere(
// <String, Object>(itemDataOriginal) =>
// itemDataOriginal[EnvironmentApiRest.id] == idValue,
// orElse: () => <String, dynamic>{},
// );
final List<Map<String, dynamic>> dataOriginalMap =
_convertirListaDynamic(dataOriginal);
/// Busca el item correspondiente en dataOriginal por ID;
/// si no lo encuentra, retorna un mapa vacío (evitamos excepción).
/// Aca no se aplica el OrElse porque puede dar un error al querer tratar
/// un Mapa de tipo <String, Object> como un Map<String, dynamic>.
/// entonces original puede ser null en ese caso cuando se lo trata como
/// parametro en `newMap` se aplica decodeJsonOrJsonOriginal y de esta
/// manera se obtiene el mapa vacio. Map<String, dynamic>.
final original = (dataOriginalMap.isEmpty)
? <String, dynamic>{}
: dataOriginalMap.firstWhere(
(itemDataOriginal) =>
itemDataOriginal[EnvironmentApiRest.id] == idValue,
orElse: () => <String, dynamic>{},
);
if (kDebugMode) {
FlutterUtilsProvider.logDebug(
'Buscando diferencias en el ítem de arrayObject: '
'Original: $original - Actualizado: $itemDataActualizada',
);
}
/// Ajuste de exclusiones dinámicas:
/// si el id comienza con `temp_`, se excluye la clave `id`.
List<String>? lstKeyExcluirFinal;
if (idValue.startsWith(EnvironmentApiRest.prefijoTemp)) {
lstKeyExcluirFinal = [EnvironmentApiRest.id];
}
if (lstKeyExcluir != null) {
lstKeyExcluirFinal ??= [];
lstKeyExcluirFinal.addAll(lstKeyExcluir);
}
final Map<String, dynamic> diferencia = newMap(
esquema: esquema,
mapaOriginal: decodeJsonOrJsonOriginal(original),
mapaActualizado: decodeJsonOrJsonOriginal(itemDataActualizada),
lstKeyExcluir: lstKeyExcluirFinal,
lstKeyMantener: lstKeyMantener,
lstPrefijosExcluir: lstPrefijosExcluir,
);
FlutterUtilsProvider.logDebug(
'Resultado de diferencias en ítem de arrayObject: $diferencia',
);
if (diferencia.isNotEmpty) {
// Si no comienza con `temp_`, mantenemos el `id`.
if (!idValue.startsWith(EnvironmentApiRest.prefijoTemp)) {
diferencia[EnvironmentApiRest.id] = idValue;
}
diferencias.add(Map<String, dynamic>.from(diferencia));
}
}
return diferencias;
}