Frozen-Burrito / hydrate-app

Repositorio para la app de apoyo de la botella hydrate, desarrollada con Flutter.
2 stars 0 forks source link

[BUG] El progreso de hidratación no se muestra cuando una meta fue creada el mismo día #26

Closed Frozen-Burrito closed 2 years ago

Frozen-Burrito commented 2 years ago

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:

  1. Crear una meta con el día de hoy como fecha de inicio.
  2. Regresar a la vista principal. Observar que se muestra la meta, pero la barra de progreso está vacía.
  3. Registrar un nuevo consumo de agua ese mismo día.
  4. En la vista principal, la barra de progreso sigue estando vacía.

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() de HydrationRecordProvider.

Frozen-Burrito commented 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.

Frozen-Burrito commented 2 years ago

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

Frozen-Burrito commented 2 years ago

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.