Closed Frozen-Burrito closed 2 years ago
El problema identificado está en la siguiente línea:
// El número de días de registros de hidratación necesarios para calcular
// el progreso.
int daysOfRecords = min(diffBetweenDates.inDays, goal.term.inDays);
Cuando la fecha de inicio de la meta es el mismo día, diffBetweenDates.inDays
produce 0
, porque hay menos de un día de diferencia entre el inicio de la meta y la fecha presente. Esto puede ser solucionado usando max()
para evitar que diffBetweenDates.inDays
sea menor a 1, pero esto solo soluciona parte del problema.
El método getGoalProgressInMl()
usa el método _totalsFromPrevDaysInMl()
de HydrationRecordProvider
para calcular el total de mililitros consumidos para la meta. Como _totalsFromPrevDaysInMl()
usa días, en vez de un rango de fechas específico, consumos de agua que están fuera de los días pero deberían ser incluidos por sus fechas son ignorados.
Posiblemente, la mejor solución es modificar _totalsFromPrevDaysInMl()
para que reciba una beginDate
y un endDate
, haciendo que use un rango de fechas en vez de un número de días.
Podría ser integrado con la funcionalidad de totales semanales (que es usada para la gráfica de consumo diario por semana) pasando DateTime.now().subtract(Duration( days: 7 )).onlyDate
a beginDate
y DateTime.now().onlyDate
a endDate
. También sería necesario considerar el comportamiento actual de daysOffset
Después de revisar con más detalle los widgets GoalSliverList
y _GoalCard
, además del provider HydrationRecordProvider
, llegué a la conclusión de que parte del problema era que getGoalsProgressValuesInMl()
era invocado varias veces, cambiando el resultado del Future
y del FutureBuilder
. Aún así, esto al final producía los resultados correctos, pero la lista de metas no era redibujada.
Solucioné esto obteniendo el progreso de cada meta individual, desde el widget _GoalCard
. Separé la obtención de metas de la obtención del progreso individual de cada meta, para que tuviera una estructura más simple que usando la vieja función getGoalsWithProgress
de GoalSliverList
.
Descripción del Error Si el usuario crea una meta de hidratación con una fecha de inicio del mismo día y luego registra uno o más consumos de agua ese mismo día, la barra de progreso de la meta no refleja la cantidad de agua ingerida en ese día.
Cómo Reproducir Pasos para reproducir el error:
Comportamiento Esperado Todas las metas deberían actualizar su progreso cada vez que la app registra un nuevo consumo de agua. Este cambio debe ser reflejado en la UI y en los datos internos (en la otorgación de recompensas, definición de metas sugeridas, etc.)
Entorno
Contexto Adicional Revisar los rangos de fechas usados para obtener el progreso de una meta, en el método
getGoalProgressInMl()
deHydrationRecordProvider
.