Flutter分页网络请求插件http_pagination的使用

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

Flutter分页网络请求插件http_pagination的使用

http_pagination是一个用于解析HTTP响应头中的分页信息的Flutter插件。它能够处理基于页码和游标的分页方式,支持从链接头中提取分页信息,并返回相应的分页数据。

特性

  • 解析包含分页信息的HTTP头部(符合RFC 5988标准的Web链接)
  • 支持页码分页(Page-based pagination)和游标分页(Cursor-based pagination)

开始使用

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

dependencies:
  http_pagination: ^0.2.2

然后运行flutter pub get来安装该包。

使用方法

页码分页示例

import 'package:http_pagination/http_pagination.dart';

void main() {
  final headers = {
    'link': [
      '<https://api.github.com/user/9287/repos?page=3&per_page=100>; rel="next", ' +
      '<https://api.github.com/user/9287/repos?page=1&per_page=100>; rel="prev", ' +
      '<https://api.github.com/user/9287/repos?page=5&per_page=100>; rel="last"'
    ],
  };
  
  final pagination = PagesPagination.fromHeaders(headers);
  print(pagination); // 输出: PagesPagination(first: null, next: 3, prev: 1, last: 5)
}

游标分页示例

import 'package:http_pagination/http_pagination.dart';

void main() {
  final cursorHeaders = {
    'link': [
      '<http://example.com/items?cursor=a>; rel="first", ' +
      '<http://example.com/items?cursor=b>; rel="next", ' +
      '<http://example.com/items?cursor=c>; rel="prev", ' +
      '<http://example.com/items?cursor=d>; rel="last"',
    ],
  };

  final cPagination = CursorPagination.fromHeaders(cursorHeaders);
  print(cPagination); // 输出: CursorPagination(first: a, next: b, prev: c, last: d)
}

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

1 回复

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


当然,下面是一个关于如何在Flutter中使用http_pagination插件进行分页网络请求的示例代码。这个插件可以方便地处理分页数据请求,并自动管理分页逻辑。

首先,确保你已经在pubspec.yaml文件中添加了http_pagination依赖:

dependencies:
  flutter:
    sdk: flutter
  http_pagination: ^x.y.z  # 请替换为最新版本号

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

接下来,让我们编写一个示例,展示如何使用http_pagination进行分页网络请求。假设我们有一个API,它返回分页的JSON数据,结构如下:

{
  "data": [
    {"id": 1, "title": "Item 1"},
    {"id": 2, "title": "Item 2"},
    // 更多数据...
  ],
  "meta": {
    "current_page": 1,
    "last_page": 10,
    "per_page": 10
  }
}

示例代码

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  final PaginationController<dynamic> _paginationController = PaginationController();

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

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

  void _fetchData() {
    _paginationController.fetchPage(
      pageKey: (page) => page,
      requestMethod: (pageKey) async {
        final response = await http.get(
          Uri.parse('https://api.example.com/items?page=$pageKey'),
        );
        if (response.statusCode == 200) {
          final data = jsonDecode(response.body);
          return PaginationResponse<dynamic>(
            items: data['data'],
            hasNextPage: pageKey < data['meta']['last_page'],
          );
        } else {
          throw Exception('Failed to load data');
        }
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Pagination Example'),
      ),
      body: RefreshIndicator(
        onRefresh: () async {
          _paginationController.resetPages();
          await _fetchData();
        },
        child: _paginationController.buildPages(
          itemBuilder: (context, item, index) {
            return ListTile(
              title: Text(item['title']),
            );
          },
          loadingWidget: Center(child: CircularProgressIndicator()),
          errorWidget: Center(child: Text('Error loading data')),
          noMoreItemsWidget: Center(child: Text('No more items')),
        ),
      ),
    );
  }
}

代码解释

  1. 依赖和导入

    • 导入flutterhttphttp_pagination包。
  2. 主应用

    • 创建一个简单的MaterialApp,并在其中定义MyHomePage
  3. 分页控制器

    • 使用PaginationController来管理分页状态。
  4. 数据获取

    • initState中调用_fetchData方法来初始化数据请求。
    • _fetchData方法使用PaginationControllerfetchPage方法来进行分页请求。
    • requestMethod参数是一个异步函数,它接受一个页面键(页码)并返回一个PaginationResponse对象。这个对象包含当前页的数据和是否有下一页的信息。
  5. UI构建

    • 使用RefreshIndicator实现下拉刷新功能。
    • 使用_paginationController.buildPages方法来构建分页列表。
    • itemBuilder参数定义了如何构建每个列表项。
    • loadingWidgeterrorWidgetnoMoreItemsWidget分别定义了加载中、出错和无更多项时的UI。

这个示例展示了如何使用http_pagination插件来简化分页网络请求的处理,并自动管理分页逻辑和UI更新。你可以根据实际需求对代码进行修改和扩展。

回到顶部