在特定用例中,我正在呼叫存盤庫以獲取 Flow 形式的資料。
它的型別是:
Flow<Resource<List<Location>>>
在哪里:
資源是包裝類:
sealed class Resource<T>(val data: T? = null, val message: String? = null) { class Loading<T>(data: T? = null): Resource<T>(data) class Success<T>(data: T?): Resource<T>(data) class Error<T>(message: String, data: T? = null): Resource<T>(data, message)}位置是我的資料模型類
每個位置都有自己的屬性,如型別。當用戶切換到型別為酒店的部分時,用例方法被觸發,api 呼叫被執行,我正在過濾串列,以便它只包含所需的專案。
然而,問題是過濾機制不起作用。
return repository.getLocations()
.onEach { result ->
if (result.data != null) {
when (locationType) {
is LocationType.All -> result.data
is LocationType.Hotel -> result.data.filter { it.type == "Hotel" }
is LocationType.Explore -> result.data.filter { it.type == "Explore" }
is LocationType.Active -> result.data.filter { it.type == "Active" }
is LocationType.Restaurant -> result.data.filter { it.type == "Restaurant" }
}
}
}
盡管使用過濾器進行過濾,但最終串列并未更改onEach
更新
存盤庫呼叫的回傳型別是:
Flow<Resource<List<Location>>>
uj5u.com熱心網友回復:
filter不會就地過濾串列。它回傳串列的過濾副本。
onEach在您的 Flow上使用也沒有意義。這只是創建一個新的 Flow,onEach當它被收集時,它將對每個發出的專案執行操作。由于您是從這個函式回傳,也許您只需要 Flow 中的第一項,在這種情況下,您應該在其上使用該first()函式,然后處理回傳的值。
您需要一次性創建過濾副本。然后,您可以將該過濾后的副本放回新Success實體中以回傳。
val result repository.getLocations().first()
if (result !is Success<List<Location>>) {
return result
}
val filteredData = result.data?.filter {
it.type == when (locationType) {
is LocationType.All -> it.type
is LocationType.Hotel -> "Hotel"
is LocationType.Explore -> "Explore"
is LocationType.Active -> "Active"
is LocationType.Restaurant -> "Restaurant"
}
}
return Success(data = filteredData)
旁注,您錯過了使用密封類的要點。由于您將所有可能的屬性都放在父類中,因此將其密封并為其提供子類是沒有意義的——它可以再擁有一個屬性來表示它表示加載、成功或錯誤。現在data,message即使您已經檢查了子型別,您也必須處理可空和錯誤。使用密封類與單個類的重點是避免必須使這些類可以為空。您的父類不應定義任何屬性。Loading 類不需要屬性,因此可以是object. 您的 Success 類可以有一個不可為 null 的data屬性,而 Error 類可以有一個不可為 null 的message屬性。Success 和 Error 類可以是data類,所以它們更容易比較。它應該是這樣的:
sealed class Resource<T> {
object Loading<T>: Resource<T>()
data class Success<T>(val data: T): Resource<T>()
data class Error<T>(message: String): Resource<T>()
}
uj5u.com熱心網友回復:
如果你想過濾結果,你應該直接過濾它。在onEach這里不需要。你可以這樣做。
val result = repository.getLocations()
return if(result.data!=null){
result.data.filter { item ->
when (locationType) {
is LocationType.Hotel -> item.type == "Hotel"
is LocationType.Explore -> item.type == "Explore"
is LocationType.Active -> item.type == "Active"
is LocationType.Restaurant ->item.type == "Restaurant"
else -> true
}
}
}else{
emptyList()
}
這只是為了解釋,您可以修改并使其更多kotlinify。
LocationType這里是一個常量,所以你可以直接做這樣的事情,你不需要在when這里。
val result = repository.getLocations()
return if(result.data!=null){
result.data.filter { item ->
item.type == locationType
}
}else{
emptyList()
}
要回傳 Flow,您可以回傳如下內容。
result.map { it.data.filter { item -> item.type == locationType } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/376203.html
標籤:安卓 科特林 收藏 流动 kotlin-flow
