Build Status

使用 flutter_sticky_widgets,您可以像在 CSS 中使用 position: sticky; 一样使用小部件。

粘性小部件是一种 UI 模式,我们希望小部件能够随着 UI 一起滚动到某个点,然后固定在屏幕上,而不是滚出屏幕。

(第一个图像中的绿色播放按钮,第二个图像中的随机播放按钮是 position: sticky 的示例)

入门

import 'package:flutter_sticky_widgets/flutter_sticky_widgets.dart';

StickyContainer(
    stickyChildren: [
        StickyWidget(
            initialPosition: StickyPosition(bottom: 20, right: 20),
            finalPosition: StickyPosition(
                bottom: MediaQuery.of(context).size.height - 80, right: 20),
            controller: _controller,
            child: Container(
            width: 40,
            height: 40,
            decoration: const BoxDecoration(
                shape: BoxShape.circle,
                color: Colors.green,
            ),
            child: const Center(child: Icon(Icons.pause)),
            ),
        ),
    ],
    child: ListView.builder(
    controller: _controller,
    itemCount: 50,
    itemBuilder: (context, index) {
        return ListTile(
            title: Text("Tile $index"),
        );
    }),
);

StickyWidget

用于实现粘性模式的小部件。

  • initialPosition (StickyPosition): 指示小部件在滚动开始前的初始位置。位置由自定义类 StickyPosition 表示。

  • finalPosition (StickyPosition): 指示小部件在滚动足够多的量后将保持粘性的位置。如果反向滚动,小部件将恢复到其初始位置。

  • controller (ScrollController): StickyWidget 使用它来检测滚动。必须将相同的 ScrollController 附加到您的 Scrollable (ListView, SingleChildScrollView, CustomScrollView, …) 小部件上,StickyWidgets 才能正常工作。它还用于确定滚动轴是垂直还是水平。

  • callback (Function(double)?) (可选): 一个可选的回调函数,它会在每次滚动时被调用。它接收 scrolloffset 作为参数,可用于动画化 StickyWidget

StickyContainer

它必须是使用的 Scrollable 小部件的父元素。StickyContainer 的尺寸被 StickyWidgets 用作定位它们的参考尺寸。因此,请确保 StickyContainer 的尺寸与 Scrollable 小部件的尺寸相同。

  • child (Widget): 理想情况下,此参数应提供 Scrollable 小部件,如果不是,您需要确保 StickyContainer 的尺寸与 Scrollable 的尺寸相同。

  • stickyChildren (List<StickyWidget>): 您可以提供一个或多个 StickyWidgets

  • displayOverFlowContent (bool) (可选): 如果您希望 StickyWidgets 显示在 StickyContainer 的边界之外,则设置为 true。

StickyPosition

一个自定义类,用于表示 StickyWidget 的初始位置和最终位置。它接受四个参数 (top, bottom, left, right)。但您应该只提供其中两个 (top / bottom, right / left)。

注意:确保为 initialPosition 和 finalPosition 中使用的 StickyPosition 传递相同的参数集

例如

正确 ✅ initialPosition: StickyPosition(top: .., left: ..) finalPosition: StickyPosition(top: .., left: ..)

错误 ❌ (最终位置也应使用 top 而不是 bottom)

initialPosition: StickyPosition(top: .., left: ..) finalPosition: StickyPosition(bottom: .., left: ..)

GitHub

查看 Github