Flutter分页管理插件pagination_easy的使用

Flutter分页管理插件pagination_easy的使用

安装

在您的 pubspec.yaml 文件中添加 pagination_easy 作为依赖项,并运行 flutter pub get

dependencies:
  pagination_easy: ^x.y.z

或者直接运行以下命令:

flutter pub add pagination_easy

使用

要使用此插件,首先导入必要的库:

import 'package:pagination_easy/pagination_controller.dart';
import 'package:pagination_easy/pagination_widget.dart';

接下来,初始化 PaginationController 并定义获取数据的方法:

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late PaginationController<Product> paginationController;

  [@override](/user/override)
  void initState() {
    super.initState();
    paginationController = PaginationController<Product>(
      fetchPage: (int pageKey) => getData(pageKey),
    );
  }

  Future<List<Product>> getData(int pageKey) async {
    // 模拟从服务器获取数据
    await Future.delayed(Duration(seconds: 2));

    // 假设每页返回的数据量为10
    final List<Product> data = List.generate(10, (index) => Product(id: index + pageKey * 10, name: "Product ${index + pageKey * 10}"));

    return data;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Pagination Easy Demo")),
      body: Column(
        children: [
          Expanded(
            child: SingleChildScrollView(
              controller: paginationController.scrollController,
              child: Padding(
                padding: EdgeInsets.all(16.0),
                child: PaginationWidget(
                  itemBuilder: (BuildContext context, Product item, int index) {
                    return ListTile(
                      title: Text(item.name),
                    );
                  },
                  controller: paginationController,
                  emptyWidget: const Center(child: Text("No Data Available")),
                  bottomLoader: Center(
                    child: CircularProgressIndicator(),
                  ),
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

class Product {
  final int id;
  final String name;

  Product({required this.id, required this.name});
}

示例代码解释

  1. 导入必要的库

    import 'package:pagination_easy/pagination_controller.dart';
    import 'package:pagination_easy/pagination_widget.dart';
    
  2. 初始化 PaginationController

    late PaginationController<Product> paginationController;
    
    [@override](/user/override)
    void initState() {
      super.initState();
      paginationController = PaginationController<Product>(
        fetchPage: (int pageKey) => getData(pageKey),
      );
    }
    
  3. 定义获取数据的方法

    Future<List<Product>> getData(int pageKey) async {
      // 模拟从服务器获取数据
      await Future.delayed(Duration(seconds: 2));
    
      // 假设每页返回的数据量为10
      final List<Product> data = List.generate(10, (index) => Product(id: index + pageKey * 10, name: "Product ${index + pageKey * 10}"));
    
      return data;
    }
    
  4. 构建页面

    [@override](/user/override)
    Widget build(BuildContext context) {
      return Scaffold(
        appBar: AppBar(title: Text("Pagination Easy Demo")),
        body: Column(
          children: [
            Expanded(
              child: SingleChildScrollView(
                controller: paginationController.scrollController,
                child: Padding(
                  padding: EdgeInsets.all(16.0),
                  child: PaginationWidget(
                    itemBuilder: (BuildContext context, Product item, int index) {
                      return ListTile(
                        title: Text(item.name),
                      );
                    },
                    controller: paginationController,
                    emptyWidget: const Center(child: Text("No Data Available")),
                    bottomLoader: Center(
                      child: CircularProgressIndicator(),
                    ),
                  ),
                ),
              ),
            ),
          ],
        ),
      );
    }
    

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

1 回复

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


pagination_easy 是 Flutter 中的一个分页管理插件,它可以帮助开发者轻松地实现分页加载功能。以下是使用 pagination_easy 插件的基本步骤和示例代码。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 pagination_easy 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  pagination_easy: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 基本使用

pagination_easy 提供了一个 PaginationEasy 小部件,你可以将它嵌入到你的 UI 中,并通过回调函数来处理分页加载逻辑。

import 'package:flutter/material.dart';
import 'package:pagination_easy/pagination_easy.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: PaginationExample(),
    );
  }
}

class PaginationExample extends StatefulWidget {
  @override
  _PaginationExampleState createState() => _PaginationExampleState();
}

class _PaginationExampleState extends State<PaginationExample> {
  final 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));

    // 假设每次加载10个数据
    List<String> newItems = List.generate(10, (index) => 'Item ${_items.length + index + 1}');
    
    setState(() {
      _items.addAll(newItems);
      _page++;
      _isLoading = false;
      _hasMore = _page < 5; // 假设总共有5页数据
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Pagination Easy Example'),
      ),
      body: PaginationEasy(
        itemBuilder: (context, index) {
          if (index >= _items.length) {
            return Center(child: CircularProgressIndicator());
          }
          return ListTile(
            title: Text(_items[index]),
          );
        },
        itemCount: _items.length + (_hasMore ? 1 : 0),
        onLoadMore: _loadMore,
        isLoading: _isLoading,
        hasMore: _hasMore,
      ),
    );
  }
}

3. 参数说明

  • itemBuilder: 用于构建列表项的构建器函数。index 参数表示当前项的索引。
  • itemCount: 列表项的总数。通常为 _items.length + (_hasMore ? 1 : 0),以便在列表底部显示加载指示器。
  • onLoadMore: 当用户滚动到列表底部时触发的回调函数,用于加载更多数据。
  • isLoading: 表示是否正在加载数据的布尔值。
  • hasMore: 表示是否还有更多数据可以加载的布尔值。

4. 自定义加载指示器

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

PaginationEasy(
  itemBuilder: (context, index) {
    if (index >= _items.length) {
      return Center(child: CircularProgressIndicator());
    }
    return ListTile(
      title: Text(_items[index]),
    );
  },
  itemCount: _items.length + (_hasMore ? 1 : 0),
  onLoadMore: _loadMore,
  isLoading: _isLoading,
  hasMore: _hasMore,
  loadingWidget: Center(child: CircularProgressIndicator()), // 自定义加载指示器
),
回到顶部