前言

CustomScrollView是可以使用Sliver来自定义滚动模型(效果)的组件。它可以包含多种滚动模型,举个例子,假设有一个页面,顶部需要一个GridView,底部需要一个ListView,而要求整个页面的滑动效果是统一的,即它们看起来是一个整体。如果使用GridView+ListView来实现的话,就不能保证一致的滑动效果,因为它们的滚动效果是分离的,所以这时就需要一个"胶水",把这些彼此独立的可滚动组件"粘"起来,而CustomScrollView的功能就相当于“胶水”。

接口描述

const CustomScrollView({
Key key,
Axis scrollDirection = Axis.vertical,
bool reverse = false,
ScrollController controller,
bool primary,
ScrollPhysics physics,
bool shrinkWrap = false,
Key center,
double anchor = 0.0,
double cacheExtent,
this.slivers = const <Widget>[],
int semanticChildCount,
DragStartBehavior dragStartBehavior = DragStartBehavior.start,
}) const SliverAppBar({
Key key,
this.leading,
this.automaticallyImplyLeading = true,
this.title,
this.actions,
this.flexibleSpace,
this.bottom,
this.elevation,
this.forceElevated = false,
this.backgroundColor,
this.brightness,
this.iconTheme,
this.actionsIconTheme,
this.textTheme,
this.primary = true,
this.centerTitle,
this.titleSpacing = NavigationToolbar.kMiddleSpacing,
this.expandedHeight,
this.floating = false,
this.pinned = false,
this.snap = false,
this.shape,
})

代码示例

// CustomScrollView

import 'package:flutter/material.dart';

class CustomScrollViewTest extends StatelessWidget{
@override
Widget build(BuildContext context){
// 因为本路由没有使用Scaffold,为了让子级Widget(如Text)使用
// Material Design 默认的样式风格,我们使用Material作为本路由的根。
return Material(
child: CustomScrollView(
slivers: <Widget>[
// 类似AppBar,包括一个导航栏,两者不同之处在于SliverAppBar可以集成到CustomScrollView。
// SliverAppBar可以结合FlexibleSpaceBar实现Material Design中头部伸缩的模型。
SliverAppBar(
pinned: true,
expandedHeight: 250.0,
flexibleSpace: FlexibleSpaceBar(
title: const Text('Demo'),
background: Image.asset('assets/images/avatar.png', fit: BoxFit.cover,),
),
), // 用SliverPadding包裹以给SliverGrid添加补白。SliverGrid是一个两列,宽高比为4的网格,它有20个子组件。
SliverPadding(
padding: const EdgeInsets.all(8.0),
sliver: SliverGrid(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
// Grid按两列显示
crossAxisCount: 2,
mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0,
childAspectRatio: 4.0,
),
delegate: SliverChildBuilderDelegate((BuildContext context, int index){
// 创建子widget
return Container(
alignment: Alignment.center,
color: Colors.cyan[100*(index%9)],
child: Text('grid item $index'),
);
},
childCount: 20,
),
),
), // 是一个所有子元素高度都为50像素的列表
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'),
);
},
// 50个列表项
childCount: 50,
),
)
],
),
);
}
}

总结

  • 头部SliverAppBar:SliverAppBar对应AppBar,两者不同之处在于SliverAppBar可以集成到CustomScrollView。SliverAppBar可以结合FlexibleSpaceBar实现Material Design中头部伸缩的模型,具体效果。
  • 中间的SliverGrid:它用SliverPadding包裹以给SliverGrid添加补白。SliverGrid是一个两列,宽高比为4的网格,它有20个子组件。
  • 底部SliverFixedExtentList:它是一个所有子元素高度都为50像素的列表。

最新文章

  1. BFC之清除浮动篇&amp;clear
  2. 5.bootstrap练习笔记-巨幕和流体布局
  3. ADO.NET学习
  4. 007-Scala类的属性和对象私有字段实战详解
  5. Windows 10和Visual Studio 2015 能给.Net方向的开发从业者带来什么?
  6. select 触发事件
  7. Elasticsearch【mappings】类型配置操作
  8. ./configure,make,make install的作用(转)
  9. C#按需序列化对象为Json字符串
  10. Linux下OpenSSL的安装与使用
  11. 纯CSS气泡框实现方法探究
  12. UNIX/Linux进程间通信IPC---管道--全总结(实例入门)
  13. React是什么,为什么要使用它?
  14. vue-cli的使用
  15. Laravel 1071 Specified key was too long
  16. ecplise中设置字符编码
  17. leetcode 算法分类
  18. VS Code 安装 C++ 调试环境
  19. 20.Module 的语法
  20. bootstrap-table前端修改数据

热门文章

  1. 【SPOJ QTREE4】Query on a tree IV(树链剖分)
  2. 算法——n皇后问题
  3. JApiDocs(自动生成接口文档神器)
  4. The Linux Scheduler: a Decade of Wasted Cores
  5. html+css一些简单案例:爱心点击,盒子模型,2d动画
  6. 推荐系统实践 0x11 NeuralCF
  7. 【Idea插件】kotlin的orm框架一键生成代码框架
  8. 第六章 Sleuth--链路追踪
  9. 精尽Spring MVC源码分析 - HandlerAdapter 组件(四)之 HandlerMethodReturnValueHandler
  10. JavaScript之函数原型链完整版