You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中Paging3对接Ktor Server报错:无法创建ApiResponse转换器

Android Paging3 + Retrofit 转换异常问题

错误信息

抛出异常:

java.lang.IllegalArgumentException: Unable to create converter for class com.example.realhome.domain.model.ApiResponse

该错误在以下Composable代码的日志输出中捕获:

@ExperimentalCoilApi
@Composable
fun listContent(propertys: LazyPagingItems<Property>,navHostController: NavHostController){
    Log.d("List content", propertys.loadState.toString())
LazyColumn(contentPadding = PaddingValues(all =10.dp),
    verticalArrangement = Arrangement.spacedBy(10.dp)){
  items(
      items = propertys,
      key = {property->property.id}){
property->property?.let { Propertyitem(property = it, navHostController = navHostController) }
  }
}

    }

项目现状

项目可正常构建安装,但数据无法显示。已排查Api接口和RemoteMediator代码,未发现明显问题。

相关代码

Retrofit依赖注入代码

object networkModule {
@Provides
@Singleton
    fun providehttpclient():OkHttpClient{
        return OkHttpClient.Builder().readTimeout(15,TimeUnit.MINUTES)
            .connectTimeout(15,TimeUnit.MINUTES).build()
    }


    @Provides
    @Singleton
    fun provideretrfitinstance(okHttpClient: OkHttpClient): Retrofit {
        val contentType = "application/json".toMediaType()
        return Retrofit.Builder().baseUrl(BASE_URL).client(okHttpClient)
            .addConverterFactory(Json.asConverterFactory(contentType)).build()

    }
}

Api接口定义

interface PropertyApi {
    @GET("/RealHomes/Properites")
    suspend fun getallproperties(
        @Query("page") page:Int = 1
    ):ApiResponse

}

RemoteMediator实现

@ExperimentalPagingApi
//@OptIn(ExperimentalPagingApi::class)
class propertyRemoteMediator @Inject constructor(
    private val PropertyApi: PropertyApi,
    private val propertyDatabase: propertyDatabase


) : RemoteMediator<Int, Property>() {

    private val propertyDao = propertyDatabase.propertyDao()
    private val propertyRemoteKeyDao = propertyDatabase.propertyRemoteKeyDao()


    override suspend fun load(
        loadType: LoadType,
        state: PagingState<Int, Property>
    ): MediatorResult {
        return try {
            val page = when (loadType) {
                LoadType.PREPEND -> {
                    val remotekey = getRemoteKeyClosetToCurrentPosition(state)
                    remotekey?.nextpage?.minus(1) ?: 1
                }

                LoadType.REFRESH -> {
                    val remoteKey = getRemoteKeyForFirst(state)
                    val prevpage = remoteKey?.prevpage
                        ?: return MediatorResult.Success(endOfPaginationReached = remoteKey != null)

                    prevpage
                }

                LoadType.APPEND -> {
                    val remoteKey = getRemoteKeyForLastItem(state)
                    val nextpage = remoteKey?.nextpage
                        ?: return MediatorResult.Success(endOfPaginationReached = remoteKey != null)
                    nextpage

                }
            }


            val respose = PropertyApi.getallproperties(page = page)
            if (respose.properties.isNotEmpty()) {
                propertyDatabase.withTransaction {
                    if (loadType == LoadType.REFRESH) {
                        propertyDao.deleteAllProperties()
                        propertyRemoteKeyDao.deleteAllRemoteKeys()
                    }
                    val prevpage = respose.prevpage
                    val nextpage = respose.nextpage
                    val keys = respose.properties.map { property ->
                        propertyRemoteKey(
                            id = property.id,
                            prevpage = prevpage,
                            nextpage = nextpage

                        )
                    }
                    propertyRemoteKeyDao.addAllRemoteKeys(keys)
                    propertyDao.addProperty(respose.properties)
                }

            }
            MediatorResult.Success(endOfPaginationReached = respose.nextpage == null)
        } catch (e: Exception) {
            return MediatorResult.Error(e)
        }
        TODO("Not yet implemented")
    }


    private suspend fun getRemoteKeyClosetToCurrentPosition(state: PagingState<Int, Property>):
            propertyRemoteKey? {
        return state.anchorPosition?.let { position ->
            state.closestItemToPosition(position)?.id?.let { id ->
                propertyRemoteKeyDao.getRemoteKey(id = id)
            }
        }
    }

    private suspend fun getRemoteKeyForFirst(state: PagingState<Int, Property>): propertyRemoteKey? {
        return state.pages.firstOrNull { it.data.isNotEmpty() }?.data?.firstOrNull()
            ?.let { property ->
                propertyRemoteKeyDao.getRemoteKey(id = property.id)
            }
    }

    private suspend fun getRemoteKeyForLastItem(state: PagingState<Int, Property>): propertyRemoteKey? {
        return state.pages.lastOrNull { it.data.isNotEmpty() }?.data?.lastOrNull()
            ?.let { property -> propertyRemoteKeyDao.getRemoteKey(id = property.id) }
    }


}

内容的提问来源于stack exchange,提问作者Aliy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 00:50:22