CustomScrollView
- 一、SliverAppbar 控件介绍
- 二、CustomScrollView控件介绍
- 三、CustomScrollView集成SLiverAppBar案例
一、SliverAppbar 控件介绍
SliverAppBar “应用栏” 相当于升级版的 appbar 于 AppBar 位置的固定的应用最上面的; 而 SliverAppBar 是可以跟随内容滚动的;
1、使用方法
- 与CustomScrollView、NestedScrollView集成的材质设计应用栏。应用栏由工具栏和其他小部件组成,例如 TabBar和FlexibleSpaceBar。应用栏通常会使用IconButton公开一个或多个常见操作,后者可选地后跟 PopupMenuButton以进行不太常见的操作
- 注意点:
通常结合 CustomScrollView 、 NestedScrollView 来使用它, NestedScrollView里面可以嵌套Listview 完成滑动
2、基本属性
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.textTheme, this.primary = true, this.centerTitle, this.titleSpacing = NavigationToolbar.kMiddleSpacing,this.expandedHeight, this.floating = false, this.pinned = false, this.snap = false, })
3、常用属性
- 在标题前面显示的一个控件,在首页通常显示应用的logo;在其他界面通常显示为返回按钮。
leading: Icon(_selectedChoice.icon) ,
- 控制是否应该尝试暗示前导小部件为null(如果有 leading 这个不会管用 ,相当于忽略这个参数 ; 如果没有leading ,当有侧边栏的时候, false:不会显示默认的图片,true 会显示 默认图片,并响应打开侧边栏的事件)
automaticallyImplyLeading:true,
- 当前界面的标题文字
title: Text(_selectedChoice.title )
- 一个 Widget 列表,代表 Toolbar 中所显示的菜单,对于常用的菜单,通常使用 IconButton 来表示;对于不常用的菜单通常使用 PopupMenuButton 来显示为三个点,点击后弹出二级菜单
actions: <Widget>[new IconButton( icon: new Icon(choices[0].icon),onPressed: () { _select(choices[0]); },),new IconButton( icon: new Icon(choices[1].icon),onPressed: () { _select(choices[1]); },),new PopupMenuButton<Choice>( onSelected: _select,itemBuilder: (BuildContext context) {return choices.skip(2).map((Choice choice) {return new PopupMenuItem<Choice>(value: choice,child: new Text(choice.title),);}).toList();},)],
- 一个显示在 AppBar 下方的控件&#xff0c;高度和 AppBar 高度一样&#xff0c;可以实现一些特殊的效果&#xff0c;该属性通常在 SliverAppBar 中使用
flexibleSpace: Container(color: Colors.blue,width: MediaQuery.of(context).size.width,child: Text("aaaaaaaaaa"),height: 10,)
- 一个 AppBarBottomWidget 对象&#xff0c;通常是 TabBar。用来在 Toolbar 标题下面显示一个 Tab 导航栏
bottom: new TabBar(isScrollable: true,tabs: choices.map((Choice choice) {return new Tab(text: choice.title,icon: new Icon(choice.icon),);}).toList(),)
- 标题居中显示
centerTitle: true,
- 此应用栏是否显示在屏幕顶部
primary: true,
- appbar是否随着滑动隐藏标题
floating: true,
- tab 是否固定在顶部&#xff08;为true是固定&#xff0c;为false是不固定&#xff09;
pinned: true,
- 与floating结合使用,如果snap和floating为true&#xff0c;则浮动应用栏将“捕捉”到视图中
snap: true,
- 可滚动视图的高度&#xff08;默认高度是状态栏和导航栏的高度&#xff0c;如果有滚动视差的话&#xff0c;要大于前两者的高度&#xff09;
expandedHeight: 200.0,
二、CustomScrollView控件介绍
1、使用方法
- CustomScrollView是可以使用sliver来自定义滚动模型&#xff08;效果&#xff09;的ScrollView类型的widget。它可以包含多种滚动模型&#xff0c;举个例子&#xff0c;假设有一个页面&#xff0c;顶部需要一个GridView&#xff0c;底部需要一个ListView&#xff0c;而要求整个页面的滑动效果是统一的&#xff0c;即它们看起来是一个整体&#xff0c;如果使用GridView&#43;ListView来实现的话&#xff0c;就不能保证一致的滑动效果&#xff0c;因为它们的滚动效果是分离的&#xff0c;所以这时就需要一个"胶水"&#xff0c;把这些彼此独立的可滚动widget&#xff08;Sliver&#xff09;"粘"起来&#xff0c;而CustomScrollView的功能就相当于“胶水”。
- CustomScrollView让你可以直接提供 slivers来创建不同的滚动效果&#xff0c;比如Lists,grids 以及 expanding headers。
- Sliver有细片、小片之意&#xff0c;在Flutter中&#xff0c;Sliver通常指具有特定滚动效果的可滚动块。可滚动widget&#xff0c;如ListView、GridView等都有对应的Sliver实现如SliverList、SliverGrid等。对于大多数Sliver来说&#xff0c;它们和可滚动Widget最主要的区别是Sliver不会包含Scrollable Widget&#xff0c;也就是说Sliver本身不包含滚动交互模型 &#xff0c;正因如此&#xff0c;CustomScrollView才可以将多个Sliver"粘"在一起&#xff0c;这些Sliver共用CustomScrollView的Scrollable&#xff0c;最终实现统一的滑动效果。
2、基本属性
const CustomScrollView({Key key,Axis scrollDirection &#61; Axis.vertical,bool reverse &#61; false,ScrollController controller,bool primary,ScrollPhysics physics,bool shrinkWrap &#61; false,Key center,double anchor &#61; 0.0,double cacheExtent,this.slivers &#61; const <Widget>[],int semanticChildCount,DragStartBehavior dragStartBehavior &#61; DragStartBehavior.start,}) : super(key: key,scrollDirection: scrollDirection,reverse: reverse,controller: controller,primary: primary,physics: physics,shrinkWrap: shrinkWrap,center: center,anchor: anchor,cacheExtent: cacheExtent,semanticChildCount: semanticChildCount,dragStartBehavior: dragStartBehavior,);
三、CustomScrollView集成SLiverAppBar案例
import &#39;package:flutter/material.dart&#39;;class CustomScrollViewTestRoute extends StatelessWidget {&#64;overrideWidget build(BuildContext context) {return Material(child: CustomScrollView(slivers: <Widget>[SliverAppBar(pinned: true,expandedHeight: 250.0,flexibleSpace: FlexibleSpaceBar(title: const Text(&#39;Demo&#39;),background: Image.asset("./images/avatar.png", fit: BoxFit.cover,),),),SliverPadding(padding: const EdgeInsets.all(8.0),sliver: new SliverGrid( gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, mainAxisSpacing: 10.0,crossAxisSpacing: 10.0,childAspectRatio: 4.0,),delegate: new SliverChildBuilderDelegate((BuildContext context, int index) {return new Container(alignment: Alignment.center,color: Colors.cyan[100 * (index % 9)],child: new Text(&#39;grid item $index&#39;),);},childCount: 20,),),),new SliverFixedExtentList(itemExtent: 50.0,delegate: new SliverChildBuilderDelegate((BuildContext context, int index) {return new Container(alignment: Alignment.center,color: Colors.lightBlue[100 * (index % 9)],child: new Text(&#39;list item $index&#39;),);},childCount: 50 ),),],),);}
}
代码分为三部分&#xff1a;
- 头部SliverAppBar&#xff1a;SliverAppBar对应AppBar&#xff0c;两者不同之处在于SliverAppBar可以集成到CustomScrollView。SliverAppBar可以结合FlexibleSpaceBar实现Material Design中头部伸缩的模型&#xff0c;具体效果&#xff0c;读者可以运行该示例查看。
- 中间的SliverGrid&#xff1a;它用SliverPadding包裹以给SliverGrid添加补白。SliverGrid是一个两列&#xff0c;宽高比为4的网格&#xff0c;它有20个子组件。
- 底部SliverFixedExtentList&#xff1a;它是一个所有子元素高度都为50像素的列表。