关于NestedScrollView下拉刷新问题

·  阅读 870

NestedScrollView中的下拉刷新一般都用到NestedScrollViewRefreshIndicator控件,

项目中使用NestedScrollViewRefreshIndicator出现了一些问题,记录一下,希望能帮到一些困扰的人. 我们遇到的问题是,当NestedScrollView中使用headerSliverBuilder时该方法每次拖动会被调用多次,导致每次拖动,如果在headerSliverBuilder中有存在带有状态的widget时,状态被刷新,回归到初始状态,比如一个滚动广告banner,也会照成一些屏幕卡顿,频繁刷新的问题. 该问题由NestedScrollViewRefreshIndicator控件中的刷新导致. 查看NestedScrollViewRefreshIndicator中build代码:

Widget build(BuildContext context) {
  assert(debugCheckHasMaterialLocalizations(context));
  final Widget child = NotificationListener<ScrollNotification>(
    key: _key,
    onNotification: _handleScrollNotification,
    child: NotificationListener<OverscrollIndicatorNotification>(
      onNotification: _handleGlowNotification,
      child: widget.child,
    ),
  );
复制代码

发现,build中会自己生成一个Widget,把我们传进去的widget.child包裹进去,而该控件中多次调用setState方法.该方法会刷新整个控件,控件中包含widget.child,所以我们的widget也会被多次调用,进行多次刷新.其中

_handleScrollNotification
复制代码

方法中

    notification.metrics.extentBefore == 0.0 &&
    _mode == null &&
    _start(notification.metrics.axisDirection)) {

  setState(() {
    _mode = _RefreshIndicatorMode.drag;
  });
  return false;
}
复制代码

是重点刷新问题所在. 问题找到了,方法就好办了.让该控件刷新的时候只刷新他自己即可,就是那个下拉的load图按显示. 主要思路就是提取loading控件,单独刷新. 调整代码较多,需要的同学可以下载使用或查看.使用方式和原有方法相同 附件没法传,贴上github地址: github.com/190709670/h…

分类:
代码人生
标签:
分类:
代码人生
标签: