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…