我正在尝试使用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
并没有显示多少
答案 0 :(得分:17)
RenderSliver
的文档似乎是我们目前最接近明确的Sliver文档的文档。
RenderSliver
由
RenderSliverHelpers
(mixin)RenderSliverMultiBoxAdaptor
(摘要)
RenderSliverFixedExtentBoxAdaptor
(摘要)
_RenderSliverPrototypeExtentList
(具体)RenderSliverFillViewport
(具体)RenderSliverFixedExtentList
(具体)RenderSliverGrid
(具体)RenderSliverList
(具体)RenderSliverPadding
(具体)RenderSliverPersistentHeader
(摘要)
RenderSliverFloatingPersistentHeader
(具体)
RenderSliverFloatingPinnedPersistentHeader
(具体)RenderSliverPinnedPersistentHeader
(具体)RenderSliverScrollingPersistentHeader
(具体)RenderSliverSingleBoxAdapter
(摘要)
RenderSliverFillRemaining
(具体)RenderSliverToBoxAdapter
(具体)这些RenderSliver
实现由以下小部件创建:
SliverMultiBoxAdaptorWidget
子类:
StatelessWidget
子类:
SingleChildRenderObjectWidget
子类:
因此,当您想要生成RenderSliver
的实例时,可以使用这些小部件。
当然,越来越多的RenderSliver
- 创建小部件可能会随着时间的推移而添加,你也可以创建自己的小部件!希望这个列表足以让你入门。
答案 1 :(得分:4)
截至 2021 年,根据 their docs 的说法,这些是一些 sliver 小部件:
SliverAnimatedList
在插入或移除项目时动画的条子。
SliverAnimatedOpacity
SliverOpacity 的动画版本,每当给定的不透明度发生变化时,它会在给定的持续时间内自动转换 sliver 子项的不透明度。
SliverFadeTransition
动画条状小部件的不透明度。
SliverFillRemaining
包含一个填充视口中剩余空间的单个框子项的条子。
SliverFillViewport
包含多个框子项的条子,每个子项填充视口。
SliverFixedExtentList
将多个具有相同主轴范围的框子元素放置在线性阵列中的条子。
SliverGrid
在二维排列中放置多个盒子孩子的条子。
SliverIgnorePointer
在命中测试期间不可见的 sliver 小部件。
SliverLayoutBuilder
构建一个可以依赖于它自己的 SliverConstraints 的 sliver 小部件树。
SliverList
一个将多个盒子子元素沿主轴放置在一个线性阵列中的条子。
SliverOffstage
一个 sliver 将它的 sliver 子项放在树上,就像它在树上一样,但没有画任何东西,没有让 sliver 子项可用于命中测试,也没有在父项中占据任何空间。
SliverOpacity
一个使其 sliver 子组件部分透明的 sliver 小部件。
SliverOverlapAbsorber
包裹另一个的条子,迫使其布局范围被视为重叠。
SliverOverlapAbsorberHandle
提供给 SliverOverlapAbsorber、SliverOverlapInjector 和 NestedScrollViewViewport 的句柄,以在 NestedScrollView 中移动重叠。
SliverOverlapInjector
具有基于存储在 SliverOverlapAbsorberHandle 中的值的条子几何形状的条子。
SliverPadding
在另一条条子的每一侧应用填充的条子。
SliverPersistentHeader
当条子滚动到与条子的生长方向相对的视口边缘时,条子的大小会发生变化。
SliverPrototypeExtentList
将其框子项置于线性阵列中并限制它们沿主轴具有与原型项相同的范围的条子。
SliverReorderableList
允许用户以交互方式重新排序列表项的细长列表。
SliverSafeArea
通过足够的填充插入另一个条子以避免操作系统入侵的条子。
SliverToBoxAdapter
包含单个框小部件的条子。
SliverVisibility
是否显示或隐藏一个银色孩子。