Тёмный

🔹 StateFlow, el sustituto natural de LiveData 

DevExpert - Programación Android y Kotlin
Подписаться 47 тыс.
Просмотров 8 тыс.
50% 1

🎁Te cuento cómo aprender todo sobre Kotlin en este training gratuito:
👉 bit.ly/2Lni6gV
Llevamos una serie de capítulos dedicados a Flow, donde hemos visto desde los conceptos básicos de Flow hasta cómo usar Flow en un ejemplo real.
Incluso hemos visto cómo Flow se integra con Room.
Pero justo en este artículo anterior nos encontramos un problema: no podemos lanzar corrutinas a lo loco cuando se actualiza el scroll del adapter, porque nos podemos encontrar con que se lanza la misma petición a la API antes de que la anterior haya acabado.
Lo ideal sería tener una cola de peticiones, donde hasta que no acabe la anterior no se procese la siguiente. Pero... ¡esto es justo un Flow!
Si recuerdas, hablamos de que los flows emiten sus valores en secuencia, y por tanto la recolección también se hace en secuencia: hasta que no acaba de recolectarse un valor, no se genera el siguiente.
Aquí es donde entra en juego StateFlow, un Flow dedicado que te va a resultar familiar.
Espero que os guste ¡Un abrazo!
👉 Si quieres el código de este mini-curso, puedes verlo en mi GitHub: github.com/antoniolg/flow-wor...
//////////////////////////////////////////////////////////////////////////////////////////
Si aún no te decides sobre si Kotlin es el lenguaje que deberías aprender, te animo a que te apuntes a mi masterclass gratuita donde te hablo sobre:
1️⃣ La situación de Kotlin en el mercado y la oportunidad de aprenderlo
2️⃣ Cómo empezar con Kotlin desde cero en pocos minutos
3️⃣ Cómo Kotlin puede hacerte mucho más productivo
🎁 Apúntate aquí: bit.ly/2Lni6gV
/////////////////////////////////////////////////////////////////////////////////////////////
➡➡ SÍGUEME EN OTRAS REDES SOCIALES ⬅⬅
👉 Linkedin: www.linkedin.com/in/antoniolg
👉 Instagram: / devexperto
👉 Twitter: / devexperto1
Únete a la Comunidad de DevExperto en Discord 👉 devexperto.com/comunidad
/////////////////////////////////////////////////////////////////////////////////////////////
📌 SÍGUEME EN RU-vid:
➡➡ Suscríbete: devexperto.com/youtube
//////////////////////////////////////////////////////////////////////////////////////////
🎬🎬 ARTÍCULOS Y VÍDEOS RELACIONADOS: 🎬🎬
✅ Programación REACTIVA 🔹 ¿Qué es? La explicación MÁS SENCILLA
• Programación REACTIVA ...
////////////////////////////////////////////////////////////////////////////////////////////////
Si te ha gustado el vídeo de hoy dame apoyo con un ❤ LIKE, deja un 💬 comentario/ duda y 🥇 SUSCRÍBETE si aún no lo has hecho! Nos vemos en el próximo vídeo!
Antonio Leiva
💻 www.devexperto.com

Опубликовано:

 

6 янв 2021

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 36   
@camilohernandezruiz2776
@camilohernandezruiz2776 Год назад
Una actualización: ahora lifecycleScope.launchWhenX está obsoleto, en su lugar deben usar lifecycle.launch{ repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.spinner.collect {} } } ¿Por qué? Porque lifecycleScope sigue recolectando los valores del flow aún cuando la activity está en background (estado Stopped), lo que puede inundar tu memoria. Sin embargo, con lifecycle & repeatOnLifecycle son seguras de llamar porque tienen en cuenta el ciclo de vida de la activity.
@devexpert_io
@devexpert_io Год назад
Así es, muchísimas gracias por el comentario.
@devexpert_io
@devexpert_io 3 года назад
🎁 Si aún no te decides sobre si Kotlin es el lenguaje que deberías aprender, te animo a que te apuntes a mi masterclass gratuita 👉 bit.ly/3nmCbBm
@Palettha23
@Palettha23 2 года назад
Woah! Hace años (2016) 🥺 aprendí a programar contigo en tu curso de Udemy, gracias por compartir tanto y por seguir compartiendo a esta comunidad. Te reconocí por la voz y ahora que me fui a tu git recordé tu nombre 🙌🏼 (woah si me da nostalgia 🥲)
@devexpert_io
@devexpert_io 2 года назад
Gracias! Aunque nunca publiqué ninguno de mis cursos en Udemy 😁
@Palettha23
@Palettha23 2 года назад
@@devexpert_io haha sí cierto! Ya vi y fue con Javier Villena pero entonces algo aprendí contigo en el camino porque tu nombre me suena mucho. Igual muchas gracias porque el uso de flow me enreda! Gracias por tu tiempo.
@devexpert_io
@devexpert_io 2 года назад
@@Palettha23 Muchas gracias, un placer poder ayudaros en lo que pueda! 😀
@johnalejandrogarciaarias9756
@johnalejandrogarciaarias9756 3 года назад
Hola Antonio! Como siempre aportando excelente contenido. Te quería preguntar ¿tienes algún video en donde expliques por qué usar flow - stateFlow en vez de liveData?. Saludos! 🤗
@devexpert_io
@devexpert_io 3 года назад
Sobre el porqué no tengo ninguno. Pero te diría que si no usas corrutinas ni flows en tus proyectos, tires por LiveData, en caso contrario ya StateFlow. Mira, aquí hablan más sobre el tema, aunque aún no he tenido mucho tiempo de verlo: medium.com/androiddevelopers/migrating-from-livedata-to-kotlins-flow-379292f419fb
@johnalejandrogarciaarias9756
@johnalejandrogarciaarias9756 3 года назад
@@devexpert_io Mil gracias!
@i12capea
@i12capea 3 года назад
Buen vídeo, ya lo estoy aplicando en mi proyecto personal. ¿Es necesario hacer algo en onStopped o similar para cancelar el flujo? LiveData se supone que lo hace por estar vinculado al ciclo de vida, pero StateFlow no ¿verdad? Un saludo!
@devexpert_io
@devexpert_io 3 года назад
Se supone que lo hace si días launchWhenStarted. Tengo alguna duda porque en la documentación de Google pone como 2 warnings de que hay que tener cuidado con eso. Pero en particular StateFlow creo que funciona sin problema y que con los que puede haber algún problema es con los Flows normales
@nonofce
@nonofce 3 года назад
Excelente Antonio, gracias. He visto que StateFlow tiene un hermano mayor, SharedFlow, ¿algun criterio de cuando usar uno u otro? ¿Que aporta StateFlow sobre SharedFlow?
@devexpert_io
@devexpert_io 3 года назад
SharedFlow me lo tengo que estudiar todavía. Pero es lo más parecido a un bus de eventos, cualquiera se puede conectar en cualquier momento y recibe los valores que se emitan a partir de ese momento. Se puede también definir el buffer de valores antiguos que almacena. Se diferencia de un Flow normal en que cuando te conectas a un Flow recibes todos los valores desde el principio de la cadena, no solo los nuevos que recibas.
@nonofce
@nonofce 3 года назад
@@devexpert_io Perfecto Antonio, muchas gracias.
@albertmartorellgarcia8528
@albertmartorellgarcia8528 3 года назад
Hola Antonio. Cómo gestionamos el caso en que, por ejemplo, al entrar el usuario en una pantalla se carga una lista de elementos y se produce un error y mostramos un mensaje? Este mensaje solo se tiene que enseñar una vez, o sea que si después del error rotamos la pantalla dicho mensaje no se tiene que volver a mostrar. Con LiveData lo solucionamos con un wrapper que determina si ese evento ya se ha consumido o no, para mostrar o no dicho mensaje. Gracias!
@devexpert_io
@devexpert_io 3 года назад
Pues la verdad que aún no me lo he planteado. Quizá serviría el SharedFlow para eso pero me lo tengo que estudiar
@nonofce
@nonofce 3 года назад
Quizas sea porque al crearse nuevamente la Activity al rotar la pantalla se crea un nuevo subscriptor al StateFlow, y como este siempre emite el ultimo valor obtienes el mismo mensaje en el collector. MutableSharedFlow tiene un metodo "resetReplayCache" que quizas sirva. kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-mutable-shared-flow/reset-replay-cache.html
@alvarogarnett
@alvarogarnett 3 года назад
Es una cuestión muy interesante y que espero que Antonio trate más adelante, yo he encontrado la solución utilizando SharedFlow en vez de StateFlow. Ya que está pensado para emitir eventos una única vez, por lo que el problema se soluciona (aunque también se puede configurar a tu gusto con el parámetro replay). Pero no me convence del todo porque cada vez que se quiera realizar un emit() se debe realizar dentro de una coroutine obligatoriamente y habrá casos en los que no se requiera el uso de ellas. Antonio si encuentras alguna manera de realizar con StateFlow el comportamiento de un SingleLiveEvent sería un gran acierto! O a lo mejor el planteamiento es erróneo y no está pensado para ello StateFlow
@devexpert_io
@devexpert_io 3 года назад
Se me había olvidado esto! Le echo un ojo
@monkycheaky4680
@monkycheaky4680 3 года назад
Excelente video.. solo tengo una duda, livedata conoce el ciclo de vida, pero y stateflow?
@devexpert_io
@devexpert_io 3 года назад
StateFlow no, tiene que conocerlo el contexto de corrutina en el que se ejecuta. Por eso hay que hacer el "launchWhenStarted", e incluso con esto hay algún pequeño caso que se escapa. De esto haré otro vídeo pronto.
@johnfriend2010
@johnfriend2010 Год назад
no encuentro ese video donde dice q dava problemas con livedata
@devexpert_io
@devexpert_io Год назад
A qué te refieres?
@mauridom
@mauridom 2 года назад
Pregunta fuera de contexto, ¿qué tema usas para Android Studio? Gracias!
@devexpert_io
@devexpert_io 2 года назад
Buenas! Uso Darcula, el oscuro que viene por defecto en el IDE
@samuelcandelaperal3515
@samuelcandelaperal3515 Год назад
Hola, en el caso del collect, si yo el valor por defecto lo tengo en un ViewModel y luego en otro Fragment, instancio el viewmodel y observo el MutablestateFlow, el cual he cambiado su valor al hacer un .launch en el viewmodel, emitiendo asi, su nuevo valor. El problema es que me colecta el valor por defecto, y no el cambiado. Cual seria la forma correcta de hacer esto bien entonces.
@devexpert_io
@devexpert_io Год назад
Ahí suena a que hay algo raro, debería coger siempre el último valor almacenado. Puede que pase por el anterior según lo que ocurra primero, pero siempre debiría emitir el último si lo estás observando correctamente
@samuelcandelaperal3515
@samuelcandelaperal3515 Год назад
@@devexpert_io cuando hago el launch, dentro, es donde cambio el valor de esta variable
@andresandreoli677
@andresandreoli677 Год назад
Muy buen video, me re sirvió este video, pero tengo una consulta, dijiste que la diferencia entre liveData y stateFlow es que esta ultima no esta atado al framework de Android, de tal forma que lo podes implementar en donde quieras, a que te referis con el framework de Android? Saludoss y gracias por estos videos
@devexpert_io
@devexpert_io Год назад
El framework de Android es un conjunto de clases que te permiten crear Apps que luego se compilan para crear un ejecutable que se puede reproducir en dispositivos Android. Imagina que hay una parte de ese código que lo quieres usar por ejemplo para escritorio en un proyecto multiplataforma. Si utilizas LiveData, ese código no se va a poder usar para Desktop porque no estás creando una App Android. Con StateFlow no tienes esa limitación.
@eduartml2266
@eduartml2266 3 года назад
Y yo apenas aprendí livedata 😱😱😱😱😱😱😱😱😱😱😱
@devexpert_io
@devexpert_io 3 года назад
Jejeje esto evoluciona tan rápido...
@felipefranco7444
@felipefranco7444 3 года назад
Hola Antonio creo que se te ha caido la app haciendo scroll.
@devexpert_io
@devexpert_io 3 года назад
A qué te refieres?
@devexpert_io
@devexpert_io 3 года назад
Ah creo que ya sé lo que dices. Es porque venía una película sin carátula, y no tengo ese caso controlado en el código
Далее
🔹Flows en Kotlin: Todo lo que necesitas saber
14:09
Stay on your way 🛤️✨
00:34
Просмотров 8 млн
Dejé de ser FANBOY de APPLE por esta razón...
10:46
🔹 Base de datos reactiva con ROOM y FLOW
12:57
Просмотров 4,6 тыс.
LiveData deprecated? - Full Guide to StateFlow
17:03
Просмотров 53 тыс.