创建条时要扩展哪个类?
比如说,我有一个类FooSliver
,它返回一个小部件。
class FooSliver extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaybeSliverWidget(...);
}
}
但是,如果上面的类返回一个非条小部件(即RenderObject
),那么我不能直接在我的代码条中使用这个类。
CustomScrollView(
slivers: [
FooSliver(),
],
)
那么,我应该扩展哪个sliver类而不是StatelessWidget
,以确保始终从它返回一个sliver小部件?
发布于 2022-11-20 05:22:05
您可以创建自定义条。您需要创建一个自定义RenderSliverSingleBoxAdapter
和SingleChildRenderObjectWidget
class FooSliver extends SingleChildRenderObjectWidget {
const FooSliver({super.key, super.child});
@override
RenderObject createRenderObject(BuildContext context) => FooRenderSliver();
}
class BarSliver extends SingleChildRenderObjectWidget {
const BarSliver({super.key, super.child = const Text("Hello from Bar")});
@override
RenderObject createRenderObject(BuildContext context) => FooRenderSliver();
}
class FooRenderSliver extends RenderSliverSingleBoxAdapter {
FooRenderSliver({super.child});
@override
void performLayout() {
/// from [RenderSliverToBoxAdapter]
if (child == null) {
geometry = SliverGeometry.zero;
return;
}
final SliverConstraints constraints = this.constraints;
child!.layout(constraints.asBoxConstraints(), parentUsesSize: true);
final double childExtent;
switch (constraints.axis) {
case Axis.horizontal:
childExtent = child!.size.width;
break;
case Axis.vertical:
childExtent = child!.size.height;
break;
}
assert(childExtent != null);
final double paintedChildSize =
calculatePaintOffset(constraints, from: 0.0, to: childExtent);
final double cacheExtent =
calculateCacheOffset(constraints, from: 0.0, to: childExtent);
assert(paintedChildSize.isFinite);
assert(paintedChildSize >= 0.0);
geometry = SliverGeometry(
scrollExtent: childExtent,
paintExtent: paintedChildSize,
cacheExtent: cacheExtent,
maxPaintExtent: childExtent,
hitTestExtent: paintedChildSize,
hasVisualOverflow: childExtent > constraints.remainingPaintExtent ||
constraints.scrollOffset > 0.0,
);
setChildParentData(child!, constraints, geometry!);
}
}
并使用类似的
home: Scaffold(
body: CustomScrollView(
slivers: [
FooSliver(
child: Text("Hi From Foo sliver"),
),
BarSliver()
],
),
),
更多关于RenderSliver的信息
https://stackoverflow.com/questions/74508064
复制