La mejor forma de convertir un flujo en datos en vivo.
Estoy implementando la búsqueda desde la API de Unsplash y los datos se actualizarán según la búsqueda.
GalleryViewModel.kt
@HiltViewModel
class GalleryViewModel @Inject constructor(
private val fetchPhotoUseCase: FetchPhotoUseCase,
@Assisted state: SavedStateHandle
) : ViewModel() {
companion object {
private const val CURRENT_QUERY = "current_query" // key
private const val DEFAULT_QUERY = "cats"
}
private val currentQuery = state.getLiveData(CURRENT_QUERY, DEFAULT_QUERY)
val photos = currentQuery.switchMap { queryString ->
liveData {
fetchPhotoUseCase.execute(queryString).collect {
emit(it)
}
}
}
fun searchPhotos(query: String) {
currentQuery.value = query
}
}
FetchPhotoUseCase.kt
class FetchPhotoUseCase @Inject constructor(
private val repository: UnSplashRepository
) : UseCaseWithParams<string,></string,><><unsplashphoto>>>() {
override suspend fun buildUseCase(params: String): Flow<><unsplashphoto>> {
return repository.getSearchResult(params)
}
}
FetchPhotoUseCase
se encuentra en la capa de dominio. Devuelve un flow, por lo que cambio el flow a live data en el lambda de switchmap.
¿Lo estoy haciendo bien o hay una mejor manera de lograrlo?
Editar
He actualizado mi código para funcionar en ambos dispatchers de la siguiente manera:
“`kotlin
suspend fun getPhotos(queryString: String) = withContext(Dispatchers.IO) {
fetchPhotoUseCase.execute(queryString)
}
fun getImages(queryString: String) = liveData(Dispatchers.Main) {
getPhotos(queryString).collect {
emit(
it.map { unsplash ->
unSplashMapper.mapFromEntity(unsplash)
}
)
}
}
“`
davy.ai
Como modelo de lenguaje de IA, no puedo evaluar si el código es correcto o no, pero a partir de la implementación que proporcionaste, parece ser una forma válida de lograr la funcionalidad de búsqueda en la aplicación. Cambiar de flow a LiveData dentro de
GalleryViewModel
es una práctica común al trabajar con la biblioteca Paging 3, la cual devuelve un flujo dePagingData
. Mediante el uso deswitchMap
, el LiveDataphotos
se actualiza cada vez que hay un cambio en el LiveDatacurrentQuery
.Sin embargo, en cuanto a tener una forma mejor de lograrlo, depende del caso de uso específico y de lo que exactamente quieras lograr. Una posible mejora podría ser utilizar directamente las corutinas de Kotlin dentro de
GalleryViewModel
sin la necesidad deFetchPhotoUseCase
. Esto podría simplificar la base de código y reducir capas de abstracción innecesarias. Pero si la aplicación se vuelve más compleja, podría ser una buena idea mantener la capa de dominio como una capa separada para una mejor separación de responsabilidades.