mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-04-20 11:08:03 +08:00
@@ -43,10 +43,10 @@ class DynamicSliverAppBarMedium extends StatefulWidget {
|
||||
this.forceMaterialTransparency = false,
|
||||
this.clipBehavior,
|
||||
this.appBarClipper,
|
||||
this.afterCalc,
|
||||
this.onPerformLayout,
|
||||
});
|
||||
|
||||
final ValueChanged<double>? afterCalc;
|
||||
final ValueChanged<double>? onPerformLayout;
|
||||
final Widget? flexibleSpace;
|
||||
final Widget? leading;
|
||||
final bool automaticallyImplyLeading;
|
||||
@@ -93,7 +93,6 @@ class DynamicSliverAppBarMedium extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _DynamicSliverAppBarMediumState extends State<DynamicSliverAppBarMedium> {
|
||||
final GlobalKey _key = GlobalKey();
|
||||
double? _height;
|
||||
double? _width;
|
||||
late double _topPadding;
|
||||
@@ -112,18 +111,17 @@ class _DynamicSliverAppBarMediumState extends State<DynamicSliverAppBarMedium> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (_height == null) {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
_height =
|
||||
(_key.currentContext!.findRenderObject() as RenderBox).size.height;
|
||||
widget.afterCalc?.call(_height!);
|
||||
setState(() {});
|
||||
});
|
||||
return SliverToBoxAdapter(
|
||||
child: OnlyLayoutWidget(
|
||||
onPerformLayout: (Size size) {
|
||||
if (!mounted) return;
|
||||
_height = size.height;
|
||||
widget.onPerformLayout?.call(_height!);
|
||||
setState(() {});
|
||||
},
|
||||
child: UnconstrainedBox(
|
||||
alignment: Alignment.topLeft,
|
||||
child: SizedBox(
|
||||
key: _key,
|
||||
width: _width,
|
||||
child: widget.flexibleSpace,
|
||||
),
|
||||
|
||||
@@ -1,17 +1,42 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/rendering.dart' show RenderProxyBox;
|
||||
import 'package:flutter/scheduler.dart';
|
||||
|
||||
typedef LayoutCallback = void Function(Size size);
|
||||
|
||||
class OnlyLayoutWidget extends SingleChildRenderObjectWidget {
|
||||
const OnlyLayoutWidget({
|
||||
super.key,
|
||||
super.child,
|
||||
required this.onPerformLayout,
|
||||
});
|
||||
|
||||
final LayoutCallback onPerformLayout;
|
||||
|
||||
@override
|
||||
RenderObject createRenderObject(BuildContext context) => Layout();
|
||||
RenderObject createRenderObject(BuildContext context) =>
|
||||
Layout(onPerformLayout: onPerformLayout);
|
||||
|
||||
@override
|
||||
void updateRenderObject(BuildContext context, Layout renderObject) {
|
||||
super.updateRenderObject(context, renderObject);
|
||||
renderObject.onPerformLayout = onPerformLayout;
|
||||
}
|
||||
}
|
||||
|
||||
class Layout extends RenderProxyBox {
|
||||
Layout({required this.onPerformLayout});
|
||||
|
||||
LayoutCallback onPerformLayout;
|
||||
|
||||
@override
|
||||
void performLayout() {
|
||||
super.performLayout();
|
||||
SchedulerBinding.instance.addPostFrameCallback((_) {
|
||||
onPerformLayout(size);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void paint(PaintingContext context, Offset offset) {}
|
||||
}
|
||||
|
||||
@@ -23,22 +23,17 @@ class SelfSizedHorizontalList extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _SelfSizedHorizontalListState extends State<SelfSizedHorizontalList> {
|
||||
final _key = GlobalKey();
|
||||
double? _height;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (_height == null) {
|
||||
WidgetsBinding.instance.addPostFrameCallback(
|
||||
(_) {
|
||||
_height = (_key.currentContext!.findRenderObject() as RenderBox)
|
||||
.size
|
||||
.height;
|
||||
return OnlyLayoutWidget(
|
||||
onPerformLayout: (Size size) {
|
||||
if (!mounted) return;
|
||||
_height = size.height;
|
||||
setState(() {});
|
||||
},
|
||||
);
|
||||
return OnlyLayoutWidget(
|
||||
key: _key,
|
||||
child: Padding(
|
||||
padding: widget.padding ?? .zero,
|
||||
child: widget.itemBuilder(context, 0),
|
||||
|
||||
Reference in New Issue
Block a user