首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于StatelessWidget的横条等效

用于StatelessWidget的横条等效
EN

Stack Overflow用户
提问于 2022-11-20 12:23:23
回答 1查看 26关注 0票数 1

创建条时要扩展哪个类?

比如说,我有一个类FooSliver,它返回一个小部件。

代码语言:javascript
运行
复制
class FooSliver extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaybeSliverWidget(...);
  }
}

但是,如果上面的类返回一个非条小部件(即RenderObject ),那么我不能直接在我的代码条中使用这个类。

代码语言:javascript
运行
复制
CustomScrollView(
  slivers: [
    FooSliver(),
  ],
)

那么,我应该扩展哪个sliver类而不是StatelessWidget,以确保始终从它返回一个sliver小部件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-20 13:22:05

您可以创建自定义条。您需要创建一个自定义RenderSliverSingleBoxAdapterSingleChildRenderObjectWidget

代码语言:javascript
运行
复制
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!);
  }
}

并使用类似的

代码语言:javascript
运行
复制
home: Scaffold(
  body: CustomScrollView(
    slivers: [
      FooSliver(
        child: Text("Hi From Foo sliver"),
      ),
      BarSliver()
    ],
  ),
),

更多关于RenderSliver的信息

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74508064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档