Flutter CustomScrollView 组件详解
简介
CustomScrollView 是一个可以组合多个滚动组件的高级滚动组件。它允许我们创建一个统一的可滚动区域,其中可以包含不同的滚动效果。所有的子组件必须是 Sliver 家族的组件。
基本用法
dart
CustomScrollView(
slivers: <Widget>[
// 一个 AppBar,包含一个标题
SliverAppBar(
pinned: true,
expandedHeight: 200.0,
flexibleSpace: FlexibleSpaceBar(
title: Text('CustomScrollView Demo'),
),
),
// 一个网格
SliverGrid(
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 200.0,
mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0,
childAspectRatio: 4.0,
),
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
alignment: Alignment.center,
color: Colors.teal[100 * (index % 9)],
child: Text('grid item $index'),
);
},
childCount: 20,
),
),
// 一个列表
SliverFixedExtentList(
itemExtent: 50.0,
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
alignment: Alignment.center,
color: Colors.lightBlue[100 * (index % 9)],
child: Text('list item $index'),
);
},
childCount: 20,
),
),
],
)
常用的 Sliver 组件
- SliverAppBar: 可以展开和折叠的应用栏
- SliverList: 列表
- SliverGrid: 网格
- SliverToBoxAdapter: 将普通 Widget 转换为 Sliver
- SliverPadding: 为 Sliver 添加内边距
- SliverPersistentHeader: 可以固定在顶部的头部组件
使用场景
- 需要组合多种滚动效果时
- 实现复杂的滚动界面
- 需要自定义滚动行为时
注意事项
- CustomScrollView 的子组件必须是 Sliver 家族的组件
- 如果要使用普通 Widget,需要用 SliverToBoxAdapter 包裹
- 注意性能优化,合理使用懒加载
完整示例
dart
class CustomScrollViewDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomScrollView(
slivers: <Widget>[
// 应用栏
SliverAppBar(
pinned: true,
expandedHeight: 200.0,
flexibleSpace: FlexibleSpaceBar(
title: Text('CustomScrollView Demo'),
background: Image.network(
'https://picsum.photos/seed/picsum/200/300',
fit: BoxFit.cover,
),
),
),
// 网格部分
SliverPadding(
padding: const EdgeInsets.all(8.0),
sliver: SliverGrid(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0,
childAspectRatio: 4.0,
),
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
alignment: Alignment.center,
color: Colors.teal[100 * (index % 9)],
child: Text('grid item $index'),
);
},
childCount: 20,
),
),
),
// 列表部分
SliverFixedExtentList(
itemExtent: 50.0,
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
alignment: Alignment.center,
color: Colors.lightBlue[100 * (index % 9)],
child: Text('list item $index'),
);
},
childCount: 20,
),
),
],
),
);
}
}
总结
CustomScrollView 是一个强大的滚动组件,通过组合不同的 Sliver 组件,可以实现复杂的滚动效果。在使用时需要注意性能优化和组件的正确使用方式。