sliver_tools

一组 Flutter 框架中缺失的有用 sliver 工具。

这是使用此软件包可以制作内容的预览

sliver_tools

此应用程序的结构

class Section extends State {
  @override
  Widget build(BuildContext context) {
    return MultiSliver(
      pushPinnedChildren: true,
      children: <Widget>[
        SliverPersistentHeader(
          pinned: true,
          ...
        ),
        if (!infinite)
          SliverAnimatedPaintExtent(
            child: SliverList(...),
          )
        else
          SliverList(...),
      ],
    );
  }
}

class NewsPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CustomScrollView(
      slivers: <Widget>[
        Section(infinite: false),
        Section(infinite: true),
      ],
    );
  }
}

[MultiSliver]

MultiSliver 小部件允许将多个 slivers 分组,以便它们可以作为单个小部件返回。
例如,当人们想用一些填充或继承的小部件来包装几个 slivers 时。

示例

class WidgetThatReturnsASliver extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiSliver(
      pushPinnedChildren: false, // defaults to false
      children: <Widget>[
        SliverPersistentHeader(...),
        SliverList(...),
      ],
    );
  }
}

pushPinnedChildren 参数允许通过简单地使用固定的 SliverPersistentHeader 小部件(或任何在其布局范围内绘制的自定义 sliver)来实现“固定页眉”效果。

SliverStack

SliverStack 小部件允许堆叠 slivers 和 box 小部件。
这对于为 sliver 添加一些装饰很有用。
此包中的其他一些小部件使用此来获得所需的视觉效果。

示例

class WidgetThatReturnsASliver extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SliverStack(
      insetOnOverlap: false, // defaults to false
      children: <Widget>[
        SliverPositioned.fill(
          child: Container(
            decoration: BoxDecoration(
              color: Colors.white,
              boxShadow: const <BoxShadow>[
                BoxShadow(
                  offset: Offset(0, 4),
                  blurRadius: 8,
                  color: Colors.black26,
                )
              ],
              borderRadius: BorderRadius.circular(8),
            ),
          ),
        )
        SliverList(...),
      ],
    );
  }
}

insetOnOverlap 处理当 sliver 具有来自前一个 sliver 的重叠时,定位的子项是否应内嵌(缩小)。

[SliverClip]

SliverClip 小部件将在其子项的 paintOrigin 到 paintExtent 之间添加剪辑。
当将固定的 SliverPersistentHeader 用作堆栈的子项时,这非常有用,并且很可能是您想要的。

示例

class WidgetThatReturnsASliver extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SliverClip(
      clipOverlap: true, // defaults to true
      child: SliverList(...),
    );
  }
}

clipOverlap 参数允许配置是否应剪辑与前一个子项的任何重叠。
当一个 SliverPersitentHeader 位于 SliverList 之上,并且您不想给页眉一个不透明的背景,但又想阻止列表在页眉下方绘制时,这会很有用。

[SliverAnimatedPaintExtent]

SliverAnimatedPaintExtent 小部件允许在 sliver 更改其在视口中占据的空间时实现平滑过渡。
例如,当使用 SliverList 并在其下方有一个按钮来加载接下来的几项时。

示例

class WidgetThatReturnsASliver extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SliverAnimatedPaintExtent(
      duration: const Duration(milliseconds: 150),
      child: SliverList(...),
    );
  }
}

[SliverAnimatedSwitcher]

SliverAnimatedSwitcher 小部件只是一个预配置的 AnimatedSwitcher 小部件。
如果一个人需要的选项比此小部件提供的更多,则可以通过为其提供 SliverAnimatedSwitcherdefaultLayoutBuilderdefaultTransitionBuilder 来使用常规的 AnimatedSwitcher

[SliverCrossAxisConstrained]

SliverCrossAxisConstrained 小部件允许将 sliver 的交叉轴范围限制为 maxCrossAxisExtent 提供的最大值。
例如,在 iPad 上,大量的文本项可能会太宽而难以阅读,因此人们可以将 SliverList 包装在 SliverCrossAxisConstrained 中,并将其宽度限制为更合理的值。

示例

class WidgetThatReturnsASliver extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SliverCrossAxisConstrained(
      maxCrossAxisExtent: 700,
      child: SliverList(...),
    );
  }
}

[SliverCrossAxisPadded]

SliverCrossAxisPadded 小部件允许为 sliver 的交叉轴添加填充。
这可以通过传递 paddingStart 和/或 paddingEnd 来完成,或者使用采用单个填充值的 symmetric 构造函数。
在垂直 sliver 中使用 paddingStartpaddingEnd 时,它将取决于 TextDirection 哪个是左侧或右侧。

示例

class WidgetThatReturnsASliver extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SliverCrossAxisPadded(
      paddingStart: 24,
      paddingEnd: 48,
      textDirection: TextDirection.ltr, // optional, defaults to the Directionality specified by the context
      child: SliverList(...),
    );
  }
}

[SliverPinnedHeader]

SliverPinnedHeader 小部件允许轻松创建固定的页眉。
它的大小将与其子项的大小相匹配,当它到达视口的前沿时,它会停在那里,而不是滚动出屏幕。

GitHub

https://github.com/Kavantix/sliver_tools