opt trending header

Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-06-30 19:23:41 +08:00
parent ed6353e6d5
commit f615a43259
5 changed files with 95 additions and 64 deletions

View File

@@ -0,0 +1,55 @@
import 'package:flutter/foundation.dart' show clampDouble;
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart' show RenderSliverToBoxAdapter;
class TrendingHeader extends SliverToBoxAdapter {
const TrendingHeader({
super.key,
required this.offset,
required this.onScrollRatioChanged,
required super.child,
});
final double offset;
final ValueChanged<double> onScrollRatioChanged;
@override
RenderSliverToBoxAdapter createRenderObject(BuildContext context) {
return RenderTrendingHeader(
offset: offset,
onScrollRatioChanged: onScrollRatioChanged,
);
}
@override
void updateRenderObject(
BuildContext context,
RenderTrendingHeader renderObject,
) {
renderObject.offset = offset;
}
}
class RenderTrendingHeader extends RenderSliverToBoxAdapter {
RenderTrendingHeader({
required this.offset,
required this.onScrollRatioChanged,
});
double offset;
double? _scrollRatio;
final ValueChanged<double> onScrollRatioChanged;
@override
void performLayout() {
super.performLayout();
final scrollOffset = constraints.scrollOffset;
final scrollRatio = clampDouble(scrollOffset / offset, 0.0, 1.0);
if (_scrollRatio != scrollRatio) {
_scrollRatio = scrollRatio;
WidgetsBinding.instance.addPostFrameCallback((_) {
onScrollRatioChanged(scrollRatio);
});
}
}
}