Esa no es la mejor práctica. Es mejor la que hizo el profe.
¿Por qué no German? A mi me parece lo correcto, el mismo profesor dijo que no tendríamos el cuenta el valor de este estado, es solo para volver a montar el componente.
Otra alternativa, podría ser en la misma función para sumar a los favoritos, negar al estado inicial de si es favorito o no (en mi caso isFavorites):
Creo que se complejizo mucho el código, este es mi servicio
favorites:{asyncgetFavorites(){try{const response =awaitAsyncStorage.getItem(POKEMON_FAV_STORAGE);if(response){let result =JSON.parse(response).filter((item, index)=>JSON.parse(response).indexOf(item)=== index
);return result;}elsereturn[];}catch(error){thrownewError(error);}},asyncdeleteFavorites(id){try{const favorites =awaitthis.getFavorites();const filteredItems = favorites.filter((item)=> item !== id);awaitAsyncStorage.setItem(POKEMON_FAV_STORAGE,JSON.stringify(filteredItems));return filteredItems;}catch(error){thrownewError(error);}},asyncaddToFavorites(id){try{const favorites =awaitthis.getFavorites(); favorites.push(id);awaitAsyncStorage.setItem(POKEMON_FAV_STORAGE,JSON.stringify(favorites));return{message:'Agregado correctamente a favoritos'};}catch(error){thrownewError(error);}},},
Con el onpress y dirigiéndolo a la función de cada caso se puede hacer esto sin necesidad de crear mas funciones, faltaría la lógica de borrarlo de la base de datos que seguramente es en las próximas clases
¿se vuelve a ejecutar o porqué es que el ícono vuelve a cambiar si esta línea no está dentro del useEffect?. Gracias
Si el componente se repinta todo se vuelve a ejecutar, de principio a final.
Hay una opción muy sencilla que es usar props drilling, sube el estado [isFavorite y setIsFavorite] de orden al compente padre y le agregas otra dependencia al useEffect, luego si quieres optimizar renderizado usas memo en los demás componentes, para que no sea afecten, la otra es añadir los favoritos a un contexto y agregar a la dependencia los favoritos, cuando cambien tendrá que renderizar nuevamente.
Lo que yo hice fue modificar la función de addPokemonFavorite y verificar si existía el ID en los favoritos, si existe pues lo saco, sino le hago push y hago set del storage, así: