源码地址:https://github.com/NeverOvO/flutter_drag

全端可用

核心代码:

变量部分

  double _drageWidgetHeight = (window.physicalSize.height * 0.15) > 120.0 ? window.physicalSize.height * 0.15 : 120.0;
  double _drageWidgetHeightTemp = (window.physicalSize.height * 0.15) > 120.0 ? window.physicalSize.height * 0.15 : 120.0;//temp
  bool _drageWidgetShow = true;
_drageWidgetHeight 为 拖动时需要改变高度的组件的 实际的高度,
_drageWidgetHeightTemp 为 拖动时高度的临时量,
初始值为120,

bool _drageWidgetShow = true; 为组件是否隐藏

核心部分

Widget _dragWidgetHead(){
  return GestureDetector(
    child: Container(
      child: Row(
        children: [
          Expanded(
            child: Text("拖动此处"),
          ),
          IconButton(
            icon: Icon(_drageWidgetShow ? Icons.keyboard_arrow_down_rounded : Icons.keyboard_arrow_up_rounded),
            onPressed: (){
              setState(() {
                _drageWidgetShow = !_drageWidgetShow;
              });
            },
          ),
        ],
      ),
      color: Colors.deepPurpleAccent,
      alignment: Alignment.center,
    ),
    behavior: HitTestBehavior.opaque,
    onVerticalDragDown: (s){
      _drageWidgetHeightTemp =  _drageWidgetHeight;
    },
    onVerticalDragUpdate: (s){
      if(_drageWidgetShow){ //屏蔽在组件隐藏时的拖动动作
        setState(() {
          double hi = _drageWidgetHeightTemp - (s.localPosition.dy - 10);
          if(hi < 120){
            _drageWidgetHeight = 120;
          }else if (hi > (MediaQuery.of(context).size.height / 1.5)){
            _drageWidgetHeight = MediaQuery.of(context).size.height / 1.5;
          }else{
            _drageWidgetHeight = _drageWidgetHeightTemp - (s.localPosition.dy - 10);
          }

        });
      }
    },
    onVerticalDragEnd: (s){
      setState(() {
        _drageWidgetHeightTemp =  _drageWidgetHeight;
      });
    },
  ); //头部选择
}

实际拖动组件,可以在里面任何东西,例如菜单,标题,分割线,或者是被拖动的组件,例子中为高度的改变
onVerticalDragDown:记录下当拖动开始时组件的高度,赋值给_drageWidgetHeightTemp;
onVerticalDragUpdate:
      因为实时变动高度,所以高度的赋值需要在Update中进行
      这里的hi值,用来记录组件在拖动过程时的高度变化,若小于自定义最低高度,则不再进行更新,
      hi > (MediaQuery.of(context).size.height / 1.5) 则是对最高高度的显示,可以根据实际需要动态调整
      (s.localPosition.dy - 10) :这里是为了避免在鼠标按下去刚开始拖动时出现的闪动情况,个人感觉取值10-20较为合适
onVerticalDragEnd :拖动结束后将目前高度赋值给赋值给_drageWidgetHeightTemp,可以不写