flutter好用的輪子推薦九-flutter可定製的上下滑出抽屜

小小包子發表於2019-11-06

前言

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)),
                    ),
                ),
            ),
            
        );
    }
}
複製程式碼

效果圖:

效果圖

結尾

相關文章