用flutter实现分页加载和下拉刷新

class SearchList extends StatefulWidget {

  const SearchList(

      {super.key, required String keywords, required int selectedIndex});

  @override

  State<SearchList> createState() => _SearchListState();

}

class _SearchListState extends State<SearchList> {

  int currentPage = 1; //当前页是第一页

  List<JobInfo> datalist = [];

  bool isLoading = false;

  final ScrollController _scrollController = ScrollController();

//获取第n页数据 

Future<List<JobInfo>> fetchJobList({int page = 1}) async {

    final response = await http

        .get(Uri.parse('http://xiaoshuo.com/api/zhaopin/index?page=$page'));

    if (response.statusCode == 200) {

      final responseBody = json.decode(response.body);

      //转换模型数组

      List<JobInfo> joblist = responseBody['data']['rows']

          .map<JobInfo>((item) => JobInfo.fromJson(item))

          .toList();

      return joblist;

    } else {

      throw Exception('Failed to fetch data');

    }

  }

//  获取数据后填充datalist

Future<void> loadNextPage() async {

    var nextPageData = await fetchJobList(page: currentPage);

    var scrollOffset = _scrollController.offset;

    setState(() {

      datalist.addAll(nextPageData);

      currentPage++;

      isLoading = false;

    });

    _scrollController.jumpTo(scrollOffset);

  }

  @override

  void initState() {

    super.initState();

    loadNextPage();//加载第一页

    _scrollController.addListener(() {

      if (!isLoading &&

          _scrollController.position.pixels ==

              _scrollController.position.maxScrollExtent) {

        isLoading = true;

        loadNextPage();//加载下一页

      }

    });

  }

  Future<void> _refresh() async {

    // 模拟网络请求

    //await Future.delayed(Duration(seconds: 2));

    // 刷新数据,将datalist清空后加载第一页

    setState(() {

      datalist = [];

      currentPage = 1;

      isLoading = true;

      loadNextPage();

    });

  }

  @override

  Widget build(BuildContext context) {

    return Container(

      decoration: BoxDecoration(

        color: Color.fromARGB(255, 230, 229, 229),

      ),

      padding: EdgeInsets.symmetric(

        vertical: 3,

      ),

      child: RefreshIndicator(

        onRefresh: _refresh,

        child: ListView.builder(

          controller: _scrollController,

          itemCount: datalist.length + 1, // 加1是为了显示加载中的UI

          itemBuilder: (context, index) {

            if (index < datalist.length) {

              return SearchItemCard(jobinfo: datalist[index]);

            } else {

              return Center(

                child: CircularProgressIndicator(),

              );

            }

          },

        ),

      ),

    );

  }

}

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值