Flutter 下拉刷新上拉加载分页的实现

16 min read

Flutter 提供了很多实现下拉刷新和上拉加载操作的库,比如 flutter_easyrefresh、refresh、pull_to_refresh 等等。

其中,以 flutter_easyrefresh 为例,它提供了非常方便的下拉刷新和上拉加载的实现。

  1. 首先,通过在 pubspec.yaml 文件中添加依赖,引入 flutter_easyrefresh:
dependencies:
  flutter_easyrefresh: ^2.2.0
  1. 在需要使用下拉刷新和上拉加载的界面中,添加 EasyRefresh 组件:
import 'package:flutter_easyrefresh/easy_refresh.dart';

class MyPage extends StatefulWidget {
  @override
  _MyPageState createState() => _MyPageState();
}

class _MyPageState extends State<MyPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('My Page'),
      ),
      body: EasyRefresh(
        onRefresh: () async {
          // 这里添加下拉刷新的处理逻辑
        },
        onLoad: () async {
          // 这里添加上拉加载的处理逻辑
        },
        child: ListView.builder(
          itemCount: 20,
          itemBuilder: (BuildContext context, int index) {
            return ListTile(
              title: Text('Item $index'),
            );
          },
        ),
      ),
    );
  }
}
  1. 在上面的代码中,我们通过 EasyRefresh 组件提供的 onRefresh 和 onLoad 方法实现下拉刷新和上拉加载的逻辑。

  2. 如果需要实现分页效果,我们可以在 onLoad 方法中获取更多数据,并将其添加到 ListView 中即可。比如:

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter_easyrefresh/easy_refresh.dart';

class MyPage extends StatefulWidget {
  @override
  _MyPageState createState() => _MyPageState();
}

class _MyPageState extends State<MyPage> {
  List<String> _dataList = [];

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

    // 初始化数据源
    _dataList.addAll(List.generate(20, (index) => 'Item $index'));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('My Page'),
      ),
      body: EasyRefresh(
        onRefresh: () async {
          // 这里添加下拉刷新的处理逻辑
          setState(() {
            _dataList.clear();
            _dataList.addAll(List.generate(20, (index) => 'Item $index'));
          });
        },
        onLoad: () async {
          // 这里添加上拉加载的处理逻辑
          await Future.delayed(Duration(seconds: 2));

          setState(() {
            _dataList.addAll(List.generate(10, (index) => 'Item ${_dataList.length}'));
          });
        },
        child: ListView.builder(
          itemCount: _dataList.length,
          itemBuilder: (BuildContext context, int index) {
            return ListTile(
              title: Text(_dataList[index]),
            );
          },
        ),
      ),
    );
  }
}
  1. 在上面的代码中,我们定义了一个 _dataList 变量来保存数据源,在 initState 方法中进行了初始化。

  2. 在 onRefresh 和 onLoad 方法中,我们分别实现了下拉刷新和上拉加载的逻辑。下拉刷新时,我们清空数据源并重新添加 20 条数据;上拉加载时,我们通过 Future.delayed 方法模拟了一个 2 秒的异步操作,并向数据源中添加 10 条数据。

  3. 在 EasyRefresh 中,我们可以使用 ListView.builder 来构建列表,通过 itemCount 和 itemBuilder 方法来指定列表的数量和每个 item 的布局。

总的来说,Flutter 提供的下拉刷新和上拉加载的库非常方便且易用,只需要几行代码就可以实现,大大提升了开发效率。