Android, Kotlin
Tengo los siguientes datos en vivo en mi clase de fuente de datos, no puedo cambiarlos a StateFlow, así que necesito convertirlos a StateFlow en mi modelo de vista
val trackingCatalogInitialLoadLiveData: LiveData<Pair<CatalogTracking, Int>> by lazy { instantSearchDataSourceLiveData.switchMap { instantSearchDataSource -> instantSearchDataSource.initialLoadLiveData } }En My ViewModel tengo lo siguiente, y esta es la parte de la que no estoy seguro si esta es la forma correcta de convertir LiveData a StateFlow:
val trackingCatalogInitialLoadStateFlow: StateFlow<Pair<CatalogTracking, Int>> by lazy { instantSearchDataSourceFactory.trackingCatalogInitialLoadLiveData.asFlow() .stateIn(viewModelScope, SharingStarted.Lazily, Pair(CatalogTracking(), 0)) }Luego, en mi fragmento, solo recopilo los resultados.
coroutineScope.launch { mInstantSearchViewModel.trackingCatalogInitialLoadStateFlow.collect { trackingPair -> // code here }¿Es esta la mejor práctica para convertir LiveData a StateFlow? ¿Algo que deba estar pendiente?
No necesitas usar by lazy . asFlow() y stateIn() crean contenedores simples, por lo que es trivial llamarlos directamente en el inicializador de propiedades.
Como dijo @Joffrey, si usa SharingStarted.Lazily , inspeccionar el value del flujo antes de que tenga colectores mostrará incorrectamente el valor inicial proporcionado. Dado que LiveData está de moda, iniciar su StateFlow de forma perezosa no le compra mucho. La corrutina subyacente que transfiere los valores de LiveData al StateFlow está haciendo una cantidad de trabajo trivial.
Si no necesita inspeccionar el value (en la mayoría de los casos, probablemente no lo necesite), entonces debería estar bien dejarlo como un Flujo frío. Aunque el flujo de asFlow() está frío, el LiveData subyacente todavía está caliente, por lo que cuando los recopiladores del flujo lo recopilen, siempre obtendrán el valor más reciente. La principal diferencia de comportamiento sería si su fuente de datos no proporciona un valor inicial garantizado para LiveData, entonces un StateFlow le brinda la oportunidad de emitir su valor predeterminado proporcionado inicialmente sin esperar a que LiveData publique su primer valor.