Flutter分页插件andomie_pagination的使用

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

Flutter分页插件andomie_pagination的使用

功能介绍

Pagination 类为 Flutter 应用程序提供了分页状态管理和数据检索的功能。它支持按滚动加载数据,处理滚动事件,并在有新数据可用时通知用户。通过预加载和错误处理等功能,简化了分页列表或网格的实现。

特性

  • 按滚动分页加载数据。

使用方法

短示例

以下是一个简单的使用示例:

import 'package:andomie_pagination/pagination.dart';

void main() {
  final pagination = Pagination<int>.init('example');
  pagination.paginate(
    controller: ScrollController(), // 提供一个 ScrollController
    callback: (config) async {
      // 数据获取逻辑
      return PaginationResponse.value(result: [1, 2, 3], snapshot: 1);
    },
    notifier: (value) {
      // 处理获取到的数据
      print(value);
    },
  );
}

长示例

以下是一个完整的长示例,展示如何在 Flutter 应用中集成分页功能:

初始化分页实例

import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:andomie_pagination/pagination.dart';

const kNumbersPagination = "numbers";

void main() {
  // 初始化分页实例
  Pagination.init<String>(
    kNumbersPagination,
    initialSize: 5, // 初始加载的数据条数
    fetchingSize: 5, // 每次加载的新数据条数
    limit: 1000, // 最大数据量限制
    preload: 1000, // 预加载的数据量
  );
  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter 分页',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

定义分页逻辑

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

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

class _MyHomePageState extends State<MyHomePage> {
  final _scrollController = ScrollController();

  Future<PaginationResponse<String>> loadData(PaginationConfig config) {
    return Future.delayed(const Duration(seconds: 2)).then((_) {
      final page = config.snapshotAsPage;
      final fetchingSize = config.fetchingSize;
      final items = List.generate(fetchingSize, (i) {
        final number =
            Pagination.realIndexOf<String>(kNumbersPagination, i) + 1;
        return "Item number is $number";
      });
      return PaginationResponse.value(result: items, snapshot: page + 1);
    });
  }

  [@override](/user/override)
  void initState() {
    super.initState();
    // 将分页逻辑应用到 ScrollController
    Pagination.apply<String>(
      kNumbersPagination,
      controller: _scrollController,
      callback: loadData,
      notifier: (data) {
        log('新数据加载: $data');
        setState(() {});
      },
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: const Color(0xfff1f1f1),
      appBar: AppBar(
        title: const Text(
          "FLUTTER 分页",
          style: TextStyle(
            fontWeight: FontWeight.bold,
          ),
        ),
        centerTitle: true,
      ),
      floatingActionButton: FloatingActionButton.extended(
        onPressed: () => Pagination.reloadOf<String>(kNumbersPagination),
        backgroundColor: Theme.of(context).primaryColor,
        label: const Text(
          "重新加载",
          style: TextStyle(
            fontWeight: FontWeight.bold,
            color: Colors.white,
          ),
        ),
        shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)),
      ),
      body: ListView.builder(
        padding: const EdgeInsets.symmetric(vertical: 16),
        controller: _scrollController,
        itemCount: Pagination.itemCountOf<String>(kNumbersPagination),
        itemBuilder: (context, index) {
          final item = Pagination.itemOf<String>(kNumbersPagination, index);
          if (item.isPlaceholder) {
            return const NumberItemPlaceholder();
          } else {
            return NumberItem(item: item.data!);
          }
        },
      ),
    );
  }
}

自定义分页项

class NumberItem extends StatelessWidget {
  final String item;

  const NumberItem({
    super.key,
    required this.item,
  });

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      height: 100,
      margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
      padding: const EdgeInsets.all(20),
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(20),
      ),
      alignment: Alignment.center,
      child: Text(
        item,
        style: const TextStyle(
          color: Colors.black,
          fontWeight: FontWeight.bold,
          fontSize: 24,
        ),
      ),
    );
  }
}

class NumberItemPlaceholder extends StatelessWidget {
  const NumberItemPlaceholder({
    super.key,
  });

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      height: 100,
      margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
      padding: const EdgeInsets.all(20),
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(20),
      ),
      alignment: Alignment.center,
      child: const CircularProgressIndicator(),
    );
  }
}

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

1 回复

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


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

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  andomie_pagination: ^1.0.0  # 请检查最新版本

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

2. 导入包

在你的 Dart 文件中导入 andomie_pagination 包:

import 'package:andomie_pagination/andomie_pagination.dart';

3. 使用 PaginationController

PaginationControllerandomie_pagination 的核心类,它负责管理分页逻辑。你可以通过它来加载数据、监听分页状态等。

class MyPaginationWidget extends StatefulWidget {
  @override
  _MyPaginationWidgetState createState() => _MyPaginationWidgetState();
}

class _MyPaginationWidgetState extends State<MyPaginationWidget> {
  final PaginationController<int, MyDataModel> _paginationController =
      PaginationController<int, MyDataModel>(
    initialPage: 1,
    pageSize: 10,
    fetchData: (int page, int pageSize) async {
      // 这里实现你的数据获取逻辑
      // 例如从 API 获取数据
      final response = await myApi.getData(page, pageSize);
      return PaginationResult(
        items: response.data,
        totalItems: response.totalItems,
      );
    },
  );

  @override
  void initState() {
    super.initState();
    _paginationController.loadFirstPage();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Pagination Example'),
      ),
      body: PaginationListView<int, MyDataModel>(
        paginationController: _paginationController,
        itemBuilder: (context, item, index) {
          return ListTile(
            title: Text(item.name),
            subtitle: Text(item.description),
          );
        },
        emptyWidget: Center(
          child: Text('No data available'),
        ),
        errorWidget: (error) {
          return Center(
            child: Text('Error: $error'),
          );
        },
        loadingWidget: Center(
          child: CircularProgressIndicator(),
        ),
        loadMoreWidget: Center(
          child: Padding(
            padding: EdgeInsets.all(16.0),
            child: CircularProgressIndicator(),
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _paginationController.dispose();
    super.dispose();
  }
}

4. 解释代码

  • PaginationController: 这是分页控制器,负责管理分页逻辑。你需要提供一个 fetchData 函数来获取数据。
  • PaginationListView: 这是一个 ListView,它会根据 PaginationController 的状态来显示数据、加载更多、显示错误等。
  • itemBuilder: 用于构建每个列表项的 UI。
  • emptyWidget: 当没有数据时显示的 Widget。
  • errorWidget: 当加载数据出错时显示的 Widget。
  • loadingWidget: 当加载数据时显示的 Widget。
  • loadMoreWidget: 当加载更多数据时显示的 Widget。

5. 处理分页逻辑

fetchData 函数中,你需要实现从 API 或其他数据源获取数据的逻辑。返回的 PaginationResult 包含当前页的数据和总数据量。

6. 加载更多数据

PaginationListView 会自动处理滚动到底部时加载更多数据的逻辑。你不需要手动调用 loadNextPage,除非你有特殊需求。

7. 其他功能

andomie_pagination 还支持其他功能,如刷新数据、跳转到指定页等。你可以通过 PaginationController 的方法来实现这些功能。

8. 示例 API 调用

假设你有一个 API 可以获取分页数据,你可以这样实现 fetchData 函数:

fetchData: (int page, int pageSize) async {
  final response = await http.get(Uri.parse('https://api.example.com/data?page=$page&pageSize=$pageSize'));
  if (response.statusCode == 200) {
    final data = jsonDecode(response.body);
    return PaginationResult(
      items: List<MyDataModel>.from(data['items'].map((x) => MyDataModel.fromJson(x))),
      totalItems: data['totalItems'],
    );
  } else {
    throw Exception('Failed to load data');
  }
},
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!