Flutter - 一个易用且功能强大的粘性头部组件库,适用于任何支持滚动的组件(四)


前言

上篇文章讲了通过修正偏移量来解决粘性头部切换过程中偶尔会有空隙的问题,写上篇文章的过程中,我发现我走了弯路,所以现在换另一种方式来计算头部组件相对滚动组件的偏移量,这种方式计算量更少。

项目地址

性能优化

上篇文章中出现的偏移量关系图:

screenshot1

从图中我们可以看到,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)的出现。动态构建的粘性头部要求不可见后状态不能被销毁(详见StickyContainerBuilderParentStickyContainerBuilder),这就导致localToGlobal获取的值是NaN,至于为什么会是NaN,感兴趣的可以去翻翻Flutter的源码和注释,里面有说明,这里就不再赘述。

总结

性能优化的改动已经发布到Pub,欢迎更新到最新版本后体验。下一篇文章讲讲粘性头部无法像头部组件一样滑动的问题,如果你有兴趣了解的话,欢迎查看后续文章。

最后

如果这个项目对你有所帮助,点赞👍加星🌟安排一下~

如果你发现了bug或想要新功能,欢迎在issue留言讨论,同时也欢迎你加入到这个项目中,为这项目出一份力。


系列文章

Flutter - 一个易用且功能强大的粘性头部组件库,适用于任何支持滚动的组件(一)
Flutter - 一个易用且功能强大的粘性头部组件库,适用于任何支持滚动的组件(二)
Flutter - 一个易用且功能强大的粘性头部组件库,适用于任何支持滚动的组件(三)
Flutter - 一个易用且功能强大的粘性头部组件库,适用于任何支持滚动的组件(四)
Flutter - 一个易用且功能强大的粘性头部组件库,适用于任何支持滚动的组件(五)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值