onDragEnd method

  1. @override
dynamic onDragEnd(
  1. DragEndDetails dragEndDetails,
  2. String dir,
  3. bool isOpen
)
override

Implementation

@override
onDragEnd(dragEndDetails, String dir, bool isOpen)
{
  const int dragLeeway = 200; // drag leeway for completing open/closes on drag end

  var con = widget.model.constraints;
  double h = con.maxHeight?? MediaQuery.of(context).size.height;
  double w = con.maxWidth ?? MediaQuery.of(context).size.width;

  double screenHeight = h;
  double screenWidth = w;
  if (animate == false) {
    if (dir == 'vertical') {
      // TOP SHEET
      if (openSheet == 'top') {
        if (isOpen) { // should close ?
          if (dragEndDetails.primaryVelocity! < -300 ||
              (fromBottom! > (screenHeight - widget.model.sizeTop!) + (dragLeeway *
                  ((widget.model.sizeTop != null) ? widget.model.sizeTop! /
                      screenHeight : 1)))) { // yes, close
            setState(() {
              animate = true;
              fromBottom = screenHeight;
              openSheet = null;
            });
          }
          else { // no, keep open
            setState(() {
              animate = true;
              fromBottom = widget.model.sizeTop != null
                  ? screenHeight - widget.model.sizeTop!
                  : 0;
            });
          }
        }
        else { // should open ?
          if (dragEndDetails.primaryVelocity! > 300 ||
              (screenHeight - fromBottom!) > (dragLeeway *
                  ((widget.model.sizeTop != null) ? widget.model.sizeTop! /
                      screenHeight : 1))) { // yes, open
            setState(() {
              animate = true;
              fromBottom = widget.model.sizeTop != null
                  ? screenHeight - widget.model.sizeTop!
                  : 0;
            });
          }
          else { // no, keep closed
            setState(() {
              animate = true;
              fromBottom = screenHeight;
              openSheet = null;
            });
          }
        }
      }
      // BOTTOM SHEET
      if (openSheet == 'bottom') {
        if (isOpen) { // should close ?
          if (dragEndDetails.primaryVelocity! > 300 ||
              (fromTop! > (screenHeight - widget.model.sizeBottom!) + (dragLeeway *
                  ((widget.model.sizeBottom != null) ? widget.model.sizeBottom! /
                      screenHeight : 1)))) { // yes, close
            setState(() {
              animate = true;
              fromTop = screenHeight;
              openSheet = null;
            });
          }
          else { // no, keep open
            setState(() {
              animate = true;
              fromTop = widget.model.sizeBottom != null ? screenHeight -
                  widget.model.sizeBottom! : 0;
            });
          }
        }
        else { // should open ?
          if (dragEndDetails.primaryVelocity! < -300 ||
              (screenHeight - fromTop!) > (dragLeeway *
                  ((widget.model.sizeBottom != null) ? widget.model.sizeBottom! /
                      screenHeight : 1))) { // yes, open
            setState(() {
              animate = true;
              fromTop = widget.model.sizeBottom != null ? screenHeight -
                  widget.model.sizeBottom! : 0;
            });
          }
          else { // no, keep closed
            setState(() {
              animate = true;
              fromTop = screenHeight;
              openSheet = null;
            });
          }
        }
      }
    }
    else if (dir == 'horizontal') {
      // LEFT SHEET
      if (openSheet == 'left') {
        if (isOpen) { // should close ?
          if (dragEndDetails.primaryVelocity! < -300 ||
              (fromRight! > (screenWidth - widget.model.sizeLeft!) + (dragLeeway *
                  ((widget.model.sizeLeft != null) ? widget.model.sizeLeft! /
                      screenWidth : 1)))) { // yes, close
            setState(() {
              animate = true;
              fromRight = screenWidth;
              openSheet = null;
            });
          }
          else { // no, keep open
            setState(() {
              animate = true;
              fromRight = widget.model.sizeLeft != null
                  ? screenWidth - widget.model.sizeLeft!
                  : 0;
            });
          }
        }
        else { // should open ?
          if (dragEndDetails.primaryVelocity! > 300 ||
              (screenWidth - fromRight!) > (dragLeeway *
                  ((widget.model.sizeLeft != null) ? widget.model.sizeLeft! /
                      screenWidth : 1))) { // yes, open
            setState(() {
              animate = true;
              fromRight = widget.model.sizeLeft != null
                  ? screenWidth - widget.model.sizeLeft!
                  : 0;
            });
          }
          else { // no, keep closed
            setState(() {
              animate = true;
              fromRight = screenWidth;
              openSheet = null;
            });
          }
        }
      }
      // RIGHT SHEET
      if (openSheet == 'right') {
        if (isOpen) { // should close ?
          if (dragEndDetails.primaryVelocity! > 300 ||
              (fromLeft! > (screenWidth - widget.model.sizeRight!) + (dragLeeway *
                  ((widget.model.sizeRight != null) ? widget.model.sizeRight! /
                      screenWidth : 1)))) { // yes, close
            setState(() {
              animate = true;
              fromLeft = screenWidth;
              openSheet = null;
            });
          }
          else { // no, keep open
            setState(() {
              animate = true;
              fromLeft = widget.model.sizeRight != null ? screenWidth -
                  widget.model.sizeRight! : 0;
            });
          }
        }
        else { // should open ?
          if (dragEndDetails.primaryVelocity! < -300 ||
              (screenWidth - fromLeft!) > (dragLeeway *
                  ((widget.model.sizeRight != null) ? widget.model.sizeRight! /
                      screenWidth : 1))) { // yes, open
            setState(() {
              animate = true;
              fromLeft = widget.model.sizeRight != null ? screenWidth -
                  widget.model.sizeRight! : 0;
            });
          }
          else { // no, keep closed
            setState(() {
              animate = true;
              fromLeft = screenWidth;
              openSheet = null;
            });
          }
        }
      }
    }
  }
}