我正在使用flow{}
builder 呼叫 api,然后emit()
對ViewModel
. 我將流的回傳型別添加為Flow<Resource<List<RemoteData>>>
. 但是,在 emit() 中的某些地方,Android Studio 會拋出
error : Not enough information to infer type variable T
因為emit(Resource.Error(message = "Couldn't reach server, check your internet connection."))
期望型別的值List<RemoteData>
請在下面查看我的Resource
課程
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)
}
我的問題,將發射更改為安全嗎
emit(Resource.Error(
message = "Couldn't reach server, check your internet connection.",
data = null
))
流的回傳型別為Flow<Resource<out List<RemoteData>>>
?
uj5u.com熱心網友回復:
Kotlin 有宣告站點差異。我會放在out
資源類宣告中。那么當你宣告你的型別時Flow<Resource<List<RemoteData>>>
,它就已經是隱式的了out List<RemoteData>
。
此外,您的資源類對我來說看起來很復雜。如果data
是加載的資源,它不應該是 Loading 或 Error 類的一部分。為什么要強制 Loading 和 Error 的每個實體都帶有一個無意義的 nulldata
值?同樣,message
不應成為加載和成功案例的一部分。
我會像這樣將您的密封類重寫為密封介面(因為它在型別之間沒有共享狀態),并利用資料類功能。Loading
可以是一個,object
因為它不需要保持狀態。Loading 和 Error 都可以是Resource<Nothing>
因為型別T
與它們的任何特定實體無關。這樣您就不必在使用它們時不必要地指定型別,例如必須放在陳述句<RemoteData>
之后is Resource
或陳述句is Error
中when
。
sealed interface Resource<out T> {
object Loading: Resource<Nothing>
data class Success<out T>(val data: T): Resource<T>
data class Error(val message: String): Resource<Nothing>
}
這個版本的密封類將更容易使用。編譯器將更寬松地處理您需要指定泛型型別的方式和位置。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/470422.html
上一篇:在XAML中使用泛型:WPF
下一篇:Nestjs創建通用CRUD服務