类型不匹配。要求:结果<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 因此它在发布。这就是为什么会出现这个错误。

解法:

  1. 从改进响应 class 的 body() 中获取值。
  2. 使用 (!!) 使其成为 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))
            }
        }
    }

}