实现上拉加载数据,效果如下:
flutter滚动列表加载数据
使用的库主要是infinite_scroll_pagination ,
安装请查看官网
接口用的是https://reqres.in/提供的接口
请求接口用到的库是dio
下面主要是介绍如何使用infinite_scroll_pagination实现上拉加载数据,详细学习其它例子请查看infinite_scroll_pagination
main.dart全部代码如下
- // ignore_for_file: non_constant_identifier_names
- import 'package:flutter/material.dart';
- import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
-
- import 'package:dio/dio.dart' as MyDio;
-
- void main() => runApp(const MyApp());
-
- class MyApp extends StatelessWidget {
- const MyApp({super.key});
-
- @override
- Widget build(BuildContext context) {
- return MaterialApp(
- title: 'Infinite Scroll Demo',
- theme: ThemeData(
- primarySwatch: Colors.blue,
- ),
- home: const InfiniteScrollList(),
- );
- }
- }
-
- class InfiniteScrollList extends StatefulWidget {
- const InfiniteScrollList({super.key});
-
- @override
- // ignore: library_private_types_in_public_api
- _InfiniteScrollListState createState() => _InfiniteScrollListState();
- }
-
- class _InfiniteScrollListState extends State<InfiniteScrollList> {
-
- final PagingController<int, UserData> _listController =
- PagingController(firstPageKey: 1);
- @override
- void initState() {
- super.initState();
-
- _listController.addPageRequestListener((page) {
- _fetchListData(page);
- });
- }
- Future<void> _fetchListData(int page) async {
- MyDio.Dio dio = MyDio.Dio();
- MyDio.Response response = await dio.get(
- 'https://reqres.in/api/users',
- queryParameters: {
- 'page': page,
-
- // 'stage_id': 4,
- // 'category_id': 3,
- });
- ApiResponse data = ApiResponse.fromJson(response.data);
- if (data.data.isEmpty) {
- _listController.appendLastPage(data.data);
- } else {
- final nextPageKey = page + 1;
- _listController.appendPage(data.data, nextPageKey);
- }
- }
-
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(title: const Text('Infinite Scroll Demo')),
- body: PagedListView<int, UserData>(
- pagingController: _listController,
- builderDelegate: PagedChildBuilderDelegate<UserData>(
- itemBuilder: (context, item, index) =>
- ListTile(title: SizedBox(child: Text(item.firstName))),
- noMoreItemsIndicatorBuilder: (context) => const Center(
- child: Padding(
- padding: EdgeInsets.all(20.0),
- child: Text('没有更多了'),
- ),
- ),
- ),
-
- ),
- );
- }
-
- @override
- void dispose() {
- _listController.dispose();
- super.dispose();
- }
- }
-
-
-
- class ApiResponse {
- final int page;
- final int perPage;
- final int total;
- final int totalPages;
- final List<UserData> data;
- final Support support;
-
- ApiResponse({required this.page, required this.perPage, required this.total, required this.totalPages, required this.data, required this.support});
-
- factory ApiResponse.fromJson(Map<String, dynamic> json) {
- var list = json['data'] as List;
- List<UserData> dataList = list.map((i) => UserData.fromJson(i)).toList();
-
- return ApiResponse(
- page: json['page'],
- perPage: json['per_page'],
- total: json['total'],
- totalPages: json['total_pages'],
- data: dataList,
- support: Support.fromJson(json['support']),
- );
- }
- }
-
- class UserData {
- final int id;
- final String email;
- final String firstName;
- final String lastName;
- final String avatar;
-
- UserData({required this.id, required this.email, required this.firstName, required this.lastName, required this.avatar});
-
- factory UserData.fromJson(Map<String, dynamic> json) {
- return UserData(
- id: json['id'],
- email: json['email'],
- firstName: json['first_name'],
- lastName: json['last_name'],
- avatar: json['avatar'],
- );
- }
- }
-
- class Support {
- final String url;
- final String text;
-
- Support({required this.url, required this.text});
-
- factory Support.fromJson(Map<String, dynamic> json) {
- return Support(
- url: json['url'],
- text: json['text'],
- );
- }
- }