前言
上篇文章讲了通过修正偏移量来解决粘性头部切换过程中偶尔会有空隙的问题,写上篇文章的过程中,我发现我走了弯路,所以现在换另一种方式来计算头部组件相对滚动组件的偏移量,这种方式计算量更少。
项目地址
性能优化
上篇文章中出现的偏移量关系图:
从图中我们可以看到,Header #3的pixels
减去currentPixels
就是Header #3的offset
,完全不需要先通过localToGlobal
方法获取offset
后再去修正,直接一步到位。这叫什么,这叫厂家直销,拒绝中间商赚差价👏!
原先获取offset的源码:
Offset get _offset {
var renderObject = _controller?.scrollPosition?.context.notificationContext
?.findRenderObject();
var offset = Offset.zero;
if (renderObject?.attached ?? false) {
offset = localToGlobal(Offset.zero, ancestor: renderObject);
}
return offset;
}
优化后获取offset的源码:
Offset get _offset {
var controller = _controller;
if (controller != null) {
var d = _pixels - controller.currentPixels;
return Offset(0.0, d);
}
return Offset.zero;
}
这种方式获取offset
不止减少了计算量,还避免了NaN
(Not-a-Number)的出现。动态构建的粘性头部要求不可见后状态不能被销毁(详见StickyContainerBuilder
和ParentStickyContainerBuilder
),这就导致localToGlobal
获取的值是NaN
,至于为什么会是NaN
,感兴趣的可以去翻翻Flutter的源码和注释,里面有说明,这里就不再赘述。
总结
性能优化的改动已经发布到Pub,欢迎更新到最新版本后体验。下一篇文章讲讲粘性头部无法像头部组件一样滑动的问题,如果你有兴趣了解的话,欢迎查看后续文章。
最后
如果这个项目对你有所帮助,点赞👍加星🌟安排一下~
如果你发现了bug或想要新功能,欢迎在issue留言讨论,同时也欢迎你加入到这个项目中,为这项目出一份力。
系列文章
Flutter - 一个易用且功能强大的粘性头部组件库,适用于任何支持滚动的组件(一)
Flutter - 一个易用且功能强大的粘性头部组件库,适用于任何支持滚动的组件(二)
Flutter - 一个易用且功能强大的粘性头部组件库,适用于任何支持滚动的组件(三)
Flutter - 一个易用且功能强大的粘性头部组件库,适用于任何支持滚动的组件(四)
Flutter - 一个易用且功能强大的粘性头部组件库,适用于任何支持滚动的组件(五)