有没有关于Sliver小部件的明确列表?

28

我正在尝试使用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没有显示太多内容。


1
额外的问题:为什么银片小部件不是一种类型?为什么Flutter不能在编译时检查银片兼容性? - mako
2个回答

53
目前来看,RenderSliver文档似乎是我们最接近定义的Sliver文档。 RenderSliver由以下实现:
  • RenderSliverHelpers(mixin)
  • RenderSliverMultiBoxAdaptor(abstract)
    • RenderSliverFixedExtentBoxAdaptor(abstract)
      • _RenderSliverPrototypeExtentList(concrete)
      • RenderSliverFillViewport(concrete)
      • RenderSliverFixedExtentList(concrete)
    • RenderSliverGrid(concrete)
    • RenderSliverList(concrete)
  • RenderSliverPadding(concrete)
  • RenderSliverPersistentHeader(abstract)
    • RenderSliverFloatingPersistentHeader(concrete)
      • RenderSliverFloatingPinnedPersistentHeader(concrete)
    • RenderSliverPinnedPersistentHeader(concrete)
    • RenderSliverScrollingPersistentHeader(concrete)
  • RenderSliverSingleBoxAdapter(abstract)
    • RenderSliverFillRemaining(concrete)
    • RenderSliverToBoxAdapter(concrete)
这些RenderSliver实现由以下小部件创建: SliverMultiBoxAdaptorWidget子类: StatelessWidget子类:

SingleChildRenderObjectWidget子类:

所以,当您想要创建RenderSliver实例时,可以使用这些小部件。

当然,随着时间的推移,可能会添加更多的创建RenderSliver的小部件,您也可以自己制作!希望这个列表足以让您开始。


12
截至2021年,根据官方文档,这些是一些sliver小部件: SliverAnimatedList 一个在插入或删除时动画化项的滑块。 SliverAnimatedOpacity SliverOpacity的带有动画效果版本,每当给定透明度更改时自动过渡滑块子级的不透明度。 SliverFadeTransition 将滑块部件的不透明度动画化。 SliverFillRemaining 包含单个框子级的滑块,该框子级填充视口中的剩余空间。 SliverFillViewport 包含多个框子级的滑块,每个框子级都填充视口。 SliverFixedExtentList 将具有相同主轴跨度的多个框子级放置在线性数组中的滑块。 SliverGrid 以二维排列方式放置多个框子级的滑块。 SliverIgnorePointer 在命中测试期间不可见的滑块部件。 SliverLayoutBuilder 构建一个可以依赖于自己的SliverConstraints的滑块部件树。 SliverList 沿着主轴将多个框子级放置在线性数组中的滑块。

SliverOffstage

一个将其子sliver在树中布局,但不会绘制任何内容、不可用于命中测试、并且不会占用父容器空间的sliver。

SliverOpacity

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

SliverOverlapAbsorber

包装另一个sliver以强制其布局范围被视为重叠的sliver。

SliverOverlapAbsorberHandle

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

SliverOverlapInjector

具有基于SliverOverlapAbsorberHandle存储的值的sliver几何形状的sliver。

SliverPadding

应用于另一个sliver每一侧的填充的sliver。

SliverPersistentHeader

当滚动到viewport对面的边缘时,其大小会变化的sliver。

SliverPrototypeExtentList

将其框子放置在线性数组中,并强制它们沿主轴具有与原型项相同的范围的sliver。

SliverReorderableList

允许用户交互地重新排列列表项的sliver列表。

SliverSafeArea

一个将其子sliver放置在安全区域内的sliver。

一个通过足够的填充量将另一个sliver嵌入其中以避免操作系统干扰的sliver。

SliverToBoxAdapter

包含单个box widget的sliver。

SliverVisibility

是否显示或隐藏sliver子元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接