✅️分析:

实现下拉刷新本质就是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

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐