24

我正在尝试使用 Sliver 来实现可折叠列表标题。当我将小部件从正常更改为 Sliver 时,我经常会遇到如下错误:

I/flutter ( 3141): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter ( 3141): The following assertion was thrown building NotificationListener<ScrollNotification>():
I/flutter ( 3141): A RenderViewport expected a child of type RenderSliver but received a child of type
I/flutter ( 3141): RenderRepaintBoundary.
I/flutter ( 3141): RenderObjects expect specific types of children because they coordinate with their children during
I/flutter ( 3141): layout and paint. For example, a RenderSliver cannot be the child of a RenderBox because a
I/flutter ( 3141): RenderSliver does not understand the RenderBox layout protocol.
I/flutter ( 3141):

I/flutter ( 3141): The RenderViewport that expected a RenderSliver child was created by:
I/flutter ( 3141):   Viewport ← _ScrollableScope ← IgnorePointer-[GlobalKey#307856652] ← Listener ← _GestureSemantics ←
I/flutter ( 3141):   RawGestureDetector-[LabeledGlobalKey<RawGestureDetectorState>#701223524] ← RepaintBoundary ←
I/flutter ( 3141):   CustomPaint ← RepaintBoundary ← NotificationListener<ScrollNotification> ←
I/flutter ( 3141):   GlowingOverscrollIndicator ← Scrollable ← ⋯
I/flutter ( 3141):
I/flutter ( 3141): The RenderRepaintBoundary that did not match the expected child type was created by:
I/flutter ( 3141):   RepaintBoundary ← NotificationListener<ScrollNotification> ← GlowingOverscrollIndicator ←
I/flutter ( 3141):   Scrollable ← SingleChildScrollView ← Viewport ← _ScrollableScope ←
I/flutter ( 3141):   IgnorePointer-[GlobalKey#307856652] ← Listener ← _GestureSemantics ←
I/flutter ( 3141):   RawGestureDetector-[LabeledGlobalKey<RawGestureDetectorState>#701223524] ← RepaintBoundary ← ⋯
I/flutter ( 3141):

我的理解是这是因为普通小部件不能直接用于在 Sliver 小部件中渲染。

框架中是否有明确的 Sliver 小部件列表?

sliver.dart显示不多

4

2 回答 2

45

的文档RenderSliver似乎是我们目前最接近最终 Sliver 文档的东西。

RenderSliver由实施

  • RenderSliverHelpers(混合)
  • RenderSliverMultiBoxAdaptor(抽象的)
    • RenderSliverFixedExtentBoxAdaptor(抽象的)
      • _RenderSliverPrototypeExtentList(具体的)
      • RenderSliverFillViewport(具体的)
      • RenderSliverFixedExtentList(具体的)
    • RenderSliverGrid(具体的)
    • RenderSliverList(具体的)
  • RenderSliverPadding(具体的)
  • RenderSliverPersistentHeader(抽象的)
    • RenderSliverFloatingPersistentHeader(具体的)
      • RenderSliverFloatingPinnedPersistentHeader(具体的)
    • RenderSliverPinnedPersistentHeader(具体的)
    • RenderSliverScrollingPersistentHeader(具体的)
  • RenderSliverSingleBoxAdapter(抽象的)
    • RenderSliverFillRemaining(具体的)
    • RenderSliverToBoxAdapter(具体的)

这些RenderSliver实现由以下小部件创建:

SliverMultiBoxAdaptorWidget子类:

StatelessWidget子类:

SingleChildRenderObjectWidget子类:

因此,当您想要生成RenderSliver.

当然,RenderSliver随着时间的推移,可能会添加越来越多的创建小部件,您也可以自己制作!希望这份清单足以让您入门。

于 2017-06-12T07:44:23.427 回答
9

根据他们的文档,截至 2021 年,这些是一些 sliver 小部件:

SliverAnimatedList

插入或移除项目时为项目设置动画的条子。

SliverAnimatedOpacity

SliverOpacity 的动画版本,只要给定的不透明度发生变化,就会在给定的持续时间内自动转换 sliver 子项的不透明度。

SliverFadeTransition

为 sliver 小部件的不透明度设置动画。

SliverFillRemaining

包含一个填充视口中剩余空间的单个盒子子元素的条子。

SliverFill 视口

包含多个子框的条子,每个子框都填充视口。

SliverFixedExtentList

将多个具有相同主轴范围的子框放置在线性阵列中的条子。

银格

在二维排列中放置多个盒子子元素的条子。

银忽略指针

在命中测试期间不可见的 sliver 小部件。

SliverLayoutBuilder

构建一个可以依赖于它自己的 SliverConstraints 的 sliver 小部件树。

银名单

沿主轴将多个盒子子项放置在线性阵列中的条子。

SliverOffstage

一个 sliver 将其 sliver 子项放置在树上,就像它在树上一样,但没有绘制任何内容,没有使 sliver 子项可用于命中测试,也没有在父项中占用任何空间。

银不透明度

使其 sliver 子项部分透明的 sliver 小部件。

SliverOverlapAbsorber

包裹另一个的条子,迫使其布局范围被视为重叠。

SliverOverlap吸收器手柄

提供给 SliverOverlapAbsorber、SliverOverlapInjector 和 NestedScrollViewViewport 的句柄,以在 NestedScrollView 中移动重叠。

SliverOverlapInjector

具有基于存储在 SliverOverlapAbsorberHandle 中的值的长条几何形状的长条。

SliverPadding

在另一条条的每一侧应用填充的条条。

SliverPersistentHeader

当 sliver 滚动到与 sliver 的 GrowthDirection 相对的视口边缘时,其大小会发生变化。

SliverPrototypeExtentList

将其盒子子元素放置在线性数组中并约束它们沿主轴具有与原型项目相同的范围的条子。

SliverReorderableList

允许用户以交互方式对列表项重新排序的长条列表。

银安全区

通过足够的填充插入另一个条子以避免操作系统入侵的条子。

SliverToBoxAdapter

包含单个盒子小部件的条子。

Sliver可见性

是否显示或隐藏一个条子子。

于 2021-03-28T05:42:15.470 回答