Skip to content

分页父类

BaseListLogic<E>BaseListState<E>BaseListView<T, E> 位于 lib/core/base/base_list/。它建立在 BaseNetwork 之上,接入 EasyRefresh 的下拉刷新、上拉加载、无更多数据和失败状态,适合商品流、消息流、搜索结果等同构分页列表。

适用边界

分页接口必须返回 BaseListResponse<E>,其中包含列表与分页信息。仅需下拉刷新一个详情页时使用 BaseRefresh;需要瀑布流或异构内容时可重写 builderItemWidget(),保留 Logic 的分页状态机。

默认状态与 API

成员默认值说明
pageSize20单页数量,可在 onInit()super.onInit() 前修改
currentPage1当前请求页码
pageParams{pageSize, pageNum}调用 updatePageParams() 后生成的基础参数
dataListRxList<E>当前已加载的数据
noMoreDatafalse是否终止加载更多
easyRefreshControllercontrolFinishLoad: trueEasyRefresh 完成加载状态控制器
requestSetStatusfalse刷新期间不把整页切换为 loading
方法作用
refresh()页码归一、清除无更多标记、更新参数并请求第一页
loadMore()非末页时页码加一并请求下一页
requestOk()替换或追加记录,依据总页数结束 EasyRefresh
processDataList()数据写入后加工列表的可选入口
updateListPageStatusEmpty()第一页无数据时切换空页面的可选入口
setRefreshStatus*()更新 EasyRefresh 成功、失败、无更多等状态
setFakeData()Demo、Preview 使用的静态数据入口

基于 NetworkListDemo 的完整示例

dart
/// 商品分页列表 Logic。
class NetworkListDemoLogic extends BaseListLogic<Goods> {
  @override
  void onInit() {
    // 在父类生成 pageParams 前设置单页数量,保证首次请求使用 15。
    listState.pageSize = 15;
    super.onInit();
  }

  @override
  Future<BaseResponse<BaseListResponse<Goods>>> Function()? get apiRequest =>
      () => GoodsRepository().getGoodsPage(
        // 请求参数始终取父类维护的当前页与页大小。
        GoodsSearchRequest(
          page: listState.currentPage,
          size: listState.pageSize,
        ),
      );
}

/// 商品分页列表 View。
class NetworkListDemoView extends BaseListView<NetworkListDemoLogic, Goods> {
  NetworkListDemoView({super.key, super.logic});

  @override
  String? get navTitle => '网络列表';

  @override
  Widget itemWidget(Goods item, int index) {
    // 父类完成 ListView、分隔、刷新和加载更多;子类只描述单项。
    return GoodsListCard(goods: item);
  }
}

分页状态流程

首次成功时,currentPage == 1,父类以 assignAll 替换旧列表;加载更多时以 addAll 追加。父类根据 pagination.totalpagination.size 计算总页数;当前页达到总页数或总页数为零时设置 noMoreData 并结束 footer 为 noMore

请求失败时:若当前列表为空,页面切为错误状态;无论是否已有数据,EasyRefresh 都结束为失败状态,因此已加载的内容不会被错误页覆盖。

Preview 写法

dart
/// 列表预览使用静态数据,禁止发起网络请求。
@ResponsivePreview()
Widget previewNetworkListDemoView() {
  final NetworkListDemoLogic logic = NetworkListDemoLogic();
  // 写入预览数据后直接标记成功,使 BaseNetworkView 渲染列表内容。
  logic.listState.dataList.assignAll(previewGoods);
  logic.setStatusSuccess();
  return NetworkListDemoView(logic: logic);
}

注意事项

  • 不要在 requestOk() 中自行执行 finishLoad(),除非完整理解父类状态机;默认实现已处理。
  • 改变 pageSize 后必须在 super.onInit() 前设置,或手工调用 updatePageParams()
  • 后端 totalsize 缺失时父类会安全处理并视为无更多数据;接口模型应尽量完整返回分页字段。

关联阅读