Flutter 之 Sliver 系列控件

SliverAppBar

SliverAppBar 控件,一个 MD 的 AppBar 。属性和 AppBar 类似,但做的效果比 AppBar 更加强大。相同的属性具体可以看 Flutter 之 Scaffold 控件 , 里面有 AppBar 控件的介绍。那么还有些没有的属性:

属性

  • forceElevated

结合 elevation 使用,当elevation 不为 0 的时候,是否显示阴影

  • expandedHeight

AppBar 展开时候的高度

  • floating

true 的时候下滑AppBar优先滑动展示,展示完成后才给滑动控件滑动

  • snap

snap 为 true, 则 floating 也要为 true 。true 的时候根据手指松开的位置展开或者收缩AppBar

  • pinned

appBar 收缩到最小高度的时候 appBar 是否可见

用法

SliverAppBar 往往做为 CustomScrollView 的第一个子元素,根据滚动控件的偏移量或者浮动的位置来改变 SliverAppBar 的高度。所以具体用法如下

class _MyHomePageState extends State<MyHomePage> {
  ScrollController _scrollController;
  VoidCallback onChange;

  @override
  void initState() {
    super.initState();
    _scrollController = ScrollController();
    onChange = () {
      print('onChange');
    };
    _scrollController.addListener(onChange);
  }

  @override
  void dispose() {
    _scrollController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: new CustomScrollView(
        //滚动方向
        scrollDirection: Axis.vertical,
        //是否反转滚动方向
        reverse: false,
        //监听事件等等控制器
        controller: _scrollController,
        //true 的话 controller 一定要为null
        primary: false,
        //滑动效果,如阻尼效果等等
        physics: const BouncingScrollPhysics(),
        //滑动控件是否在头部上面滑过去
        shrinkWrap: false,
        //0到1之间,到顶部的距离
        anchor: 0.0,
        //“预加载”的区域,0.0 为关闭预加载
        cacheExtent: 0.0,
        slivers: <Widget>[
          SliverAppBar(
            elevation: 5,
            forceElevated: true,
            expandedHeight: 250.0,
            floating: true,
            snap: true,
            pinned: true,
            flexibleSpace: FlexibleSpaceBar(
              title: const Text('SliverAppBar'),
              background: Image.network(
                'https://cn.bing.com/th?id=OIP.xq1C2fmnSw5DEoRMC86vJwD6D6&pid=Api&rs=1',
                fit: BoxFit.fill,
              ),
              //标题是否居中
              centerTitle: true,
              //标题间距
              titlePadding: EdgeInsetsDirectional.only(start: 0, bottom: 16),
              collapseMode: CollapseMode.none,
            ),
          ),
        ],
        semanticChildCount: 6,//可见子元素的总数
      ),
    );
  }
}

另外在上面设计到 FlexibleSpaceBar 控件,FlexibleSpaceBar 有个 collapseMode 属性

  • CollapseMode.none 背景不随着滚动
  • CollapseMode.parallax 背景滚动具有视差效果
  • CollapseMode.pin 背景随着滚动,并且手指松开的时候根据松开位置进行展开收缩 AppBar 。

SliverPadding

为 Sliver 系列控件添加一个 padding 。如给上面 SliverAppBar 添加一个 Padding 。

SliverPadding(
            padding: EdgeInsets.all(10.0),
            sliver: SliverAppBar(...),
            ),
          )
AppBar效果.png

SliverGrid

多行多列的列表控件,相当于 Android 的 GridView,有两个属性

  • delegate

SliverChildDelegate,这里有两种方式创建

  • SliverChildListDelegate 一般用来构 item 不多的列表,效率更低。
List<String> _gridLists = ['grid item 1','grid item 2','grid item 3','grid item 4','grid item 5'];

delegate: SliverChildListDelegate(
                  _gridLists.map((name){
                    return new Container(
                      alignment: Alignment.center,
                      color: Colors.blue,
                      child: new Text(name),
                    );
                  }).toList()
              ),
  • SliverChildBuilderDelegate 一般用来构 item 更多的列表,效率更高。
delegate: new SliverChildBuilderDelegate(
                    (BuildContext context, int index) {
                  //创建子widget
                  return new Container(
                    alignment: Alignment.center,
                    color: Colors.blue,
                    child: new Text('grid item $index'),
                  );
                },
                childCount: 20,
              ),
  • gridDelegate

SliverGridDelegate,也是有两种方式创建

  • SliverGridDelegateWithMaxCrossAxisExtent,根据给的 maxCrossAxisExtent 最大宽度自动分配一列展示多少个。
gridDelegate: new SliverGridDelegateWithMaxCrossAxisExtent(
                maxCrossAxisExtent: 150,
                mainAxisSpacing: 10.0, //主轴中间间距
                crossAxisSpacing: 10.0, //副轴中间间距
                childAspectRatio: 2.0, //item 宽高比
              ),
  • SliverGridDelegateWithFixedCrossAxisCount,固定展示多少列。
gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 4,
                mainAxisSpacing: 10.0, //主轴中间间距
                crossAxisSpacing: 10.0, //副轴中间间距
                childAspectRatio: 2.0, //item 宽高比
              )

结合上面展示效果

image.png

SliverList

和上面 delegate 属性一样,需要创建一个 SliverChildDelegate 。

new SliverList(
            delegate: new SliverChildBuilderDelegate(
                    (BuildContext context, int index) {
                  //创建列表项
                  return new Container(
                    height: 50,
                    alignment: Alignment.center,
                    color: Colors.lightBlue[100 * ((index % 9) + 1)],
                    child: new Text('list item $index'),
                  );
                }, childCount: 30 //30个列表项
            ),
          ),
image.png

SliverFixedExtentList

比 SliverList 多一个 itemExtent 属性,设置 item 的高度 。item 里面的子控件无法再改动高度。

SliverPersistentHeader

上面 SliverAppBar 就是结合 SliverPersistentHeader 实现的效果,SliverPersistentHeader 需要一个 SliverPersistentHeaderDelegate 。 实现 SliverPersistentHeaderDelegate 有 4 个方法需要重写

class SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
  @override
  Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) {
    // TODO: implement build
    return null;
  }
  @override
  // TODO: implement maxExtent
  double get maxExtent => null;

  @override
  // TODO: implement minExtent
  double get minExtent => null;

  @override
  bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) {
    // TODO: implement shouldRebuild
    return null;
  }
}

至于效果,具体效果具体分析。

SliverToBoxAdapter

有一个 Widget 属性,主要作用是在 CustomScrollView 里面添加多种不同布局的样式。

new SliverToBoxAdapter(
            child: Container(
              height: 100,
              child: Text('SliverToBoxAdapter'),
            ),
          ),

SliverFillViewport

占满一屏或者比一屏更多的布局,

new SliverFillViewport(
              delegate:new SliverChildBuilderDelegate(
                      (BuildContext context, int index) {
                    //创建列表项
                    return new Container(
                      alignment: Alignment.center,
                      color: Colors.lightBlue,
                      child: new Text('SliverFillViewport'),
                    );
                  }, childCount: 1
              ),
              viewportFraction:1.0,//占屏幕的比例
          ),

SliverFillRemaining

滑动剩余部分展示的布局

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • 这真是一个充满魔力迷幻的地方,身处其间并没有很兴奋,一草一木都是前世的熟捻,清清淡淡,施然游园,似乎上辈子我就生活...
    寂静林风阅读 255评论 1 2
  • 六月初里,气温总维持在三十度左右,没有风,中午的太阳也不是很毒,路上还可以看到一两个不怕晒,只穿着背心短裤跑步的人...
    远山玫瑰阅读 696评论 0 2
  • 第一次玩这个App,觉得很棒啊ʕ•̀ω•́ʔ✧ 读万卷书不如行万里路。我们从家里上办公室,上学校,上小菜场,每天走...
    Moment66阅读 311评论 0 0
  • 原版链接:https://samsclass.info/123/proj10/p12-hashcat.htm补充:...
    2mpossible阅读 2,536评论 0 1
  • 本科的时候打lol,我喜欢用有控制技能的英雄。我们宿舍一起开黑,准备团战往上冲的时候,哥几个就经常冲我喊,有控没,...
    子撇左是不阅读 236评论 2 2