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(),

              );

            }

          },

        ),

      ),

    );

  }

}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐