CustomScrollView

CustomScrollView 是 Flutter 中用于构建复杂滚动效果的核心组件,它允许将多个不同类型的滚动组件(如列表、网格、图片等)组合成一个统一的滚动视图,并共享同一个滚动轴,实现连贯的滚动体验。
核心特点
支持组合多种 Sliver 组件(如 SliverList、SliverGrid、SliverAppBar 等)
所有子组件共享同一个滚动状态,滚动行为连贯
可实现复杂交互效果(如滚动时导航栏变化、视差效果、粘性头部等)
性能优化:仅构建可视区域内的组件,适合长列表或复杂滚动场景
基本用法
CustomScrollView 的核心是 slivers 属性,它接收一个 List,其中每个元素必须是 Sliver 类型组件(名称以 Sliver 开头的组件)。

import ‘package:flutter/material.dart’;

class MyCustomScrollView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomScrollView(
slivers: [
// 1. 可折叠的导航栏(滚动时会变化)
SliverAppBar(
title: Text(‘CustomScrollView Demo’),
expandedHeight: 200, // 展开时的高度
flexibleSpace: FlexibleSpaceBar(
background: Image.network(
‘https://picsum.photos/800/400’,
fit: BoxFit.cover,
),
),
floating: true, // 滚动时快速显示
pinned: true, // 导航栏始终固定在顶部
),

// 2. 固定高度的组件(通过 SliverToBoxAdapter 包裹普通 Widget)
SliverToBoxAdapter(
child: Container(
padding: EdgeInsets.all(16),
child: Text(‘以下是列表内容:’, style: TextStyle(fontSize: 18)),
),
),

// 3. 列表(SliverList)
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) => ListTile(
title: Text(‘列表项 ${index + 1}’),
),
childCount: 20, // 列表项数量
),
),

// 4. 网格(SliverGrid)
SliverGrid(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2, // 每行2列
crossAxisSpacing: 8,
mainAxisSpacing: 8,
childAspectRatio: 1.5, // 宽高比
),
delegate: SliverChildBuilderDelegate(
(context, index) => Container(
color: Colors.blue[100 * (index % 9 + 1)],
child: Center(child: Text(‘网格项 ${index + 1}’)),
),
childCount: 10, // 网格项数量
),
),
],
),
);
}
}

常用 Sliver 组件
SliverAppBar:可滚动的导航栏,支持展开 / 折叠、视差效果等。
SliverList:类似 ListView,用于展示线性列表。
SliverGrid:类似 GridView,用于展示网格布局。
SliverToBoxAdapter:将普通 Widget 转换为 Sliver 组件(用于插入非滚动组件)。
SliverPadding:为子 Sliver 组件添加内边距。
SliverPersistentHeader:粘性头部(滚动时固定在顶部或指定位置)。
SliverSafeArea:适配设备安全区域(如刘海屏)。
关键属性
slivers:List 类型,存放所有 Sliver 子组件(核心属性)。
scrollDirection:滚动方向(默认垂直 Axis.vertical,可选水平 Axis.horizontal)。
reverse:是否反向滚动(默认 false)。
controller:ScrollController 类型,用于控制滚动位置、监听滚动事件。
physics:滚动物理效果(如 AlwaysScrollableScrollPhysics、NeverScrollableScrollPhysics 等)。
适用场景
需组合列表、网格、图片等多种滚动元素的页面(如首页、详情页)。
需实现复杂滚动交互(如滚动时导航栏渐变、粘性分类标题)。
需优化长列表性能(利用 Sliver 的懒加载特性)。
注意事项
所有子组件必须是 Sliver 类型,普通 Widget 需用 SliverToBoxAdapter 包裹。
SliverList 和 SliverGrid 的 delegate 推荐使用 SliverChildBuilderDelegate,实现懒加载(只构建可见项)。
与 NestedScrollView 配合可实现嵌套滚动(如列表中嵌套另一个滚动视图)。

通过 CustomScrollView,可以灵活构建各种复杂的滚动布局,兼顾性能与交互体验。