Flutter分页管理插件angel3_paginate的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter分页管理插件angel3_paginate的使用

简介

Angel3 Paginate 是一个与平台无关的分页库,支持自定义的 Angel3 框架。它可以帮助开发者高效地实现分页功能,并且提供了丰富的 API 用于处理分页数据。

安装

pubspec.yaml 文件中添加依赖:

dependencies:
  angel3_paginate: ^6.0.0

使用方法

angel3_paginate 提供了一个 Paginator<T> 类,可以用于生成 PaginationResult<T> 实例。分页结果在序列化为 JSON 时如下所示:

{
  "total" : 75,
  "items_per_page" : 10,
  "previous_page" : 3,
  "current_page" : 4,
  "next_page" : 5,
  "start_index" : 30,
  "end_index" : 39,
  "data" : ["<items...>"]
}

PaginationResult<T> 可以通过 fromMap 构造函数从 Map 中解析,也可以通过 toJson() 方法序列化为 JSON。

创建分页器

以下是一个简单的示例,展示了如何创建和使用 Paginator

import 'package:angel3_paginate/angel3_paginate.dart';

void main() {
  // 创建一个包含数据的可迭代对象
  var iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];

  // 创建分页器,默认每页显示 10 项
  var p = Paginator(iterable, itemsPerPage: 10);

  // 获取当前页面(默认是第一页)
  var page = p.current!;
  print('总项数: ${page.total}');
  print('起始索引: ${page.startIndex}');
  print('结束索引: ${page.endIndex}');
  print('当前页数据: ${page.data}');

  // 跳转到下一页
  p.next();
  page = p.current!;
  print('当前页: ${page.currentPage}');
  print('当前页数据: ${page.data}');

  // 返回上一页
  p.back();
  page = p.current!;
  print('当前页: ${page.currentPage}');
  print('当前页数据: ${page.data}');

  // 跳转到指定页面(例如第 2 页)
  p.goToPage(2);
  page = p.current!;
  print('当前页: ${page.currentPage}');
  print('当前页数据: ${page.data}');
}

分页器缓存

Paginator 默认会缓存分页结果,以提高性能。这对于需要快速响应的客户端应用(如搜索页面)非常有帮助。

完整示例 Demo

下面是一个完整的 Flutter 示例,展示了如何在 Flutter 应用中使用 angel3_paginate 实现分页功能:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter 分页示例',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: PaginatedListScreen(),
    );
  }
}

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

class _PaginatedListScreenState extends State<PaginatedListScreen> {
  late Paginator<int> paginator;
  int currentPage = 1;

  [@override](/user/override)
  void initState() {
    super.initState();
    // 初始化分页器,假设我们有 100 个数据项
    List<int> data = List.generate(100, (index) => index + 1);
    paginator = Paginator(data, itemsPerPage: 10);
  }

  void _goToPage(int page) {
    setState(() {
      currentPage = page;
      paginator.goToPage(page);
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    var page = paginator.current!;

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter 分页示例'),
      ),
      body: Column(
        children: [
          Expanded(
            child: ListView.builder(
              itemCount: page.data.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text('Item ${page.data[index]}'),
                );
              },
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                ElevatedButton(
                  onPressed: page.hasPrevious ? () => _goToPage(page.previousPage!) : null,
                  child: Text('上一页'),
                ),
                Text('第 ${currentPage} 页 / 共 ${paginator.totalPages} 页'),
                ElevatedButton(
                  onPressed: page.hasNext ? () => _goToPage(page.nextPage!) : null,
                  child: Text('下一页'),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用angel3_paginate插件进行分页管理的示例代码。请注意,angel3_paginate主要用于服务器端分页逻辑,但我们可以结合Flutter客户端与Dart后端来展示一个完整的分页流程。在这个例子中,我们将使用Dart的HTTP客户端库与假设的后端API进行交互。

1. 添加依赖

首先,确保你的pubspec.yaml文件中包含必要的依赖项:

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3  # 用于HTTP请求
  angel3_paginate: ^x.y.z  # 请替换为最新版本号

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

2. 后端API(假设)

假设你有一个Dart后端API,它使用angel3_paginate来处理分页请求:

// server.dart
import 'package:angel3_framework/angel3_framework.dart';
import 'package:angel3_paginate/angel3_paginate.dart';

void main() {
  var app = Angel();

  // 模拟数据
  var items = List.generate(100, (index) => 'Item $index');

  // 配置分页服务
  app.use('/items', paginate(items, pageSize: 10));

  app.listen(3000);
  print('Server listening on port 3000');
}

这个简单的服务器在/items端点上提供了一个分页API。

3. Flutter客户端代码

现在,让我们在Flutter客户端中请求这个分页API:

// main.dart
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Pagination Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<String> items = [];
  int currentPage = 1;
  int totalPages = 0;

  @override
  void initState() {
    super.initState();
    fetchItems(currentPage);
  }

  Future<void> fetchItems(int page) async {
    var url = Uri.parse('http://localhost:3000/items?page=$page');
    var response = await http.get(url);

    if (response.statusCode == 200) {
      var data = jsonDecode(response.body) as Map<String, dynamic>;
      var paginatedItems = data['data'] as List<String>;
      totalPages = data['totalPages'] as int;

      setState(() {
        items = paginatedItems;
      });
    } else {
      throw Exception('Failed to load items');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Pagination Demo'),
      ),
      body: Column(
        children: <Widget>[
          Expanded(
            child: ListView.builder(
              itemCount: items.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(items[index]),
                );
              },
            ),
          ),
          SizedBox(height: 20),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              TextButton.icon(
                icon: Icon(Icons.arrow_back),
                label: Text('Previous'),
                onPressed: currentPage > 1 ? () => fetchItems(currentPage - 1) : null,
              ),
              SizedBox(width: 20),
              Text('Page $currentPage of $totalPages'),
              SizedBox(width: 20),
              TextButton.icon(
                icon: Icon(Icons.arrow_forward),
                label: Text('Next'),
                onPressed: currentPage < totalPages ? () => fetchItems(currentPage + 1) : null,
              ),
            ],
          ),
        ],
      ),
    );
  }
}

说明

  1. 后端server.dart文件启动了一个简单的Angel服务器,该服务器使用angel3_paginate对模拟数据进行分页。
  2. Flutter客户端main.dart文件包含了Flutter应用的主要逻辑。它使用http包向后端发送分页请求,并根据响应更新UI。分页控件(上一页/下一页按钮)根据当前页和总页数动态显示。

请确保你的后端服务器正在运行,并且Flutter应用有权访问该服务器(例如,通过允许本地主机连接)。这个示例是一个基本的实现,实际应用中可能需要处理更多的边缘情况和错误处理。

回到顶部