[英]best way to convert flow to live data
我正在從 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 中將流更改為livedata
我做得對還是有更好的方法來實現它..
有一個方便的方法asLiveData
,它已經實現了您編寫的內容:
val photos = currentQuery.switchMap { queryString ->
fetchPhotoUseCase.execute(queryString).asLiveData()
}
使用asLiveData()
擴展 function 的依賴項:
def lifecycle_version = "2.4.0"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.