簡體   English   中英

將流量轉換為實時數據的最佳方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM