Flutter是谷歌的移動UI框架,能夠快速在iOS和Android上構建高質量的原生用戶界面。git
IT界著名的尼古拉斯·高爾包曾說:輪子是IT進步的階梯!熱門的框架千篇一概,好用輪子萬里挑一!Flutter做爲這兩年開始崛起的跨平臺開發框架,其第三方生態相比其餘成熟框架還略有不足,但輪子的數量也已經不少了。本系列文章挑選平常app開發經常使用的輪子分享出來,給你們提升搬磚效率,同時也但願flutter的生態愈來愈完善,輪子愈來愈多。github
本系列文章準備了超過50個輪子推薦,工做緣由,儘可能每1-2天出一篇文章。app
tip:本系列文章合適已有部分flutter基礎的開發者,入門請戳:flutter官網框架
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("這麼是頁面區"),
),
),
);
}
複製代碼
經過選項能夠實現更多控制:ide
參數 | 描述 |
---|---|
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)),
),
),
),
);
}
}
複製代碼
效果圖: ui