我正在使用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服務
