anchor.diff:  class _ModalBottomSheetState extends State<_ModalBottomSheet> {
   
     final _ModalBottomSheetLayout _layout = new _ModalBottomSheetLayout();
  -  bool _dragEnabled = false;
  -
  -  void _handleDragStart(Point position) {
  -    _dragEnabled = !config.route._performance.isAnimating;
  -  }
  -
  -  void _handleDragUpdate(double delta) {
  -    if (!_dragEnabled)
  -      return;
  -    config.route._performance.progress -= delta / _layout.childTop.end;
  -  }
  -
  -  void _handleDragEnd(Offset velocity) {
  -    if (!_dragEnabled)
  -      return;
  -    if (velocity.dy > _kMinFlingVelocity)
  -      config.route._performance.fling(velocity: -velocity.dy * _kFlingVelocityScale);
  -    else
  -      config.route._performance.forward();
  -  }
   
     Widget build(BuildContext context) {
       return new GestureDetector(
  
positive.code: }
  
  class _ModalBottomSheetRoute extends ModalRoute {
    _ModalBottomSheetRoute({ this.completer, this.child }) {
      _performance = new Performance(duration: transitionDuration, debugLabel: 'ModalBottomSheet');
    }
  
    final Completer completer;
    final Widget child;
  
negative.code:   return completer.future;
  }
  
  class _PersistentBottomSheet extends StatefulComponent {
    _PersistentBottomSheet({ Key key, this.route }) : super(key: key);
  
    final _PersistentBottomSheetRoute route;
  
    _PersistentBottomSheetState createState() => new _PersistentBottomSheetState();
  }
  
  class _PersistentBottomSheetState extends State<_PersistentBottomSheet> {
  
    double _childHeight;
    void _updateChildHeight(Size newSize) {
      setState(() {
        _childHeight = newSize.height;
      });
    }
  
    Widget build(BuildContext context) {
      return new AlignTransition(
        performance: config.route.performance,
        alignment: new AnimatedValue<FractionalOffset>(const FractionalOffset(0.0, 0.0)),
        heightFactor: new AnimatedValue<double>(0.0, end: 1.0),
        child: new _BottomSheetDragController(
          performance: config.route._performance,
          childHeight: _childHeight,
          child: new Material(
            child: new SizeObserver(child: config.route.child, onSizeChanged: _updateChildHeight)
          )
        )
      );
    }
  }
  
  class _PersistentBottomSheetRoute extends TransitionRoute {
    _PersistentBottomSheetRoute({ this.completer, this.child });
  
    final Widget child;
    final Completer completer;
  
    bool get opaque => false;
    Duration get transitionDuration => _kBottomSheetDuration;
  
    Performance _performance;
    Performance createPerformance() {
      _performance = super.createPerformance();
      return _performance;
    }
  
    void didPop([dynamic result]) {
      completer.complete(result);
      super.didPop(result);
    }
  }
  
  Future showBottomSheet({ BuildContext context, GlobalKey<PlaceholderState> placeholderKey, Widget child }) {
    assert(child != null);
    assert(placeholderKey != null);
    final Completer completer = new Completer();
    _PersistentBottomSheetRoute route = new _PersistentBottomSheetRoute(child: child, completer: completer);
    placeholderKey.currentState.child = new _PersistentBottomSheet(route: route);
    Navigator.of(context).pushEphemeral(route);
    return completer.future;
  }
  