flutter_easy_refresh在3.38.3配合NestedScrollView的注意要点。

背景

easy_refresh已经有一段时间没有更新了,不知道这个问题跟flutter版本有没有关系。

问题点

下拉刷新松开之后,刷新完成,会导致大片头部区域空白,一直不消失。

问题原因

当手势松开之后flutter-sdk里面会调用ScrollPositionwithsinglecontext.goBallistic,导致NestScrollViewgoBallistic无法被通知,如下图。

然后结果就是EasyRefresh的头部指示器已经消失,但是滑动控制器的滑动并没有被触发。

相关代码位置

【计算位置】overExtent of D:\Pub\hosted\pub.flutter-io.cn\easy_refresh-3.4.0\lib\src\notifier\indicator_notifier.dart
【返回结果刷新结果】: _onRefresh of D:\Pub\hosted\pub.flutter-io.cn\easy_refresh-3.4.0\lib\src\easy_refresh.dart
【指示器计算位置】_calculateOffset of D:\Pub\hosted\pub.flutter-io.cn\easy_refresh-3.4.0\lib\src\notifier\indicator_notifier.dart
监听用户滑动到的位置:_onUserOffset of D:\Pub\hosted\pub.flutter-io.cn\easy_refresh-3.4.0\lib\src\notifier\indicator_notifier.dart

解决方案

使用EasyRefresh.builder配合取innerController,复用physics最好。

示例代码

dart 复制代码
class _RoomListContent extends StatefulWidget {
  const _RoomListContent({required this.topPadding});

  final bool topPadding;

  @override
  State<_RoomListContent> createState() => _RoomListContentState();
}

class _RoomListContentState extends State<_RoomListContent> {
  late final ScrollController innerController = PrimaryScrollController.of(context);

  @override
  Widget build(BuildContext context) {
    return EasyRefresh.builder(
      scrollController: innerController,
      onRefresh: () => provider.refresh(),
      onLoad: () => provider.loadMore(),
      childBuilder: (BuildContext context, ScrollPhysics physics) => CustomScrollView(
        controller: innerController,
        physics: physics,
        slivers: <Widget>[
        .....你的具体组件内容
相关推荐
爱吃大芒果2 小时前
从零开始学 Flutter:状态管理入门之 setState 与 Provider
开发语言·javascript·flutter
庄雨山2 小时前
Flutter+开源鸿蒙实战:cached_network_image 图片加载体验优化全指南
flutter·openharmonyos
三七吃山漆2 小时前
攻防世界——fakebook
android·网络安全·web·ctf
二川bro3 小时前
类型错误详解:Python TypeError排查手册
android·java·python
TeleostNaCl3 小时前
在小米 Hyper OS 2 上使用开发者选项关闭视频彩铃功能
android·经验分享
_李小白3 小时前
【Android FrameWork】延伸阅读:Activity生命周期
android
克喵的水银蛇4 小时前
Flutter 通用标签组件:TagWidget 一键实现多风格标签展示
flutter
克喵的水银蛇4 小时前
Flutter 通用空状态组件:EmptyWidget 一键实现多场景空状态展示
flutter
_李小白4 小时前
【Android FrameWork】第二十五天:Service的启动
android