前言
Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。
IT界著名的尼古拉斯·高尔包曾说:轮子是IT进步的阶梯!热门的框架千篇一律,好用轮子万里挑一!Flutter作为这两年开始崛起的跨平台开发框架,其第三方生态相比其他成熟框架还略有不足,但轮子的数量也已经很多了。本系列文章挑选日常app开发常用的轮子分享出来,给大家提高搬砖效率,同时也希望flutter的生态越来越完善,轮子越来越多。
本系列文章准备了超过50个轮子推荐,工作原因,尽量每1-2天出一篇文章。
tip:本系列文章合适已有部分flutter基础的开发者,入门请戳:flutter官网
正文
轮子
- 轮子名称:slide_up_panel
- 轮子概述:flutter可定制的上下滑出抽屉.
- 轮子作者:akshath.r.jain@gmail.com
- 推荐指数:★★★★
- 常用指数:★★★★
-
效果预览:
安装
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)),
),
),
),
);
}
}
效果图: