創建條子時要擴展哪個類?
說,我有一個FooSliver回傳小部件的類。
class FooSliver extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaybeSliverWidget(...);
}
}
但是如果上面的類回傳一個非 sliver 小部件,我不能直接在我的 slivers 中使用這個類RenderObject。
CustomScrollView(
slivers: [
FooSliver(),
],
)
那么,我應該擴展哪個 sliver 類而不是StatelessWidget確保我總是從它回傳一個 sliver 小部件?
uj5u.com熱心網友回復:
您可以創建自定義條子。您需要創建自定義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()
],
),
),
關于RenderSliv??er 的更多資訊
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/537204.html
標籤:扑颤振布局扑银
下一篇:Flutter添加Keytool
