Flutter分页管理插件modest_pagination的使用

Flutter分页管理插件modest_pagination的使用

ModestPagination 是一个简单的分页组件(它最符合我的需求,并且可能也适合您的需求)。

使用

添加依赖

pubspec.yaml 文件中添加 modest_pagination 依赖:

dependencies:
  modest_pagination: <version>

或者通过命令行添加:

flutter pub add modest_pagination

导入包

在 Dart 文件中导入 modest_pagination 包:

import 'package:modest_pagination/modest_pagination.dart';

示例代码

以下是一个完整的示例,展示了如何使用 ModestPagination 组件来分页显示国家列表。

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Modest Pagination Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Modest Pagination Example'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<Map<String, dynamic>> countries = [
    {"name": "阿富汗", "code": "AF"},
    {"name": "奥兰群岛", "code": "AX"},
    {"name": "阿尔巴尼亚", "code": "AL"},
    // ... 更多国家 ...
    {"name": "津巴布韦", "code": "ZW"}
  ];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Container(
        height: MediaQuery.of(context).size.height,
        width: MediaQuery.of(context).size.width, // 修正了宽度设置错误
        alignment: Alignment.center,
        child: Container(
          height: MediaQuery.of(context).size.height * 0.6,
          margin: const EdgeInsets.symmetric(
            horizontal: 30,
          ),
          padding: const EdgeInsets.symmetric(
            horizontal: 10,
            vertical: 5,
          ),
          decoration: BoxDecoration(
            color: Colors.blue,
            borderRadius: BorderRadius.circular(20),
            boxShadow: [
              BoxShadow(
                color: Colors.black.withOpacity(0.9),
                blurRadius: 1,
                spreadRadius: 0.2,
                offset: const Offset(0.5, 0.5),
              ),
            ],
          ),
          child: ModestPagination(
            items: countries,
            itemsPerPage: 8,
            pagesPerSheet: 6,
            activeTextColor: Colors.white,
            inactiveTextColor: Colors.white70,
            pagesControllerIconsColor: Colors.white,
            sheetsControllerIconsColor: Colors.white,
            useListView: true,
            childWidget: (Map<String, dynamic> element) {
              return Container(
                padding: const EdgeInsets.symmetric(
                  horizontal: 10,
                  vertical: 5,
                ),
                margin: const EdgeInsets.symmetric(
                  vertical: 5,
                ),
                decoration: BoxDecoration(
                  color: Colors.white,
                  borderRadius: BorderRadius.circular(15),
                  boxShadow: [
                    BoxShadow(
                      color: Colors.white.withOpacity(0.9),
                      blurRadius: 1,
                      spreadRadius: 0.2,
                      offset: const Offset(0.5, 0.5),
                    ),
                  ],
                ),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Text(
                      "${element["name"]}",
                      style: const TextStyle(
                        color: Colors.black,
                        fontWeight: FontWeight.bold,
                        fontSize: 16,
                      ),
                    ),
                    Text(
                      "代码: ${element["code"]}",
                      style: const TextStyle(
                        color: Colors.black54,
                        fontWeight: FontWeight.normal,
                        fontSize: 14,
                      ),
                    ),
                  ],
                ),
              );
            },
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


modest_pagination 是一个用于 Flutter 的分页管理插件,它可以帮助你轻松地实现分页功能。以下是如何使用 modest_pagination 插件的基本步骤。

1. 添加依赖

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

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

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

2. 基本使用

2.1 创建一个分页控制器

modest_pagination 提供了一个 PaginationController 类,你可以使用它来管理分页数据。

import 'package:modest_pagination/modest_pagination.dart';

class MyPaginationController extends PaginationController<MyDataModel> {
  [@override](/user/override)
  Future<List<MyDataModel>> loadPage(int page) async {
    // 在这里实现从服务器或本地加载数据的逻辑
    // 例如,使用 API 请求获取数据
    final response = await api.getData(page);
    return response.data;
  }
}

2.2 在 UI 中使用分页控制器

你可以在 ListViewGridView 中使用 PaginationController 来显示分页数据。

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

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

class _MyPaginationPageState extends State<MyPaginationPage> {
  final MyPaginationController _controller = MyPaginationController();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('分页示例'),
      ),
      body: PaginationListView<MyDataModel>(
        controller: _controller,
        itemBuilder: (context, item, index) {
          return ListTile(
            title: Text(item.name),
            subtitle: Text(item.description),
          );
        },
        loadingBuilder: (context) {
          return Center(child: CircularProgressIndicator());
        },
        errorBuilder: (context, error) {
          return Center(child: Text('加载失败: $error'));
        },
      ),
    );
  }
}

3. 高级功能

3.1 自定义加载更多和错误提示

你可以通过 loadingBuildererrorBuilder 来自定义加载更多和错误提示的 UI。

PaginationListView<MyDataModel>(
  controller: _controller,
  itemBuilder: (context, item, index) {
    return ListTile(
      title: Text(item.name),
      subtitle: Text(item.description),
    );
  },
  loadingBuilder: (context) {
    return Padding(
      padding: EdgeInsets.all(16.0),
      child: Center(child: CircularProgressIndicator()),
    );
  },
  errorBuilder: (context, error) {
    return Padding(
      padding: EdgeInsets.all(16.0),
      child: Center(child: Text('加载失败: $error')),
    );
  },
);

3.2 手动触发加载更多

你可以通过 PaginationControllerloadNextPage 方法手动触发加载更多数据。

_controller.loadNextPage();

3.3 重置分页数据

你可以通过 PaginationControllerreset 方法重置分页数据。

_controller.reset();

4. 完整示例

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

class MyDataModel {
  final String name;
  final String description;

  MyDataModel(this.name, this.description);
}

class MyPaginationController extends PaginationController<MyDataModel> {
  [@override](/user/override)
  Future<List<MyDataModel>> loadPage(int page) async {
    // 模拟从服务器加载数据
    await Future.delayed(Duration(seconds: 2));
    return List.generate(10, (index) => MyDataModel('Item ${page * 10 + index}', 'Description ${page * 10 + index}'));
  }
}

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

class _MyPaginationPageState extends State<MyPaginationPage> {
  final MyPaginationController _controller = MyPaginationController();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('分页示例'),
      ),
      body: PaginationListView<MyDataModel>(
        controller: _controller,
        itemBuilder: (context, item, index) {
          return ListTile(
            title: Text(item.name),
            subtitle: Text(item.description),
          );
        },
        loadingBuilder: (context) {
          return Padding(
            padding: EdgeInsets.all(16.0),
            child: Center(child: CircularProgressIndicator()),
          );
        },
        errorBuilder: (context, error) {
          return Padding(
            padding: EdgeInsets.all(16.0),
            child: Center(child: Text('加载失败: $error')),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          _controller.loadNextPage();
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(
    home: MyPaginationPage(),
  ));
}
回到顶部