类型不匹配。要求:结果<NewsResponse>!发现:结果<Response<NewsResponse>>?
Type mismatch. Required: Result<NewsResponse>! Found: Result<Response<NewsResponse>>?
我正在开发 android 应用程序,我已经在 viemodel class 中实现了成功和失败案例,但我遇到了以下不匹配类型不匹配问题。
必需的:
结果!
成立:
结果<响应>
在我的 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))
}
}
}
}
低于我的NewsRepository.ktclass
NewsRepository(
private val apiInterface:NewsInterface
){
suspend fun getNews() = apiInterface.getNews()
}
低于我的结果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>()
}
我想知道我究竟在哪里犯了错误我必须做些什么才能解决这个问题
在我的新闻界面下方
进口com.example.newsworldwide.model.NewsResponse
导入 retrofit2.Response
导入 retrofit2.http.GET
接口 NewsInterface {
@GET("ApiKey")
suspend fun getNews(): Response<NewsResponse>
}
您的 NewsInterface
正在返回 Response<NewsResponse>
并且在您的 NewsViewModel
中您将其直接传递给 response
因此它在发布。这就是为什么会出现这个错误。
解法:
- 从改进响应 class 的
body()
中获取值。
- 使用 (!!) 使其成为 Non-nullable,因为您的
_newsResponse
live-data 正在接受 NewsResponse
,即 non-nullable。您可能想在这里处理 null 大小写。
所以你的最终代码看起来像这样。
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))
}
}
}
}
我正在开发 android 应用程序,我已经在 viemodel class 中实现了成功和失败案例,但我遇到了以下不匹配类型不匹配问题。 必需的: 结果! 成立: 结果<响应>
在我的 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))
}
}
}
}
低于我的NewsRepository.ktclass
NewsRepository(
private val apiInterface:NewsInterface
){
suspend fun getNews() = apiInterface.getNews()
}
低于我的结果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>()
}
我想知道我究竟在哪里犯了错误我必须做些什么才能解决这个问题
在我的新闻界面下方
进口com.example.newsworldwide.model.NewsResponse 导入 retrofit2.Response 导入 retrofit2.http.GET 接口 NewsInterface {
@GET("ApiKey")
suspend fun getNews(): Response<NewsResponse>
}
您的 NewsInterface
正在返回 Response<NewsResponse>
并且在您的 NewsViewModel
中您将其直接传递给 response
因此它在发布。这就是为什么会出现这个错误。
解法:
- 从改进响应 class 的
body()
中获取值。 - 使用 (!!) 使其成为 Non-nullable,因为您的
_newsResponse
live-data 正在接受NewsResponse
,即 non-nullable。您可能想在这里处理 null 大小写。
所以你的最终代码看起来像这样。
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))
}
}
}
}