flutter 基础 —— CustomScrollView 与 Slivers


一、CustomScrollView 的作用

创建一个公共的 Scrollable 和 Viewport ,然后它的 slivers 参数接受一个 Sliver 数组

二、常用 Sliver 组件对照表

Sliver名称功能对应的可滚动组件
SliverList 列表 ListView
SliverFixedExtentList 高度固定的列表 ListView,指定itemExtent
SliverAnimatedList 添加/删除列表项可以执行动画 AnimatedList
SliverGrid 网格 GridView
SliverPrototypeExtentList 根据原型生成高度固定的列表 ListView,指定prototypeItem 时
SliverFillViewport 包含多给子组件,每个都可以填满屏幕 PageView

三、SliverAppBar 的使用

效果

代码

class CustomScrollViewPage extends StatelessWidget {
  const CustomScrollViewPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Scrollbar(
          child: CustomScrollView(
        slivers: [
          // 导航栏
          SliverAppBar(
            pinned: true,
            expandedHeight: 200,
            title: Text("HELLO"),
            leading: Center(child: Text('L')),
            flexibleSpace: FlexibleSpaceBar(
              title: Text("DEMO"),
              background: Image.asset("./images/demo.jpg", fit: BoxFit.cover,),
            ),
          ),
          SliverPadding(
            padding: EdgeInsets.all(18),
            // 等价于 GridView
            sliver: SliverGrid(
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 3,
                crossAxisSpacing: 2,
                mainAxisSpacing: 2,
              ),
              delegate: SliverChildBuilderDelegate(
                (context, idx) => Text("网格, $idx"),
                childCount: 6,
              ),
            ),
          ),
          // 等价于 ListView 指定子项高度 itemExtent
          SliverFixedExtentList(
            delegate: SliverChildBuilderDelegate(
              (context, index) => Center(
                child: Text("你好, $index"),
              ),
              childCount: 10,
            ),
            itemExtent: 50,
          ),
        ],
      )),
    );
  }
}

233