简体   繁体   English

类型不匹配。 必需:结果<newsresponse> : 发现: 结果<response<newsresponse> &gt;? </response<newsresponse></newsresponse>

[英]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:解决方案:

  1. Get value from body() of retrofit response class.从 retrofit 响应 class 的body()中获取值。
  2. Make it Non-nullable using(!!) as your _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.

相关问题 类型不匹配。 必需: suspend () → Response&lt;*&gt; 找到:Response<Void> - Type mismatch. Required: suspend () → Response<*> Found: Response<Void> 类型不匹配。 必需:片段,找到:PlaceAutocompleteFragment - Type mismatch. Required: Fragment, Found: PlaceAutocompleteFragment 类型不匹配。 要求:观察员<in Int!>成立:? - Type mismatch. Required: Observer<in Int!> Found:? 类型不匹配。 必需:找不到:回调&lt;*&gt; - Type mismatch. Required: Nothing Found: Callback<*> 类型不匹配。 必需:找到的上下文:在片段中 - Type mismatch. Required: Context Found: In Fragment 类型不匹配。 必需:ContentResolver! 找到:整数 - Type mismatch. Required: ContentResolver! Found: Int 类型不匹配。 必需:数组 <Uri> ! 找到:数组 <Uri?> - Type mismatch. Required: Array<Uri>! Found: Array<Uri?> 类型不匹配。 必需:FirebaseRecyclerAdapter<chatobject, chatvoiceviewholders> ? 成立:</chatobject,> - Type mismatch. Required: FirebaseRecyclerAdapter<ChatObject, ChatVoiceViewHolders>? Found: 类型不匹配。 所需上下文:找到 MyAdapter.ViewHolder - Type mismatch. Required Context: Found MyAdapter.ViewHolder 类型不匹配。 要求:Alignment。水平找到:Alignment - Type mismatch. Required: Alignment.Horizontal Found: Alignment
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM