Flutter 粘合劑CustomScrollView控件

老孟導讀:快樂的51假期結束了,切換爲努力模式,今天給你們分享CustomScrollView組件,此組件在之後的項目中會常常用到,CustomScrollView就像一個粘合劑,將多個組件粘合在一塊兒,具統一的滾動效果。html

CustomScrollView

CustomScrollView是使用Sliver組件建立自定義滾動效果的滾動組件。使用場景:git

  1. ListView和GridView相互嵌套場景,ListView嵌套GridView時,須要給GridView指定高度,但咱們但願高度隨內容而變化(不指定),ListView和GridView使用同一個滾動效果。
  2. 一個頁面頂部是AppBar,而後是GridView,最後是ListView,這3個區域以總體來滾動,AppBar具備吸頂效果。

CustomScrollView就像一個粘合劑,將多個組件粘合在一塊兒,具統一的滾動效果。微信

Sliver系列組件有不少,好比SliverList、SliverGrid、SliverFixedExtentList、SliverPadding、SliverAppBar等。佈局

相互嵌套場景

在實際業務場景中常常見到這樣的佈局,頂部是網格佈局(GridView),而後是列表佈局(ListView),滾動的時候作爲一個總體,此場景是沒法使用GridView+ListView來實現的,而是須要使用CustomScrollView+SliverGrid+SliverList來實現,實現代碼以下:flex

CustomScrollView(
  slivers: <Widget>[
    SliverGrid.count(crossAxisCount: 4,children: List.generate(8, (index){
      return Container(
        color: Colors.primaries[index%Colors.primaries.length],
        alignment: Alignment.center,
        child: Text('$index',style: TextStyle(color: Colors.white,fontSize: 20),),
      );
    }).toList(),),
    SliverList(
      delegate: SliverChildBuilderDelegate((content, index) {
        return Container(
          height: 85,
          alignment: Alignment.center,
          color: Colors.primaries[index % Colors.primaries.length],
          child: Text('$index',style: TextStyle(color: Colors.white,fontSize: 20),),
        );
      }, childCount: 25),
    )
  ],
)
複製代碼

效果以下:ui

image-20200506105359845

頂部是AppBar場景

實際項目中頁面頂部是AppBar,而後是GridView,最後是ListView,這3個區域以總體來滾動,AppBar具備吸頂效果,此效果也是咱們常常遇到的,用法以下:spa

CustomScrollView(
  slivers: <Widget>[
    SliverAppBar(
      pinned: true,
      expandedHeight: 230.0,
      flexibleSpace: FlexibleSpaceBar(
        title: Text('復仇者聯盟'),
        background: Image.network(
          'http://img.haote.com/upload/20180918/2018091815372344164.jpg',
          fit: BoxFit.fitHeight,
        ),
      ),
    ),
    SliverGrid.count(crossAxisCount: 4,children: List.generate(8, (index){
      return Container(
        color: Colors.primaries[index%Colors.primaries.length],
        alignment: Alignment.center,
        child: Text('$index',style: TextStyle(color: Colors.white,fontSize: 20),),
      );
    }).toList(),),
    SliverList(
      delegate: SliverChildBuilderDelegate((content, index) {
        return Container(
          height: 85,
          alignment: Alignment.center,
          color: Colors.primaries[index % Colors.primaries.length],
          child: Text('$index',style: TextStyle(color: Colors.white,fontSize: 20),),
        );
      }, childCount: 25),
    )
  ],
)
複製代碼

效果以下:.net

CustomScrollView_1

經過scrollDirectionreverse參數控制其滾動方向,用法以下:3d

CustomScrollView(
  scrollDirection: Axis.horizontal,
  reverse: true,
  ...
)
複製代碼

scrollDirection滾動方向,分爲垂直和水平方向。code

reverse參數表示反轉滾動方向,並非垂直轉爲水平,而是垂直方向滾動時,默認向下滾動,reverse設置false,滾動方向改成向上,同理水平滾動改成水平向左。

primary設置爲true時,不能設置controller,由於primarytrue時,controller使用PrimaryScrollController,這種機制帶來的好處是父組件能夠控制子樹中可滾動組件的滾動行爲,例如,Scaffold正是使用這種機制在iOS中實現了點擊導航欄回到頂部的功能。

controller爲滾動控制器,能夠監聽滾到的位置,設置滾動的位置等,用法以下:

_scrollController = ScrollController();

//監聽滾動位置
    _scrollController.addListener((){
      print('${_scrollController.position}');
    });
    //滾動到指定位置
    _scrollController.animateTo(20.0);

CustomScrollView(
	controller: _scrollController,
	...
) 
複製代碼

physics表示可滾動組件的物理滾動特性,具體查看ScrollPhysics

交流

老孟Flutter博客地址(近200個控件用法):laomengit.com

歡迎加入Flutter交流羣(微信:laomengit)、關注公衆號【老孟Flutter】:

相關文章
相關標籤/搜索