0

我正在开发 android 应用程序,我已经在 viemodel 类中实现了成功和失败案例,但我得到以下不匹配类型不匹配。要求:结果!找到:结果<响应>

在我的 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()


}

在我的 Result 类下面

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>

}

4

1 回答 1

1

NewsInterface正在返回Response<NewsResponse>,并且您NewsViewModel将其直接传递给它,response因此它在发布时变为 Result.Success<Response<NewsResponse>>。这就是为什么这个错误。

解决方案:

  1. body()从改造响应类中获取价值。
  2. 使用(!!)使其不可为空,因为您的_newsResponse实时数据正在接受NewsResponse不可为空的数据。您可能想在此处处理 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))
            }
        }
    }

}
于 2022-01-22T10:35:51.203 回答