博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flutter 扩展NestedScrollView (三)下拉刷新的解决
阅读量:6687 次
发布时间:2019-06-25

本文共 3453 字,大约阅读时间需要 11 分钟。

解决点之前的2个问题。开心的上项目试了下。完美。

FlutterCandies QQ群:181398081

但是在使用官方的下拉刷新 发现没法使用。

默默打开了源码,我们再来看一看。。

首先,我调试到这个,发现notification.depth不为0,其实也好理解,因为NestedScrollView里面有很多能滚动的东西。默认的RefreshIndicator要求的是必须是第一层的它才其效果。

/// A [ScrollNotificationPredicate] that checks whether/// `notification.depth == 0`, which means that the notification did not bubble/// through any intervening scrolling widgets.bool defaultScrollNotificationPredicate(ScrollNotification notification) {  return notification.depth == 0;}复制代码

那么我改成,再试试呢?

bool defaultScrollNotificationPredicate(ScrollNotification notification) {  return true;  return notification.depth == 0;}复制代码

在_handleScrollNotification方法中,我们可以看到会有很多ScrollNotification进来,不同的,当你滑动在一个不能滚动的list里面的时候,获取的viewportDimension是为0.。这会覆盖掉之前有viewportDimension的值。

所以我做了以下改动

double maxContainerExtent = 0.0;  bool _handleScrollNotification(ScrollNotification notification) {    if (!widget.notificationPredicate(notification)) return false;    maxContainerExtent = math.max(        notification.metrics.viewportDimension, this.maxContainerExtent);    if (notification is ScrollStartNotification &&        notification.metrics.extentBefore == 0.0 &&        _mode == null &&        _start(notification.metrics.axisDirection)) {      setState(() {        _mode = _RefreshIndicatorMode.drag;      });      return false;    }    bool indicatorAtTopNow;    switch (notification.metrics.axisDirection) {      case AxisDirection.down:        indicatorAtTopNow = true;        break;      case AxisDirection.up:        indicatorAtTopNow = false;        break;      case AxisDirection.left:      case AxisDirection.right:        indicatorAtTopNow = null;        break;    }    if (indicatorAtTopNow != _isIndicatorAtTop) {      if (_mode == _RefreshIndicatorMode.drag ||          _mode == _RefreshIndicatorMode.armed)        _dismiss(_RefreshIndicatorMode.canceled);    } else if (notification is ScrollUpdateNotification) {      if (_mode == _RefreshIndicatorMode.drag ||          _mode == _RefreshIndicatorMode.armed) {        if (notification.metrics.extentBefore > 0.0) {          _dismiss(_RefreshIndicatorMode.canceled);        } else {          _dragOffset -= notification.scrollDelta;          _checkDragOffset(maxContainerExtent);        }      }      if (_mode == _RefreshIndicatorMode.armed &&          notification.dragDetails == null) {        // On iOS start the refresh when the Scrollable bounces back from the        // overscroll (ScrollNotification indicating this don't have dragDetails        // because the scroll activity is not directly triggered by a drag).        _show();      }    } else if (notification is OverscrollNotification) {      if (_mode == _RefreshIndicatorMode.drag ||          _mode == _RefreshIndicatorMode.armed) {        _dragOffset -= notification.overscroll / 2.0;        _checkDragOffset(maxContainerExtent);      }    } else if (notification is ScrollEndNotification) {      switch (_mode) {        case _RefreshIndicatorMode.armed:          _show();          break;        case _RefreshIndicatorMode.drag:          _dismiss(_RefreshIndicatorMode.canceled);          break;        default:          // do nothing          break;      }    }    return false;  }复制代码

对于NestedScrollView 来说。我们只需要关注最大能滚动viewportDimension,用这个来驱动整个下拉刷新.

Sample Code

用法跟官方一致

return NestedScrollViewRefreshIndicator(      onRefresh: onRefresh,      child: extended.NestedScrollView(复制代码

最后放上 ,如果你有更好的方式解决这个问题或者有什么不明白的地方,都请告诉我,由衷感谢。

转载地址:http://iueao.baihongyu.com/

你可能感兴趣的文章
matlab GUI之 -- 绘图
查看>>
[转]车牌识别及验证码识别的一般思路
查看>>
[javaEE] javaweb的mvc设计思想
查看>>
Android中dip、dp、sp、pt和px的区别
查看>>
对比Linux系统和Windows系统哪个更好
查看>>
Tesseract-OCR 字符识别---样本训练
查看>>
GIS-007-Terrain跨域访问
查看>>
CentOS搭建LNMP环境
查看>>
进程与线程
查看>>
<转>关闭 程序崩溃时 windows 正在检查该问题的解决方案
查看>>
每天一个linux命令(7):mv命令
查看>>
树莓派进阶之路 (010) - 树莓派raspi-config配置(转)
查看>>
SQL中PIVOT 行列转换
查看>>
C# ini文件操作【源码下载】
查看>>
基于iscroll.js实现下拉刷新和上拉加载特效
查看>>
【日常小记】统计后缀名为.cc、.c、.h的文件数【转】
查看>>
C#窗体的加载等待(BackgroundWorker控件)实现
查看>>
Windows Server 2016
查看>>
为什么说invalidate()不能直接在线程中调用
查看>>
Centos7中systemctl命令详解
查看>>