50 lines
1.3 KiB
Dart
50 lines
1.3 KiB
Dart
import 'dart:math';
|
|
|
|
import 'package:flutter/widgets.dart';
|
|
|
|
class MySliverDelegate extends SliverPersistentHeaderDelegate {
|
|
final double? maxHeight;
|
|
final double? minHeight;
|
|
final Widget? child;
|
|
final bool? forceRefresh; //是否需要强制刷新
|
|
// double? shrinkOffset;
|
|
final Widget Function(
|
|
BuildContext context,
|
|
double shrinkOffset,
|
|
bool overlapsContent,
|
|
Widget? child,
|
|
)? childBuildHandler;
|
|
Function(double)? callTop;
|
|
|
|
MySliverDelegate({
|
|
required this.maxHeight,
|
|
required this.minHeight,
|
|
this.child,
|
|
this.childBuildHandler,
|
|
this.forceRefresh = false,
|
|
this.callTop,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) {
|
|
if (callTop != null) callTop!(shrinkOffset);
|
|
if (childBuildHandler == null) {
|
|
return SizedBox.expand(
|
|
child: child,
|
|
);
|
|
}
|
|
return childBuildHandler!(context, shrinkOffset, overlapsContent, child);
|
|
}
|
|
|
|
@override
|
|
double get maxExtent => max(maxHeight!, minHeight!);
|
|
|
|
@override
|
|
double get minExtent => minHeight!;
|
|
|
|
@override
|
|
bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate) {
|
|
return (forceRefresh ?? false) ? true : maxHeight != oldDelegate.maxExtent || minHeight != oldDelegate.minExtent;
|
|
}
|
|
}
|