flutter第十二篇:实现上拉分页

要实现上拉加载下一页,需要用到ListView的controller属性,赋值为一个ScrollController实例。在initState()方法中,调用scrollController的addListener()方法,从而对滚动条进行监听。

定义变量:

  var scrollController = ScrollController();

  // 是否是最后一页
  var reachEnd = false;

  // 加锁以保证滚动条在将要到底的过程中仅拉取一次数据
  var flag = true;

在init()方法中添加监听,当滚动条快要拉到底时,拉取下一页数据:

    scrollController.addListener(() {
      if (scrollController.position.pixels >=
          scrollController.position.maxScrollExtent - 20) {
        getProductListData();
      }
    });

定义获取分页数据的方法:

  Future<void> getProductListData() async {
    if (!reachEnd && flag) {
      // 锁住
      flag = false;
      var cid = Get.arguments["cid"];
      var url = "/api/plist?cid=$cid&sort=$sort&page=$page&pageSize=$pageSize";
      print("url: $url");
      var rsp = await HttpClient.get(url);
      var list = PListModel.fromJson(rsp.data).result!;
      productList.addAll(list);
      update();

      if (list.length == pageSize) {
        page = page + 1;
        print("增加页码,下次拉page=$page");
      } else {
        reachEnd = true;
        print("到最后一页了,以后不再拉了");
      }

      // 解锁
      flag = true;
    }
  }

列表最下面有"我是有底线的"的布局:

listView中的元素是Column,其第一个元素是列表数据,第二个元素是个CircularProgressIndicator或是个Text,当列表元素是本页最后一个但还有下一页时,是CircularProgressIndicator,否则是Text。Text的内容是空字符串或是"我是有底线的",当列表元素是本页最后一个且没有下一页时是"我是有底线的",否则是空字符串。

index == controller.productList.length - 1
    ? controller.reachEnd ? const Text("我是有底线的") : const CircularProgressIndicator()
    : const SizedBox(height: 0)

 

posted on 2024-11-18 10:27  koushr  阅读(83)  评论(0)    收藏  举报

导航