[英]Type mismatch. Required: Result<NewsResponse>! Found: Result<Response<NewsResponse>>?
I am developing android app and I have implemented success and failure cases in viemodel class but I am getting following mismatch Type mismatch.我正在开发 android 应用程序,我已经在 viemodel class 中实现了成功和失败案例,但我得到以下不匹配类型不匹配。 Required: Result: Found: Result<Response>必需:结果:找到:结果<响应>
below my NewsViewModel where I have implemented success and failure cases when I am getting data在我的 NewsViewModel 下面,我在获取数据时实现了成功和失败案例
class NewsViewModel(private val repository: NewsRepository) : ViewModel() {
private var _newsResponse= MutableLiveData<Result<NewsResponse>>()
// Expose to the outside world
val news: LiveData<Result<NewsResponse>> = _newsResponse
@UiThread
fun getNews() {
viewModelScope.launch(Dispatchers.IO) {
try {
val response = repository.getNews()
_newsResponse.postValue(Result.success(response))
} catch (ioe: IOException) {
_newsResponse.postValue(Result.Failure("[IO] error please retry", ioe))
} catch (he: HttpException) {
_newsResponse.postValue(Result.Failure("[HTTP] error please retry", he))
}
}
}
}
below my NewsRepository.ktclass在我的 NewsRepository.ktclass 下面
NewsRepository(
private val apiInterface:NewsInterface
){
suspend fun getNews() = apiInterface.getNews()
}
below my Result class在我的结果 class 下面
sealed class Result<out T> {
data class Success<out R>(val value: R): Result<R>()
data class Failure(
val message: String?,
val throwable: Throwable?
): Result<Nothing>()
}
I want to know where I exactly I am making mistake what I have to do in order to fix that problem我想知道我到底在哪里犯了错误我必须做什么才能解决这个问题
below my news Interface在我的新闻界面下方
import com.example.newsworldwide.model.NewsResponse import retrofit2.Response import retrofit2.http.GET interface NewsInterface {导入 com.example.newsworldwide.model.NewsResponse import retrofit2.Response import retrofit2.http.GET interface NewsInterface {
@GET("ApiKey")
suspend fun getNews(): Response<NewsResponse>
} }
Your NewsInterface
is returning Response<NewsResponse>
& in your NewsViewModel
you're passing it directly to response
so it becomes Result.Success<Response<NewsResponse>>
at the time of posting.您的NewsInterface
正在返回Response<NewsResponse>
并且在您的NewsViewModel
中您将它直接传递给response
,因此它在发布时变为Result.Success<Response<NewsResponse>>
。 That's why this error.这就是为什么这个错误。
Solution:解决方案:
body()
of retrofit response class.从 retrofit 响应 class 的body()
中获取值。_newsResponse
live-data is accepting NewsResponse
which is non-nullable.使用(!!)使其不可为空,因为您的_newsResponse
实时数据正在接受不可为空的NewsResponse
。 You might want to handle null case here.您可能想在此处处理 null 案例。So your final code would look something like this.所以你的最终代码看起来像这样。
class NewsViewModel(private val repository: NewsRepository) : ViewModel() {
private var _newsResponse= MutableLiveData<Result<NewsResponse>>()
// Expose to the outside world
val news: LiveData<Result<NewsResponse>> = _newsResponse
@UiThread
fun getNews() {
viewModelScope.launch(Dispatchers.IO) {
try {
val response = repository.getNews().body()!! //change this line
_newsResponse.postValue(Result.Success(response))
} catch (ioe: IOException) {
_newsResponse.postValue(Result.Failure("[IO] error please retry", ioe))
} catch (he: HttpException) {
_newsResponse.postValue(Result.Failure("[HTTP] error please retry", he))
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.