0

如果我得到正确的响应,我已经实现了密封类如果错误 Result.Error,我将得到 Result.Success

在我实现该逻辑的 ViewModel 下方

@HiltViewModel
class GiphyTaskViewModel
@Inject
constructor(private val giphyTaskRepository: GiphyTaskRepository):ViewModel()
{
    var giphyresponse=MutableLiveData<Result<List<DataItem>>>()


    fun getGifsFromText(apikey:String,text:String,limit:Int)= viewModelScope.launch {
    giphyTaskRepository.getGifsFromText(apikey,text,limit).let { response->
        if(response?.isSuccessful){
            var list=response.body()?.data
            giphyresponse.postValue(Success(list))
        }else{
            giphyresponse.postValue(Error(Exception(response.message())))

        }

    }
}

}

在我的密封类结果之下

sealed class Result<T>
data class Success(val data: Any) : Result<Any?>()
data class Error(val exception: Exception) : Result<Any?>()

但是当我运行项目时出现以下错误

类型不匹配。必需:结果<列表>!发现:成功

4

2 回答 2

0

类型不匹配。要求:结果!发现:成功

这正是你的问题。您已声明LiveData要发出Result<List<DataItem>>. Success是一个Result<Any?>。它不符合您为giphyresponse.

要发布Success,它应该是Result<T>Result<List<DataItem>>>,具体取决于您的层次结构。

要发布Error,它还必须是 ofResult<List<DataItem>>>并且必须创建一个空列表 - 因为该列表是强制性的。另一种方法是定义 giphyresponseMutableLiveData<Result<List<DataItem>?>>()以便Error可以携带null数据而不是虚拟列表。

于 2021-06-25T17:57:29.967 回答
0

您的Success扩展Result<Any?>,因此它不是Result<List>. 您需要对其进行参数化:

data class Success<T>(val data: T) : Result<T>()

此外,在 Kotlin 标准库中已经有一个类似的 util,它比您自己的优化得更好。它被命名为......结果;-) https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-result/

更新

我最初没有注意到的另一个问题是您命名了您的类并且在 Java/KotlinError中已经存在类,因此它可能会导致问题。Error最简单的就是重命名。

请注意,为您提供一个完整的工作示例并非易事,但试试这个:

giphyTaskRepository.getGifsFromText(apikey,text,limit).let { response->
    if(response?.isSuccessful){
        var list=response.body()?.data ?: error("Don't know what to do here")
        giphyresponse.postValue(Success(list as List<DataItem>))
    }else{
        giphyresponse.postValue(Err(Exception(response.message())))
    }
}

sealed class Result<out T>
data class Success<T>(val data: T) : Result<T>()
data class Err(val exception: Exception) : Result<Nothing>()

正如我所说,我不知道当body()为空时你的预期行为是什么,所以我只是抛出了一个错误。

另外,我不知道 的类型是什么body().data,但我认为它只是Any,所以我投了它。这可能是不必要的。

于 2021-06-25T17:47:24.080 回答