前言
Flutter是谷歌的移動UI框架驾锰,可以快速在iOS和Android上構(gòu)建高質(zhì)量的原生用戶界面卸留。
IT界著名的尼古拉斯·高爾包曾說:輪子是IT進步的階梯!熱門的框架千篇一律椭豫,好用輪子萬里挑一耻瑟!Flutter作為這兩年開始崛起的跨平臺開發(fā)框架,其第三方生態(tài)相比其他成熟框架還略有不足赏酥,但輪子的數(shù)量也已經(jīng)很多了喳整。本系列文章挑選日常app開發(fā)常用的輪子分享出來,給大家提高搬磚效率裸扶,同時也希望flutter的生態(tài)越來越完善框都,輪子越來越多。
本系列文章準備了超過50個輪子推薦呵晨,工作原因魏保,盡量每1-2天出一篇文章。
tip:本系列文章合適已有部分flutter基礎(chǔ)的開發(fā)者摸屠,入門請戳:flutter官網(wǎng)
正文
輪子
- 輪子名稱:slide_up_panel
- 輪子概述:flutter可定制的上下滑出抽屜.
- 輪子作者:akshath.r.jain@gmail.com
- 推薦指數(shù):★★★★
- 常用指數(shù):★★★★
-
效果預(yù)覽:
安裝
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("這里是抽屜區(qū)"),
),
body: Center(
child: Text("這么是頁面區(qū)"),
),
),
);
}
參數(shù)配置
通過選項可以實現(xiàn)更多控制:
參數(shù) | 描述 |
---|---|
panel |
(必需)滑入視圖的小部件谓罗。當panel折疊且如果collapsed為null時,將顯示此Widget的頂部餐塘;否則妥衣,collapsed將顯示在此小部件的頂部。 |
collapsed |
panel折疊時戒傻,小部件顯示在上方税手。隨著panel打開,此效果逐漸消失需纳。 |
body |
位于滑動面板下方的小部件芦倒。該小部件會自動調(diào)整大小以填充屏幕。 |
minHeight |
完全折疊時滑動面板的高度不翩。 |
maxHeight |
完全打開時滑動面板的高度兵扬。 |
border |
在滑動面板上繪制邊框麻裳。 |
borderRadius |
如果不為空,則以此將滑板面板繪制圓角器钟。 |
boxShadow |
滑動面板表后面投射的陰影津坑。 |
color |
填充滑動面板背景的顏色 |
padding |
滑動面板padding |
margin |
滑動面板margin |
renderPanelSheet |
設(shè)置為false可不渲染panel位于其上的圖紙。這意味著傲霸,只有body疆瑰,collapsed和panel窗口小部件會被渲染。如果要實現(xiàn)浮動效果或需要對滑動面板的外觀進行更多自定義昙啄,請將其設(shè)置為false穆役。 |
panelSnapping |
設(shè)置為false可禁用面板快速打開或關(guān)閉。 |
backdropEnabled |
如果不為空梳凛,則body在面板滑動打開時在上顯示暗陰影耿币。 |
backdropColor |
陰影顏色。 |
backdropOpacity |
陰影透明度韧拒,0.0-1.0 |
backdropTapClosesPanel |
是否輕按背景關(guān)閉面板淹接。默認為true。 |
controller |
控制器 |
onPanelSlide |
如果不為null叭莫,則在面板隨面板的當前位置滑動時調(diào)用此回調(diào)蹈集。該位置是0.0和1.0之間的雙精度數(shù),其中0.0完全折疊雇初,而1.0完全打開拢肆。 |
onPanelOpened |
如果非null,則在面板完全打開時調(diào)用此回調(diào)靖诗。 |
onPanelClosed |
如果為非null郭怪,則在面板完全折疊時調(diào)用此回調(diào)。 |
parallaxEnabled |
如果非null和true刊橘,則在面板向上滑動時鄙才,SlidingUpPanel會顯示視差效果。本質(zhì)上促绵,隨著面板的滑動攒庵,身體也會向上滑動。 |
parallaxOffset |
允許根據(jù)面板向上/向下滑動的百分比指定視差效果的程度败晴。推薦值在0.0和1.0之間浓冒,其中0.0為無視差,而1.0則模仿一對一的滾動效果尖坤。默認為10%視差稳懒。 |
isDraggable |
允許切換SlidingUpPanel的可拖動性。將此設(shè)置為false可以防止用戶上下拖動面板慢味。默認為true场梆。 |
slideDirection |
抽屜的方向: SlideDirection.UP or SlideDirection.DOWN . |
defaultPanelState |
面板的默認狀態(tài)墅冷;PanelState.OPEN或PanelState.CLOSED。此值的默認值PanelState.CLOSED表示面板處于關(guān)閉位置或油,必須將其打開寞忿。PanelState.OPEN表示默認情況下面板是打開的,并且必須由用戶滑動關(guān)閉装哆。 |
實踐:仿頭條小視頻的評論抽屜
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("評論區(qū)",style: TextStyle(color: Colors.grey,fontSize: 16,fontWeight: FontWeight.normal,decoration:TextDecoration.none)),
),
),
),
);
}
}
效果圖: