Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

328
Vistas
¿Cómo obtener el valor de un Flujo fuera de una rutina?

¿Cómo puedo obtener el valor de un Flujo fuera de una corrutina de manera similar a LiveData?

 // Suspend function 'first' should be called only from a coroutine or another suspend function flowOf(1).first()
 // value is null flowOf(1).asLiveData().value
 // works MutableLiveData(1).value

Contexto

Estoy evitando LiveData en la capa de repositorio a favor de Flow . Sin embargo, necesito establecer, observar y recopilar el valor para el consumo inmediato. El último es útil para fines de autenticación en un Interceptor OkHttp3.

over 4 years ago · Hanz Gallego
4 Respuestas
Responde la pregunta

0

Bueno... lo que estás buscando no es realmente para lo que es Flow . Flow es solo una corriente. No es un titular de valor, por lo que no hay nada que recuperar.

Entonces, hay dos vías principales para bajar, dependiendo de lo que necesite su interceptor.

Quizás su interceptor pueda vivir sin los datos del repositorio. IOW, usará los datos si existen, pero de lo contrario, el interceptor puede continuar. En ese caso, puede hacer que su repositorio emita un flujo, pero también puede mantener un caché de "valor actual" que su interceptor puede usar. Eso podría ser a través de:

  • BroadcastChannel
  • LiveData
  • una propiedad simple en el repositorio que actualizas internamente y expones como un val

Sin embargo, si su interceptor necesita los datos, entonces ninguno de ellos funcionará directamente, porque todos darán como resultado que el interceptor se vuelva null si los datos aún no están listos. Lo que necesitaría es una llamada que pueda bloquear, pero que quizás evalúe rápidamente si los datos están listos a través de algún tipo de caché. Los detalles de eso variarán mucho según la implementación del repositorio y lo que está suministrando el Flow en primer lugar.

over 4 years ago · Hanz Gallego Denunciar

0

Puedes hacerlo

 val flowValue: SomeType runBlocking(Dispatchers.IO) { flowValue = myFlow.first() }

Sí, no es exactamente para lo que se hizo Flow.

Pero no siempre es posible hacer que todo sea asincrónico y, de hecho, es posible que ni siquiera siempre sea posible 'simplemente hacer un método sincrónico'. Por ejemplo, las versiones actuales de Datastore (que se supone que reemplazan las preferencias compartidas en Android) solo exponen Flow y nada más. Lo que significa que muy fácilmente entrará en tal situación, dado que ninguno de los métodos de Ciclo de vida de Actividades o Fragmentos son corrutinas.

Si puede evitarlo, siempre debe llamar a las corrutinas desde las funciones de suspensión y evitar hacer llamadas de runBlocking . Muchas veces funciona así. Pero no es una forma segura que funcione todo el tiempo. Puede introducir interbloqueos con runBlocking .

over 4 years ago · Hanz Gallego Denunciar

0

Podrías usar algo como esto:

 fun <T> SharedFlow<T>.getValueBlockedOrNull(): T? { var value: T? runBlocking(Dispatchers.Default) { value = when (this@getValueBlockedOrNull.replayCache.isEmpty()) { true -> null else -> this@getValueBlockedOrNull.firstOrNull() } } return value }
over 4 years ago · Hanz Gallego Denunciar

0

Puede usar MutableStateFlow y MutableSharedFlow para emitir los datos de coroutine y recibir los datos dentro de Activity/Fragment . MutableStateFlow se puede utilizar para la gestión de estado. Requiere un valor predeterminado cuando se inicializa. Mientras que MutableSharedFlow no necesita ningún valor predeterminado.

Pero, si no desea recibir un flujo de datos, (es decir) su llamada a la API envía datos solo una vez, puede usar la función de suspensión dentro del alcance de la rutina y la función realizará la tarea y devolverá el resultado como una llamada de función síncrona.

over 4 years ago · Hanz Gallego Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda