Flutter粘性布局插件flutter_sticky_widgets的使用

Flutter粘性布局插件flutter_sticky_widgets的使用

Flutter中,flutter_sticky_widgets 插件提供了类似CSS中 position: sticky; 的功能。它允许创建一种UI模式,在这种模式下,我们希望某些组件随着页面滚动到某个特定位置后固定在屏幕上,而不是继续随页面滚动消失。

示例效果

示例1 示例2

快速开始

导入包

首先需要在你的Dart文件中导入此插件:

import 'package:flutter_sticky_widgets/flutter_sticky_widgets.dart';

完整示例代码

下面是一个完整的例子,展示了如何使用 StickyContainerStickyWidget 来创建一个带有悬浮按钮的应用程序:

import 'package:flutter/material.dart';
import 'package:flutter_sticky_widgets/flutter_sticky_widgets.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late ScrollController _controller;

  @override
  void initState() {
    _controller = ScrollController();
    super.initState();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sticky Widgets Example'),
      ),
      body: StickyContainer(
        displayOverFlowContent: true,
        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):指定滚动开始前组件的位置。
  • finalPosition (StickyPosition):指定滚动到一定程度后组件将固定的最终位置。
  • controller (ScrollController):用于检测滚动状态,并且必须与同一个 Scrollable 组件(如 ListView)关联。
  • callback (Function(double)?):可选回调函数,在每次滚动时触发,接收当前滚动偏移量作为参数。

StickyContainer

  • child (Widget):通常应为 Scrollable 组件,如 ListView 等。
  • stickyChildren (List<StickyWidget>):包含一个或多个 StickyWidget
  • displayOverFlowContent (bool):是否显示超出容器范围的内容,默认为 false

StickyPosition

这是一个自定义类,用来表示 StickyWidget 的初始和最终位置。需要注意的是,对于 initialPositionfinalPosition,应该传递相同的参数组合(例如,都使用 top 和 left 或者 bottom 和 right)。


更多关于Flutter粘性布局插件flutter_sticky_widgets的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter粘性布局插件flutter_sticky_widgets的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用flutter_sticky_widgets插件来实现粘性布局的示例代码。这个插件允许你在滚动列表(如ListView)中创建粘性头部或粘性项。

首先,你需要在你的pubspec.yaml文件中添加flutter_sticky_widgets依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_sticky_widgets: ^0.6.0  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

接下来是一个简单的示例,展示如何使用StickyHeader来创建一个粘性头部列表:

import 'package:flutter/material.dart';
import 'package:flutter_sticky_widgets/flutter_sticky_widgets.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Sticky Header Example'),
        ),
        body: StickyHeaderList(
          headerBuilder: (BuildContext context, int index) {
            // 返回粘性头部的内容
            return Container(
              color: Colors.blue,
              padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
              child: Text(
                'Header ${index + 1}',
                style: TextStyle(color: Colors.white),
              ),
            );
          },
          itemBuilder: (BuildContext context, int index) {
            // 返回列表项的内容
            return ListTile(
              title: Text('Item ${index + 1}'),
            );
          },
          itemCount: 20,  // 列表项的数量
        ),
      ),
    );
  }
}

class StickyHeaderList extends StatelessWidget {
  final IndexedWidgetBuilder headerBuilder;
  final IndexedWidgetBuilder itemBuilder;
  final int itemCount;

  StickyHeaderList({
    required this.headerBuilder,
    required this.itemBuilder,
    required this.itemCount,
  });

  @override
  Widget build(BuildContext context) {
    return SliverStickyHeaderBuilder(
      builder: (BuildContext context, int index) {
        // 根据索引创建头部或项
        if (index == 0 || index % 5 == 0) {  // 每5个项目一个头部
          return headerBuilder(context, index ~/ 5);  // 使用整数除法来计算头部的索引
        } else {
          return itemBuilder(context, index);
        }
      },
      itemCount: itemCount,
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个带有粘性头部的列表。粘性头部每5个项目出现一次,并显示"Header X"文本,其中X是头部的索引(从1开始)。列表项显示"Item X"文本。

StickyHeaderList是一个自定义的StatelessWidget,它使用SliverStickyHeaderBuilder来构建粘性头部和列表项。headerBuilderitemBuilder分别用于构建头部和项,而itemCount指定了列表项的总数。

注意,这个示例使用了整数除法~/来计算头部的索引,确保头部是按每5个项目分组出现的。你可以根据需要调整这个逻辑。

希望这个示例能帮助你理解如何在Flutter中使用flutter_sticky_widgets插件来实现粘性布局。如果你有任何其他问题,欢迎继续提问!

回到顶部