【问题标题】:best way to convert flow to live data将流量转换为实时数据的最佳方法
【发布时间】:2022-01-06 12:40:05
【问题描述】:

我正在从 Unsplash api 实现搜索,数据将在搜索的基础上更新

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,Flow<PagingData<UnsplashPhoto>>>(){
    override suspend fun buildUseCase(params: String): Flow<PagingData<UnsplashPhoto>> {
        return repository.getSearchResult(params)
    }
}

FetchPhotoUseCase 在域层中。它返回流,因此我将流更改为 switchmap lambda 中的实时数据。

我做得对还是有更好的方法来实现它..

编辑

我已经更新了我的代码,可以在下面的两个调度程序上工作..

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)
                }
            )
        }
    }

【问题讨论】:

    标签: android kotlin kotlin-coroutines android-livedata kotlin-flow


    【解决方案1】:

    有一个方便的方法asLiveData,它已经实现了你所写的:

    val photos = currentQuery.switchMap { queryString ->
        fetchPhotoUseCase.execute(queryString).asLiveData(Dispatchers.Main)
    }
    

    依赖使用asLiveData()扩展函数:

    def lifecycle_version = "2.4.0"
    
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
    

    【讨论】:

    • 如果我想在 Dispatcher.IO 中执行 Use case(flow) 并在 Dispatcher.Main 中执行 liveData 来填充 UI 线程(我的意思是一个列表)
    • 也可以查看我的编辑@Sergey
    • asLiveData(Dispatchers.Main)
    • val test = categoryUseCase.execute().flowOn(Dispatchers.IO).asLiveData(Dispatchers.Main) 表示挂起函数只能从协程或其他挂起函数中调用
    • 我也试过像 val test = viewModelScope.launch { categoryUseCase.execute().flowOn(Dispatchers.IO).asLiveData(Dispatchers.Main) } 但它返回一个工作。我怎么能从它返回一个 liveData
    猜你喜欢
    • 2022-12-20
    • 2011-01-24
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多