Flutter分页列表构建插件paginated_listview_builder的使用

Flutter分页列表构建插件paginated_listview_builder的使用

介绍

paginated_listview_builder 是一个可以帮助你实现分页功能的 Flutter 插件。它通过 ListView.builder 来实现分页效果。

作者

截图

App Screenshot

使用/示例

以下是一个完整的示例代码,展示了如何使用 paginated_listview_builder 插件来创建一个分页列表。

import 'dart:developer';

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:paginated_listview_builder/paginated_listview_builder.dart';

void main() => runApp(const MyApp());

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final paginatedController = PaginatedController<int>();

  [@override](/user/override)
  void initState() {
    getNewData();
    super.initState();
  }

  final List<int> data = List.generate(10, (index) => index + 1);

  bool isLoading = false;
  bool isShowButton = false;

  void getNewData() async {
    isLoading = true;
    setState(() {});

    // 模拟加载数据
    await Future.delayed(const Duration(seconds: 1));

    // 添加新数据到控制器
    paginatedController.addData(data);

    isLoading = false;
    setState(() {});
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Gits Paginated ListView Builder'),
        ),
        floatingActionButton: isShowButton == false
            ? null
            : FloatingActionButton(
                onPressed: () {
                  // 滚动到顶部
                  paginatedController.scrollController.animateTo(
                    0,
                    duration: const Duration(seconds: 1),
                    curve: Curves.easeIn,
                  );
                },
                child: const Icon(Icons.keyboard_arrow_up),
              ),
        body: RefreshIndicator(
          onRefresh: () async {
            // 重置分页控制器并获取新数据
            paginatedController.reset();
            getNewData();
          },
          child: PaginatedListViewBuilder<int>(
            threshold: 80,
            controller: paginatedController,
            isLoading: isLoading,
            onHitThreshold: (context, current) {
              // 当滚动到阈值时触发
              if (isLoading == false) {
                log(current.toString());
                getNewData();
              }
            },
            onScrolling: (context, current, controller) {
              // 监听滚动状态
              if (controller.position.pixels > 50) {
                if (isShowButton == false) {
                  isShowButton = true;
                  setState(() {});
                }
              } else {
                if (isShowButton == true) {
                  isShowButton = false;
                  setState(() {});
                }
              }
              log(controller.position.pixels.toString());
            },
            itemBuilder: (context, index, currentData) => Padding(
              padding: const EdgeInsets.all(20),
              child: Container(
                color: Colors.orange,
                child: Padding(
                  padding: const EdgeInsets.all(20.0),
                  child: Text(index.toString()),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter分页列表构建插件paginated_listview_builder的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter分页列表构建插件paginated_listview_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


paginated_listview_builder 是一个用于在 Flutter 中构建分页列表的插件。它可以帮助你轻松地实现分页加载数据的功能,特别是在处理大量数据时非常有用。下面是如何使用 paginated_listview_builder 的基本步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 paginated_listview_builder 依赖:

dependencies:
  flutter:
    sdk: flutter
  paginated_listview_builder: ^0.0.1 # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入包

在你的 Dart 文件中导入 paginated_listview_builder

import 'package:paginated_listview_builder/paginated_listview_builder.dart';

3. 使用 PaginatedListViewBuilder

PaginatedListViewBuilder 是一个可以自动处理分页加载的 ListView。你需要提供一个 itemBuilder 来构建列表项,以及一个 onLoadMore 回调函数来加载更多数据。

以下是一个简单的示例:

class PaginatedListViewExample extends StatefulWidget {
  @override
  _PaginatedListViewExampleState createState() => _PaginatedListViewExampleState();
}

class _PaginatedListViewExampleState extends State<PaginatedListViewExample> {
  List<String> items = [];
  int page = 1;
  bool isLoading = false;
  bool hasMore = true;

  Future<void> _loadMore() async {
    if (isLoading || !hasMore) return;

    setState(() {
      isLoading = true;
    });

    // 模拟网络请求
    await Future.delayed(Duration(seconds: 2));

    List<String> newItems = List.generate(20, (index) => 'Item ${(page - 1) * 20 + index + 1}');
    setState(() {
      items.addAll(newItems);
      page++;
      isLoading = false;
      if (newItems.length < 20) {
        hasMore = false;
      }
    });
  }

  @override
  void initState() {
    super.initState();
    _loadMore();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Paginated ListView Example'),
      ),
      body: PaginatedListViewBuilder(
        itemCount: items.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(items[index]),
          );
        },
        onLoadMore: _loadMore,
        hasMore: hasMore,
        isLoading: isLoading,
      ),
    );
  }
}

4. 参数说明

  • itemCount: 列表项的数量。
  • itemBuilder: 用于构建列表项的构建器。
  • onLoadMore: 当需要加载更多数据时调用的回调函数。
  • hasMore: 是否还有更多数据可以加载。
  • isLoading: 当前是否正在加载数据。

5. 自定义加载指示器

你可以通过 loadingIndicator 参数来自定义加载指示器:

PaginatedListViewBuilder(
  itemCount: items.length,
  itemBuilder: (context, index) {
    return ListTile(
      title: Text(items[index]),
    );
  },
  onLoadMore: _loadMore,
  hasMore: hasMore,
  isLoading: isLoading,
  loadingIndicator: Center(
    child: CircularProgressIndicator(),
  ),
);

6. 处理错误

你可以在 onLoadMore 中处理错误,并在 errorIndicator 中显示错误信息:

PaginatedListViewBuilder(
  itemCount: items.length,
  itemBuilder: (context, index) {
    return ListTile(
      title: Text(items[index]),
    );
  },
  onLoadMore: _loadMore,
  hasMore: hasMore,
  isLoading: isLoading,
  errorIndicator: Center(
    child: Text('加载失败,请重试'),
  ),
);
回到顶部