Android RemoteMediator类在Flutter中的等效实现及分页查询方案问询
完全可以通过sqflite实现你描述的分页查询+无限滚动列表效果,整套逻辑可以完全对齐你在Android端使用ROOM+Paging3+RemoteMediator的实现方案。
核心实现步骤
- 首先实现sqflite分页查询:sqflite原生支持标准SQL的
limit、offset语法,可直接用于分页查询,示例代码如下:
// 假设每页加载20条数据,currentPage从0开始计数 Future<List<YourDataEntity>> getPageData(int currentPage, int pageSize) async { final db = await getDatabase(); // 可根据业务需求添加where条件、排序规则 final List<Map<String, dynamic>> maps = await db.query( 'your_data_table', orderBy: 'create_time DESC', limit: pageSize, offset: currentPage * pageSize, ); return maps.map((map) => YourDataEntity.fromJson(map)).toList(); }
- 然后和ListView.builder联动:给ListView绑定
ScrollController监听滚动事件,当滚动到距离列表底部预设阈值(比如剩余2条未展示)时,触发下一页的查询,将新查询到的数据追加到列表数据源后刷新UI即可。 - 实现类RemoteMediator逻辑:和Android端逻辑完全一致,封装一个中介层,当本地分页查询返回的结果数量小于pageSize时,说明本地已存储的数据已经加载完毕,此时触发网络请求拉取远端下一页数据,将拉取到的所有数据插入sqflite数据库,再重新触发当前页的查询渲染列表;无网络环境下不会触发网络请求,直接使用本地已缓存的数据,可正常访问。
优化建议
- 给查询、排序用到的字段添加数据库索引,避免大数据量下
offset过大导致查询变慢,影响列表滑动流畅度 - 插入网络数据时新增唯一键校验逻辑,比如按数据id判断是否已存在,避免重复插入导致列表出现重复内容
- 若想获得更接近ROOM的开发体验,可使用基于sqflite封装的
drift库,支持类型安全的SQL查询、自动实体类映射,无需手写大量增删改查模板代码,迁移成本更低
内容的提问来源于stack exchange,提问作者Anudeep Ananth
相关产品推荐
相关产品推荐

