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)
浙公网安备 33010602011771号