feat: dyn reaction

Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-06-19 21:23:54 +08:00
parent 16b38d1d3b
commit c4dd07ab0f
16 changed files with 710 additions and 198 deletions

View File

@@ -0,0 +1,85 @@
import 'package:flutter/rendering.dart' show RenderSliverToBoxAdapter;
import 'package:flutter/widgets.dart';
class SliverToBoxWithOffsetAdapter extends SliverToBoxAdapter {
const SliverToBoxWithOffsetAdapter({
super.key,
required this.offset,
required this.onVisibilityChanged,
super.child,
});
final double offset;
final ValueChanged<bool> onVisibilityChanged;
@override
RenderSliverToBoxWithOffsetAdapter createRenderObject(BuildContext context) =>
RenderSliverToBoxWithOffsetAdapter(
offset: offset,
onVisibilityChanged: onVisibilityChanged,
);
}
class RenderSliverToBoxWithOffsetAdapter extends RenderSliverToBoxAdapter {
RenderSliverToBoxWithOffsetAdapter({
required this.offset,
required this.onVisibilityChanged,
super.child,
});
bool? _visible;
final double offset;
final ValueChanged<bool> onVisibilityChanged;
@override
void performLayout() {
final visible = constraints.scrollOffset > offset;
if (_visible != visible) {
_visible = visible;
WidgetsBinding.instance.addPostFrameCallback(
(_) => onVisibilityChanged(visible),
);
}
super.performLayout();
}
}
class SliverToBoxWithVisibilityAdapter extends SliverToBoxAdapter {
const SliverToBoxWithVisibilityAdapter({
super.key,
required this.onVisibilityChanged,
super.child,
});
final ValueChanged<bool> onVisibilityChanged;
@override
RenderSliverToBoxWithVisibilityAdapter createRenderObject(
BuildContext context,
) => RenderSliverToBoxWithVisibilityAdapter(
onVisibilityChanged: onVisibilityChanged,
);
}
class RenderSliverToBoxWithVisibilityAdapter extends RenderSliverToBoxAdapter {
RenderSliverToBoxWithVisibilityAdapter({
required this.onVisibilityChanged,
super.child,
});
final ValueChanged<bool> onVisibilityChanged;
bool? _visible;
@override
void performLayout() {
super.performLayout();
final visible = geometry!.visible;
if (_visible != visible) {
_visible = visible;
WidgetsBinding.instance.addPostFrameCallback(
(_) => onVisibilityChanged(visible),
);
}
}
}