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
相关产品推荐
相关产品推荐

