问题描述
我想在 CampaignRepositoryImpl.kt 类中的 getCampaigns 函数中使用 rxjava3 调用 api,但出现以下错误 )
在 CampaignRepositoryImpl.kt 类下面
import de.westwing.campaignbrowser.domain.Campaign
import de.westwing.campaignbrowser.domain.CampaignRepository
import io.reactivex.rxjava3.core.Single
class CampaignRepositoryImpl(private val apiInterface: ApiInterface) : CampaignRepository {
override fun getCampaigns(): Single<List<Campaign>> {
apiInterface.getCampaigns()
}
}
在我的接口类下面,我收到了 API 调用
interface ApiInterface {
@GET("cms/test/campaigns.json")
fun getCampaigns(): Single<CampaignsResponse>
}
在 CampaignRepository 下方
接口 CampaignRepository {
fun getCampaigns(): Single<List<Campaign>>
}
在我的 CompaignResponse.kt 下方
data class CampaignsResponse(val Metadata: CampaignsMetadata)
在CampaingsMetadata下方
data class CampaignsMetadata(val data: List<CampaignDto>)
下面
data class Campaign(val name: String,val description: String)
在 CampaignDto 下方
class CampaignDto(val name: String,val description: String,val image: ImageDto)
我想知道我哪里出错了我必须做什么才能避免错误
解决方法
从你的api界面,我们可以看到getCampaigns()
的类型是Single<CampaignsResponse>
。另一方面,在您的存储库实现中,getCampaigns()
的类型是 Single<List<Campaign>>
。
由于两者都是 Single<Foo>
,您需要从一个到另一个 map
。
鉴于您的类实现,这应该可行:
override fun getCampaigns(): Single<List<Campaign>> {
return apiInterface.getCampaigns().map { response ->
response.metadata.data.map {
Campaign(it.name,it.description)
}
}
}
这个 map
调用正在接收一个 CampaignResponse
并将它变成一个 List<Campaign>
。
由于您的 ApiInterface 返回 Single,因此您可以在方法主体中返回它。 您可能需要检查 CampaignRepository 是否具有 getCampaigns() 方法并且它应该返回 Single。
class CampaignRepositoryImpl(private val apiInterface: ApiInterface) : CampaignRepository {
override fun getCampaigns(): Single<CampaignsResponse> {
return apiInterface.getCampaigns()
}
}