D4-D6 -Flutter下拉刷新与上拉加载实战
本文介绍了Flutter实现下拉刷新和上拉加载功能的方法与注意事项。作者使用VSCode开发时遇到模拟器闪退问题,通过清理缓存和重新构建解决。在实现下拉刷新功能时,需注意依赖引用和运行速度问题;上拉加载功能与下拉刷新原理相似。文中还分享了代码标红问题的解决方法(重启分析服务器),并提到状态提示已集成在上下拉操作中。作者认为Flutter提供了便捷的方法降低开发难度,建议开发者多加利用。文章最后提供
✅️分析:
实现下拉刷新本质就是Flutter的RefreshIndicator组件监听滑动事件,触发接口请求。下拉数据加载本质就是监听滚动到底部的事件,触发分页接口请求。多场景提示本质就是根据数据不同渲染不同的UI界面。今天我整体用的是VS Code进行代码编辑的。
❓️问题一
在驱动运行模拟机时第一次出现闪退的情况,清理构建缓存和重新生成目录结构是解决资源缺失问题的有效方法。执行以下命令序列可确保构建环境干净:(第一次尝试)
flutter clean
flutter pub get
flutter run
结果如下图显示,具体问题是资源目录的缺失,创建过程中生成的Flutter-assest目录存放资源没有被正确创建,造成了一系列的连锁反应;我现在进行第二次尝试。

# 1. 清理Flutter缓存
flutter clean
# 2. 删除鸿蒙侧的构建目录(手动清理残留)
rm -r build/ohos
# 3. 重新安装依赖
flutter pub get
# 4. 重新构建并运行
flutter run
我已经可以成功运行

以上是因为我换用VS Code设备造成的小问题,如果不更换设备不会出现类似问题,如果有和我想要更换设备遇到类似问题的可以参考一下,还是比较简单的。
✅️第一步 下拉刷新
这一步代码操作比较简单,但是要注意引用相关的依赖,我没有遇见什么大问题,只有在驱动时运行比较慢,如果等待时间过长时建议❗️可以把运行关闭重新开启驱动会相对快一些。
添加配置,使用pull_to_refresh库时需要确保控制器正确管理生命周期。
dependencies:
flutter:
sdk: flutter
dio: ^5.4.3+1 # 你已有的网络请求库
pull_to_refresh: ^2.0.0 # 新增:下拉刷新库
例子:改前代码(无控制器释放)
@override
void dispose() {
super.dispose();
}
改后代码(释放刷新控制器)
@override
void dispose() {
_refreshController.dispose();
super.dispose();
}
改前代码(无刷新功能)
if (postList.isEmpty) {
return const Center(
child: Text("暂无任务数据", style: TextStyle(fontSize: 16, color: Colors.grey)),
);
}
return ListView.builder(
padding: const EdgeInsets.all(10),
itemCount: postList.length,
itemBuilder: (context, index) {
Post post = postList[index];
return Card(/* 列表项内容 */);
},
);
改后代码(刷新容器)
if (postList.isEmpty) {
return const Center(
child: Text("暂无任务数据", style: TextStyle(fontSize: 16, color: Colors.grey)),
);
}
return SmartRefresher(
controller: _refreshController,
enablePullDown: true,
enablePullUp: false,
onRefresh: () async {
await _fetchData(isRefresh: true);
},
header: const ClassicHeader(
refreshingText: "正在刷新...",
completeText: "刷新成功",
failedText: "刷新失败",
idleText: "下拉可以刷新",
),
child: ListView.builder(
padding: const EdgeInsets.all(10),
itemCount: postList.length,
itemBuilder: (context, index) {
Post post = postList[index];
return Card(/* 列表项内容 */);
},
),
);

❓️问题二
我最开始写的代码没有出现错误但是会标红,运行时也不会造成错误,很大可能是语法的延迟,重启Dart分析服务可解决多数语法高亮异常。如果这个影响自己的判断可以进行如下操作:
VS Code命令面板(Ctrl+Shift+P)
输入并执行Dart: Restart Analysis Server
等待IDE右下角状态栏提示重建索引完成
✅️第二步 上拉加载
例子:改前代码(只有下拉加载)
class _TaskListPageState extends State<TaskListPage> {
List<Post> postList = [];
bool isLoading = true;
String? errorMsg;
final RefreshController _refreshController = RefreshController(initialRefresh: false);
// 页面初始化时自动执行:获取数据
@override
void initState() {
super.initState();
_fetchData();
}
}
改后代码(新增上拉加载)
class _TaskListPageState extends State<TaskListPage> {
List<Post> postList = [];
bool isLoading = true;
String? errorMsg;
final RefreshController _refreshController = RefreshController(initialRefresh: false);
int _currentPage = 1;
bool _hasMore = true;
@override
void initState() {
super.initState();
_fetchData();
}
}
改前代码(仅有下拉刷新)
Future<void> _fetchData({bool isRefresh = false}) async {
try {
await _fetchNetworkData();
if (isRefresh) {
_refreshController.refreshCompleted();
}
} catch (e) {
await _fetchLocalData();
if (isRefresh) {
_refreshController.refreshFailed();
}
}
}
改后代码(支持上拉加载)
Future<void> _fetchData({bool isRefresh = false, bool isLoadMore = false}) async {
try {
// 🔧 新增:上拉加载时页码+1,下拉刷新时重置页码
if (isLoadMore) {
_currentPage++;
}
if (isRefresh) {
_currentPage = 1;
_hasMore = true;
}
await _fetchNetworkData();
if (isRefresh) {
_refreshController.refreshCompleted();
}
if (isLoadMore) {
if (_hasMore) {
_refreshController.loadComplete();
} else {
_refreshController.loadNoData();
}
}
} catch (e) {
if (isLoadMore) {
_currentPage--;
_refreshController.loadFailed();
}
await _fetchLocalData();
if (isRefresh) {
_refreshController.refreshFailed();
}
}
}

这一步可以成功运行,因为所用到的方法和下拉刷新基本一致,所以不需要再配置依赖,本质上他们属于一种方法,运行截止目前我没有遇到什么比较有价值的问题,如果大家有疑问可以联系一下相互交流。
➕️补充
我的状态提示已经包含在上拉和下拉的提醒中,所以也不再过多赘述。常见问题的排查:
刷新动画卡顿:检查ListView是否包含复杂子组件
重复数据:确保下拉刷新时清空原列表
加载锁死:在catch块中调用loadFailed()
页面跳转异常:使用Navigator.push而非pushReplacement保持页面栈
总结
从今天的内容开始主要是进行代码层面的编辑,前期的配置已经全部完成,如果大家有对前期的配置还有疑问可以看往期内容也可以联系我一起分享解决。对于今天的内容我个人认为是比较好实现的,Flutter里面提供了很多完整好用的方法大大降低了我们的操作成本,推荐大家多多使用。
欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net
更多推荐


所有评论(0)