具有块体的函数中需要 'return' 表达式 ('{...}'

A 'return' expression required in a function with a block body ('{...}'

我想在 CampaignRepositoryImpl.kt class 中使用 getCampaigns 函数中的 rxjava3 调用 api 但我收到以下错误 A 'return' expression required in具有块体的函数 ('{...}')

低于CampaignRepositoryImpl.ktclass

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()

    }

}

在我的界面下方 class 我收到 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)

低于广告活动元数据

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)

我想知道我在哪里犯了错误我必须做什么才能避免错误

因为你的 ApiInterface return 是 Single,你可以 return 它在方法体中。 您可能需要检查 CampaignRepository 是否具有 getCampaigns() 方法,它应该 return Single.

    class CampaignRepositoryImpl(private val apiInterface: ApiInterface) : CampaignRepository {
    
        override fun getCampaigns(): Single<CampaignsResponse> {
    
           return apiInterface.getCampaigns()
    
        }
    
    }

从你的api界面,我们可以看到getCampaigns()的类型是Single<CampaignsResponse>。另一方面,在您的存储库实现中,getCampaigns() 的类型是 Single<List<Campaign>>.

由于两者都是 Single<Foo>,您需要 map 从一个到另一个。

鉴于您的 class 实施,这应该有效:

override fun getCampaigns(): Single<List<Campaign>> {
   return apiInterface.getCampaigns().map { response ->
       response.metadata.data.map {
           Campaign(it.name, it.description)
       }
   }
}

map 调用正在将 CampaignResponse 转换为 List<Campaign>