Muy mal a partir de 2 clases atrás comete errores muy tontos que si no tienes la mínima experiencia te puede frustrar por que no sabes como manejar tantos errores y pierdes mucho tiempo tratando de encontrar donde trae tanto problema
No es necesario utilizar el useCallback y el useFocusEffect, con agregar el pokemons a la condición de useEffect es suficiente para que se recargue la vista al añadir o eliminar un favorito.
El copiar y pegar código, sigue el estandard "STUPID". Por favor, no lo hagan. Cuando puedan, lean acerca de clean code
Hola, muy bueno este curso pero creo que debiste explicar porque useFocusEffect y usecallback hace que se soluciona el problema de los favoritos
Hola! Esto es más una cuestión de teoría, pero te dejo la explicación acá:
.
Cuando usamos un useEffect buscamos que una acción se ejecute al renderizar nuestro código una o multiples veces según las dependencias que este hook está observando. El problema por el que no aparecen nuestros favoritos actualizados es que la Screen solo se renderiza una vez, luego cuando cambiamos de screen y volvemos a ella cambia es el "foco", es decir, dejamos de enfocar esa screen o la volvemos a enfocar, pero el renderizado ya ocurrió. Esto permite mantener buen performance en la app... Pero nos trae problemas como este.
.
¿Entonces a qué viene el useFocusEffect?
Pues este hook de react navigation justamente nos ayuda a activar una sección de código tal como lo haría un useEffect durante el renderizado, pero cada vez que una pantalla sea enfocada en nuestra aplicación. De este modo solventamos el problema de no tener nuestro favoritos actualizados... Pero ahora hay otro problema.
.
useFocusEffect es un hook que recibe un callback para su ejecución, por esta razón un useEffect no nos serviría en este caso, ya que al tratar de asignarlo a una constante dentro del useFocusEffect se rompería (puedes probarlo poniendo un useEffect dentro del useFocusEffect).
.
¿Pero por qué usar useCallback en lugar de cualquier callback creado por nosotros?
Performance y practicidad :) no nos cuesta nada agregarlo, y el hook de useCallback nos permite decirle al código "hey, que te voy a usar muchas veces, entonces no me re-renderices todo si en el fondo la información no ha cambiado". Y esto es muy útil en términos de performance, esto ocurre porque el hook de useCallback tiene un comportamiento de "memoización", puedes leer más al respecto acá y acá.
Tengo un problema, tal vez le pasa a alguien más, pero al dar click al botón de favoritos dentro de un pokemon, se agrega 2 veces a la lista, saludos.
Hola!
Podrías compartir tu repositorio para ver qué es lo que puede estar pasando?
Por mi parte lo que hice para no repetir tanto código, fue crear una función de getDetailsPk en Utils para hacer hacer el get de los detalles de cada pokemón y devolverlo en un array con lo que necesito.
Lo que hace es si pokemon . name
existe hace el get con el name (esto en el caso del pestaña de pokedex), sino usa el id del pokemon que recibe de la lista de favoritos.
Ya en la pantalla de favoritos solo hago esto para mostrar la tarjeta de cada pokemón ^^
Les dejo mis cambios para esta clase, permite:
1. Guardar lista de pokemons con toda su data en la memoria del dispositivo.
2. Permite eliminar la data de todos los favoritos al mismo tiempo.
3. Permite eliminar toda la Data de un sólo pokemon de la memoria haciendo toggle con el botón de "me gusta".
4. Pone un texto distinto si no hay pokemons en la memoria.
A Sept de 2025, agrego botón y lógica para eliminar a todos los favoritos:
Este comment es a Sept de 2025, les dejo un MR donde se guarda la lista de pokemons en un store y además remueve los duplicados de dicha store:
Esta muy mal hecho copiar y pegar código sin explicar las diferencias de usar un hook u otro en este caso.
creo que ir y ejecutar en un for la petición no es lo mejor, por temas de recursos, si hay 100 favoritos, no sería bueno hacer 1.000 peticiones, lo mejor es que cuando tengamos nuestra propia api recibir el array de favoritos y crear una consulta que devuelva todos los valores.
El problema ahí es de la construcción de la API que no es nuestra, este si sale del scope del curso. Efectivamente cuando tengas tu API puedes hacer un query simple a DB de los parametros que esten incluidos en el array.