我已经探索了很长时间,尝试阅读源代码并调试实际代码。
我发现了一种通过在geometry
方法中将paintOrigin
的{{1}}属性设置为constraints.scrollOffset
来实现固定效果的方法。
我认为performLayout
首先使用相同的技巧。它确实设置了SliverPersistentHeader
,但与paintOrigin
无关。这是scrollOffset
的performLayout方法。
RenderSliverPinnedPersistentHeader
我认为@override
void performLayout() {
final double maxExtent = this.maxExtent;
final bool overlapsContent = constraints.overlap > 0.0;
excludeFromSemanticsScrolling = overlapsContent || (constraints.scrollOffset > maxExtent - minExtent);
layoutChild(constraints.scrollOffset, maxExtent, overlapsContent: overlapsContent);
final double layoutExtent = (maxExtent - constraints.scrollOffset).clamp(0.0, constraints.remainingPaintExtent);
geometry = SliverGeometry(
scrollExtent: maxExtent,
paintOrigin: constraints.overlap,
paintExtent: math.min(childExtent, constraints.remainingPaintExtent),
layoutExtent: layoutExtent,
maxPaintExtent: maxExtent,
maxScrollObstructionExtent: minExtent,
cacheExtent: layoutExtent > 0.0 ? -constraints.cacheOrigin + layoutExtent : layoutExtent,
hasVisualOverflow: true, // Conservatively say we do have overflow to avoid complexity.
);
}
与constraints.overlap
有联系。但是,当我调试代码时,发现scrollOffset
仍然为零,即使标头已固定。
paintOrigin
剂量如何达到固定作用?