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