Frozen-Burrito / hydrate-app

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

[BUG] La cuenta de monedas mostrada por el widget `CoinDisplay` no parece correcta #17

Closed Frozen-Burrito closed 2 years ago

Frozen-Burrito commented 2 years ago

Descripción del Error Durante pruebas de la app, he notado que el número de monedas mostrado por CoinDisplay no es correcto; la mayoría de las veces es "3", un número poco común para haber sido obtenido como recompensa por hidratación o actividad.

Cómo Reproducir Pasos para reproducir el error:

  1. Abrir la aplicación.
  2. Navegar a una pestaña de la vista principal que muestre un CoinDisplay en su appbar superior, como las pestañas de inicio o perfil.
  3. Observar la cantidad extraña.

Comportamiento Esperado El widget debería mostrar una cantidad de monedas más normal, como 0, 50 o lo que haya conseguido el usuario por recompensas.

Entorno

Contexto Adicional El widget CoinDisplay obtiene el número de monedas del usuario al consumir el estado de ProfileProvider. En el widget en sí no parece que haya problemas, entonces es probable que el problema sea 1 de 2 posibilidades:

  1. ProfileProvider o el modelo UserProfile alteran el valor de profile.coins.
  2. En algún punto hubo una actualización de datos de perfil que almacenó el número anormal en la BD. En este caso, habría que revisar todos los puntos donde se guardan los cambios al perfil para asegurar que el problema ya no esté.
Frozen-Burrito commented 2 years ago

Confirmando, el widget CoinDisplay en sí no es el problema.

Frozen-Burrito commented 2 years ago

El número raro no era un problema, pero al investigar las transacciones de monedas en la app, se descubrió un error en el método giveOrTakeCoins(). Esta función estaba implementada de la siguiente manera:

void giveOrTakeCoins(int amount) {

  int newCoinCount = coins + amount;

  if (newCoinCount.abs() > maxCoins) {
    throw RangeError.range(newCoinCount, 0, maxCoins, 'amount');
  }

  _coins = amount;
}

Tenía dos problemas principales, que fueron solucionados:

  1. La cantidad de monedas del perfil _coins era asignada el valor de amount directamente, ignorando por completo el valor de newCoinCount.
  2. La validación para asegurar que newCoinCount fuera menor o igual a maxCoins lanzaba un error de rango. Esto es poco apropiado para el caso de esta app. Un comportamiento más simple, como asignar maxCoins si el incremento es mayor al límite, es mejor.

Además, se usaba el getter coins, en vez de usar el valor directo de _coins.

Esto se arregló dividiendo la función en 2:

void addCoins(int amount) {
  _coins = min(maxCoins, _coins + amount.abs());
}
bool spendCoins(int amount) {

  final hasEnoughCoins = _coins >= amount;

  if (hasEnoughCoins) _coins -= amount.abs();

  return hasEnoughCoins;
}