From f1a318b7f39263d31e6c80b465597871b7e9810a Mon Sep 17 00:00:00 2001 From: mmucaria Date: Thu, 1 Dec 2022 09:49:30 +0100 Subject: [PATCH] adds the possibility to nest multiple sticky headers --- lib/sticky_headers/render.dart | 13 ++++++++++++- lib/sticky_headers/widget.dart | 4 ++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/sticky_headers/render.dart b/lib/sticky_headers/render.dart index f83e58f..997fb10 100644 --- a/lib/sticky_headers/render.dart +++ b/lib/sticky_headers/render.dart @@ -27,6 +27,7 @@ class RenderStickyHeader extends RenderBox RenderStickyHeaderCallback? _callback; ScrollPosition _scrollPosition; bool _overlapHeaders; + double _offset; RenderStickyHeader({ required ScrollPosition scrollPosition, @@ -34,8 +35,10 @@ class RenderStickyHeader extends RenderBox bool overlapHeaders = false, RenderBox? header, RenderBox? content, + double? offset, }) : _scrollPosition = scrollPosition, _callback = callback, + _offset = offset ?? 0, _overlapHeaders = overlapHeaders { if (content != null) add(content); if (header != null) add(header); @@ -62,6 +65,14 @@ class RenderStickyHeader extends RenderBox markNeedsLayout(); } + set offset(double newValue) { + if (_offset == newValue) { + return; + } + _offset = newValue; + markNeedsLayout(); + } + set overlapHeaders(bool newValue) { if (_overlapHeaders == newValue) { return; @@ -135,7 +146,7 @@ class RenderStickyHeader extends RenderBox final scrollBox = _scrollPosition.context.notificationContext!.findRenderObject(); if (scrollBox?.attached ?? false) { try { - return localToGlobal(Offset.zero, ancestor: scrollBox).dy; + return localToGlobal(Offset.zero, ancestor: scrollBox).dy - _offset; } catch (e) { // ignore and fall-through and return 0.0 } diff --git a/lib/sticky_headers/widget.dart b/lib/sticky_headers/widget.dart index ca639ef..0e08724 100644 --- a/lib/sticky_headers/widget.dart +++ b/lib/sticky_headers/widget.dart @@ -70,10 +70,14 @@ class StickyHeader extends MultiChildRenderObjectWidget { @override void updateRenderObject(BuildContext context, RenderStickyHeader renderObject) { + // If we find a parent StickyHeader we look for its size to provide an offset + // to current StickyHeader + final parent = context.findAncestorRenderObjectOfType(); final scrollPosition = controller?.position ?? Scrollable.of(context)!.position; renderObject ..scrollPosition = scrollPosition ..callback = callback + ..offset = parent?.lastChild?.size.height ?? 0 ..overlapHeaders = overlapHeaders; } }