Flutter自定义Sliver头部插件sliver_header_delegate的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter自定义Sliver头部插件sliver_header_delegate的使用

该插件提供了灵活的Sliver头部分配器,允许轻松自定义您的SliverHeader。

开始使用

在您的Flutter项目的pubspec.yaml文件中添加以下依赖:

dependencies:
    ...
    sliver_header_delegate: ^0.0.1

在项目中导入该包:

import 'package:sliver_header_delegate/sliver_header_delegate.dart';

在您的CustomScrollView中声明SliverPersistentHeader并设置FlexibleHeaderDelegate作为其分配器:

CustomScrollView(
  slivers: [
    SliverPersistentHeader(
      delegate: FlexibleHeaderDelegate(),
    ),
  ],
);

如果您希望您的小部件填充状态栏,请指定statusBarHeight参数:

delegate: FlexibleHeaderDelegate(
  statusBarHeight: MediaQuery.of(context).padding.top,
),

示例

完整示例

完成示例

SliverPersistentHeader(
  pinned: true,
  delegate: FlexibleHeaderDelegate(
    statusBarHeight: MediaQuery.of(context).padding.top,
    expandedHeight: 240,
    background: MutableBackground(
      expandedWidget: Image.asset(
        'assets/images/mountains.jpg',
        fit: BoxFit.cover,
      ),
      collapsedColor: primaryColor,
    ),
    actions: [
      IconButton(
        icon: const Icon(Icons.search),
        onPressed: () {},
      ),
      IconButton(
        icon: const Icon(Icons.more_vert),
        onPressed: () {},
      ),
    ],
    children: [
      FlexibleTextItem(
        text: 'Mountains',
        collapsedStyle: collapsedStyle,
        expandedStyle: expandedStyle,
        expandedAlignment: Alignment.bottomLeft,
        collapsedAlignment: Alignment.center,
        expandedPadding: padding,
      ),
    ],
  ),
)

可变背景

可变背景

SliverPersistentHeader(
  pinned: true,
  delegate: FlexibleHeaderDelegate(
    expandedHeight: 240,
    background: MutableBackground(
      expandedWidget: Image.network(_imageUrl, fit: BoxFit.cover),
      collapsedColor: _headerColor,
    ),
  ),
)

渐变背景

渐变背景

SliverPersistentHeader(
  pinned: true,
  delegate: FlexibleHeaderDelegate(
    background: GradientBackground(
      gradient: LinearGradient(
        begin: Alignment.topLeft,
        end: Alignment.bottomRight,
        colors: [
          _startColor,
          _endColor,
        ],
      ),
    ),
  ),
)

修改标题

修改标题

SliverPersistentHeader(
  pinned: true,
  delegate: FlexibleHeaderDelegate(
    backgroundColor: Colors.white,
    children: [
      FlexibleTextItem(
        text: 'Modified title',
        expandedStyle: _expandedTextStyle,
        collapsedStyle: _collapsedTextStyle,
        expandedAlignment: Alignment.bottomLeft,
        collapsedAlignment: Alignment.center,
        expandedPadding: _expandedPadding,
      ),
    ],
  ),
)

更多关于Flutter自定义Sliver头部插件sliver_header_delegate的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义Sliver头部插件sliver_header_delegate的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用SliverPersistentHeaderDelegate来自定义Sliver头部插件的示例代码。虽然sliver_header_delegate可能是一个具体的库或自定义类的名称,但Flutter标准库中并没有直接提供名为sliver_header_delegate的类。这里我们将使用SliverPersistentHeaderDelegate来实现类似的功能,因为它是Flutter中用于创建持久性头部(Sliver Header)的常用方法。

首先,确保你的Flutter环境已经设置好,然后创建一个新的Flutter项目或在现有项目中添加以下代码。

Step 1: 创建一个自定义的SliverPersistentHeaderDelegate

import 'package:flutter/material.dart';

class CustomSliverHeaderDelegate extends SliverPersistentHeaderDelegate {
  @override
  double get minExtent => 100.0; // 头部最小的展示高度

  @override
  double get maxExtent => 200.0; // 头部最大的展示高度(当用户滚动时,头部可以扩展到这个高度)

  @override
  Widget build(
      BuildContext context, double shrinkOffset, bool overlapsContent) {
    // shrinkOffset 是头部被收缩了多少,overlapsContent 表示头部是否重叠内容
    final double headerHeight = maxExtent - shrinkOffset;
    return Container(
      height: headerHeight,
      color: Colors.blue[300]!,
      child: Center(
        child: Text(
          'Sliver Header\nHeight: $headerHeight',
          style: TextStyle(color: Colors.white),
        ),
      ),
    );
  }

  @override
  bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) {
    // 返回 true 表示当 delegate 变化时需要重建头部
    return false;
  }
}

Step 2: 在CustomScrollView中使用自定义的头部Delegate

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Sliver Header Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Sliver Header Demo'),
        ),
        body: CustomScrollView(
          slivers: <Widget>[
            SliverPersistentHeader(
              delegate: CustomSliverHeaderDelegate(),
              pinned: true, // 是否固定头部位置,即当内容滚动时头部是否保持可见
            ),
            SliverList(
              delegate: SliverChildBuilderDelegate(
                (BuildContext context, int index) {
                  return ListTile(
                    title: Text('Item $index'),
                  );
                },
                childCount: 50,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. CustomSliverHeaderDelegate:

    • 继承自SliverPersistentHeaderDelegate
    • 实现了minExtentmaxExtent属性,定义了头部最小和最大的高度。
    • build方法定义了头部的UI,它会根据shrinkOffset(头部被收缩了多少)来调整高度。
    • shouldRebuild方法决定了当delegate变化时是否需要重建头部。
  2. CustomScrollView:

    • 使用SliverPersistentHeader来包含我们的自定义头部delegate。
    • pinned: true表示头部在内容滚动时会保持固定位置。
    • SliverList用于展示列表项。

运行这个代码,你会看到一个带有自定义头部的滚动列表,头部的高度会根据滚动位置动态调整。希望这个示例能够帮助你理解如何在Flutter中使用SliverPersistentHeaderDelegate来自定义Sliver头部。

回到顶部