老孟導讀:快樂的51假期結束了,切換爲努力模式,今天給你們分享CustomScrollView組件,此組件在之後的項目中會常常用到,CustomScrollView就像一個粘合劑,將多個組件粘合在一塊兒,具統一的滾動效果。html
CustomScrollView是使用Sliver組件建立自定義滾動效果的滾動組件。使用場景:git
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
實際項目中頁面頂部是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
經過scrollDirection
和reverse
參數控制其滾動方向,用法以下:3d
CustomScrollView(
scrollDirection: Axis.horizontal,
reverse: true,
...
)
複製代碼
scrollDirection
滾動方向,分爲垂直和水平方向。code
reverse
參數表示反轉滾動方向,並非垂直轉爲水平,而是垂直方向滾動時,默認向下滾動,reverse
設置false,滾動方向改成向上,同理水平滾動改成水平向左。
primary
設置爲true時,不能設置controller
,由於primary
true時,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】:
![]() |
![]() |