首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Flutter 零基础入门(三十九):Pull-to-Refresh 与列表分页 —— 完整列表交互实战

Flutter 零基础入门(三十九):Pull-to-Refresh 与列表分页 —— 完整列表交互实战

作者头像
LarryLan
发布2026-03-03 15:46:01
发布2026-03-03 15:46:01
330
举报

Pull-to-Refresh 与列表分页 —— 完整列表交互实战

到目前为止,你已经掌握了:

  • 网络请求获取列表数据(http / dio)
  • 异步更新 UI(Future / async / await)
  • 动态页面刷新(StatefulWidget + setState)

但是一个真实的 App 列表通常需要:

  • 下拉刷新数据
  • 上拉加载更多(分页)
  • 错误处理与加载提示

本篇,我们将把这些功能整合成 完整的列表交互示例


一、下拉刷新 RefreshIndicator

1️⃣ 基础用法

代码语言:javascript
复制
RefreshIndicator(
  onRefresh: _refreshData,
  child: ListView.builder(
    itemCount: _items.length,
    itemBuilder: (context, index) {
      return ListTile(title: Text(_items[index]));
    },
  ),
)

📌 功能:

  • 用户下拉 → 调用 _refreshData
  • 刷新数据后自动结束刷新动画

2️⃣ refreshData 示例

代码语言:javascript
复制
Future<void> _refreshData() async {
  await Future.delayed(Duration(seconds: 2)); // 模拟网络请求
  setState(() {
    _items = List.generate(20, (index) => '刷新数据 $index');
  });
}

📌 RefreshIndicator 只能包裹可滚动组件(ListView / GridView / SingleChildScrollView)


二、列表分页(上拉加载更多)

1️⃣ 使用 ScrollController

代码语言:javascript
复制
ScrollController _controller = ScrollController();

@override
void initState() {
  super.initState();
  _controller.addListener(() {
    if (_controller.position.pixels == _controller.position.maxScrollExtent) {
      _loadMore();
    }
  });
  _refreshData();
}

📌 当滚动到最底部 → 调用 _loadMore() 加载更多数据


2️⃣ 加载更多方法

代码语言:javascript
复制
Future<void> _loadMore() async {
  await Future.delayed(Duration(seconds: 2));
  setState(() {
    int currentLength = _items.length;
    _items.addAll(List.generate(10, (index) => '更多数据 ${currentLength + index}'));
  });
}

📌 简单模拟分页加载,真实项目中可结合 page 参数请求 API


三、完整示例:下拉刷新 + 上拉加载

代码语言:javascript
复制
class PullLoadListPage extends StatefulWidget {
  @override
  _PullLoadListPageState createState() => _PullLoadListPageState();
}

class _PullLoadListPageState extends State<PullLoadListPage> {
  List<String> _items = [];
  ScrollController _controller = ScrollController();

  @override
  void initState() {
    super.initState();
    _controller.addListener(() {
      if (_controller.position.pixels == _controller.position.maxScrollExtent) {
        _loadMore();
      }
    });
    _refreshData();
  }

  Future<void> _refreshData() async {
    await Future.delayed(Duration(seconds: 2));
    setState(() {
      _items = List.generate(20, (index) => '刷新数据 $index');
    });
  }

  Future<void> _loadMore() async {
    await Future.delayed(Duration(seconds: 2));
    setState(() {
      int currentLength = _items.length;
      _items.addAll(List.generate(10, (index) => '更多数据 ${currentLength + index}'));
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('列表分页示例')),
      body: RefreshIndicator(
        onRefresh: _refreshData,
        child: ListView.builder(
          controller: _controller,
          itemCount: _items.length,
          itemBuilder: (context, index) {
            return ListTile(title: Text(_items[index]));
          },
        ),
      ),
    );
  }
}

📌 功能总结:

  • 下拉刷新 → _refreshData
  • 上拉加载 → _loadMore
  • ScrollController → 监听滚动到底部
  • setState → 刷新 UI

四、优化建议

  • 下拉刷新与分页结合真实 API
  • 上拉加载时显示 CircularProgressIndicator
  • 分页时控制 hasMore → 避免重复加载
  • 错误处理 → 显示 SnackBar 提示

五、常见坑

❌ 忘记给 ListView 指定 ScrollController → 上拉监听无效 ❌ setState 内更新列表前没有先判断 mounted → 页面已销毁报错 ❌ 下拉刷新期间又触发上拉 → 数据重复 ❌ 分页数据太大 → 页面卡顿,可使用 ListView.builder 懒加载


六、本篇你真正掌握了什么?

你已经学会:

  • RefreshIndicator 下拉刷新
  • ScrollController 上拉加载更多
  • 分页列表 UI 渲染
  • 异步结合刷新 / 加载
  • 提升真实业务列表的交互体验

📌 到这里为止:

你的 App 列表功能已经接近真实生产环境水平


七、一句话总结

下拉刷新 + 上拉加载 = 完整列表交互 RefreshIndicator + ScrollController + setState 完成动态刷新


🔜 下一篇预告

《Flutter 零基础入门(四十):TabBar 与底部导航栏 —— 多页面切换与布局技巧》

下一篇我们将学习:

  • TabBar 实现顶部标签页
  • BottomNavigationBar 底部导航
  • 多页面切换与状态保持

🚀 实现完整多页面 App 框架

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Larry的Hub 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Pull-to-Refresh 与列表分页 —— 完整列表交互实战
    • 一、下拉刷新 RefreshIndicator
      • 1️⃣ 基础用法
      • 2️⃣ refreshData 示例
    • 二、列表分页(上拉加载更多)
      • 1️⃣ 使用 ScrollController
      • 2️⃣ 加载更多方法
    • 三、完整示例:下拉刷新 + 上拉加载
    • 四、优化建议
    • 五、常见坑
    • 六、本篇你真正掌握了什么?
    • 七、一句话总结
    • 🔜 下一篇预告
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档