Flutter是谷歌的移動UI框架,能夠快速在iOS和Android上構建高質量的原生用戶界面。git
IT界著名的尼古拉斯·高爾包曾說:輪子是IT進步的階梯!熱門的框架千篇一概,好用輪子萬里挑一!Flutter做爲這兩年開始崛起的跨平臺開發框架,其第三方生態相比其餘成熟框架還略有不足,但輪子的數量也已經不少了。本系列文章挑選平常app開發經常使用的輪子分享出來,給你們提升搬磚效率,同時也但願flutter的生態愈來愈完善,輪子愈來愈多。github
本系列文章準備了超過50個輪子推薦,工做緣由,儘可能每1-2天出一篇文章。markdown
tip:本系列文章合適已有部分flutter基礎的開發者,入門請戳:flutter官網app
dependencies: sliding_up_panel: ^0.3.6 複製代碼
import 'package:sliding_up_panel/sliding_up_panel.dart'; 複製代碼
@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("SlidingUpPanelExample"), ), body: SlidingUpPanel( panel: Center( child: Text("這裏是抽屜區"), ), body: Center( child: Text("這麼是頁面區"), ), ), ); } 複製代碼
經過選項能夠實現更多控制:框架
參數 | 描述 |
---|---|
panel |
(必需)滑入視圖的小部件。當panel摺疊且若是collapsed爲null時,將顯示此Widget的頂部;不然,collapsed將顯示在此小部件的頂部。 |
collapsed |
panel摺疊時,小部件顯示在上方。隨着panel打開,此效果逐漸消失。 |
body |
位於滑動面板下方的小部件。該小部件會自動調整大小以填充屏幕。 |
minHeight |
徹底摺疊時滑動面板的高度。 |
maxHeight |
徹底打開時滑動面板的高度。 |
border |
在滑動面板上繪製邊框。 |
borderRadius |
若是不爲空,則以此將滑板面板繪製圓角。 |
boxShadow |
滑動面板表後面投射的陰影。 |
color |
填充滑動面板背景的顏色 |
padding |
滑動面板padding |
margin |
滑動面板margin |
renderPanelSheet |
設置爲false可不渲染panel位於其上的圖紙。這意味着,只有body,collapsed和panel窗口小部件會被渲染。若是要實現浮動效果或須要對滑動面板的外觀進行更多自定義,請將其設置爲false。 |
panelSnapping |
設置爲false可禁用面板快速打開或關閉。 |
backdropEnabled |
若是不爲空,則body在面板滑動打開時在上顯示暗陰影。 |
backdropColor |
陰影顏色。 |
backdropOpacity |
陰影透明度,0.0-1.0 |
backdropTapClosesPanel |
是否輕按背景關閉面板。默認爲true。 |
controller |
控制器 |
onPanelSlide |
若是不爲null,則在面板隨面板的當前位置滑動時調用此回調。該位置是0.0和1.0之間的雙精度數,其中0.0徹底摺疊,而1.0徹底打開。 |
onPanelOpened |
若是非null,則在面板徹底打開時調用此回調。 |
onPanelClosed |
若是爲非null,則在面板徹底摺疊時調用此回調。 |
parallaxEnabled |
若是非null和true,則在面板向上滑動時,SlidingUpPanel會顯示視差效果。本質上,隨着面板的滑動,身體也會向上滑動。 |
parallaxOffset |
容許根據面板向上/向下滑動的百分比指定視差效果的程度。推薦值在0.0和1.0之間,其中0.0爲無視差,而1.0則模仿一對一的滾動效果。默認爲10%視差。 |
isDraggable |
容許切換SlidingUpPanel的可拖動性。將此設置爲false能夠防止用戶上下拖動面板。默認爲true。 |
slideDirection |
抽屜的方向: SlideDirection.UP or SlideDirection.DOWN . |
defaultPanelState |
面板的默認狀態;PanelState.OPEN或PanelState.CLOSED。此值的默認值PanelState.CLOSED表示面板處於關閉位置,必須將其打開。PanelState.OPEN表示默認狀況下面板是打開的,而且必須由用戶滑動關閉。 |
class ToutiaoDemo extends StatefulWidget { ToutiaoDemo({Key key}) : super(key: key); @override _ToutiaoDemoState createState() => _ToutiaoDemoState(); } class _ToutiaoDemoState extends State<ToutiaoDemo> { PanelController panel = new PanelController(); double offsetDistance = 0.0; double offsetY=0; @override Widget build(BuildContext context) { return Container( child: SlidingUpPanel( controller:panel, minHeight: 0, borderRadius: BorderRadius.only( topLeft: Radius.circular(24.0), topRight: Radius.circular(24.0), ), body: GestureDetector( child: new ConstrainedBox( constraints: BoxConstraints.expand(), child: new Image.asset( "assets/img1.jpg", fit: BoxFit.fill, ), ), onTap: (){ panel.close(); }, onVerticalDragDown: (details){ // print(details.globalPosition.dy); offsetDistance=details.globalPosition.dy; }, onVerticalDragUpdate: (details){ offsetY=details.globalPosition.dy-offsetDistance; if(offsetY>0){ print("向下"+offsetY.toString()); }else{ print("向上"+offsetY.toString()); double position=offsetY.abs()/300; position=position>1?1:position; panel.setPanelPosition(position); if(position>0.4){ panel.open(); } } }, ), panel: Container( child: Center( child: Text("評論區",style: TextStyle(color: Colors.grey,fontSize: 16,fontWeight: FontWeight.normal,decoration:TextDecoration.none)), ), ), ), ); } } 複製代碼
效果圖: ide