anchor.diff:  
   const Duration _kBottomSheetDuration = const Duration(milliseconds: 200);
   const double _kMinFlingVelocity = 700.0;
  -const double _kFlingVelocityScale = 1.0 / 300.0;
  +const double _kCloseProgressThreshold = 0.5;
  +
  +class _BottomSheetDragController extends StatelessComponent {
  +  _BottomSheetDragController({
  +    Key key,
  +    this.performance,
  +    this.child,
  +    this.childHeight
  +  }) : super(key: key);
  +
  +  final Performance performance;
  +  final Widget child;
  +  final double childHeight;
  +
  +  bool get _dismissUnderway => performance.direction == AnimationDirection.reverse;
  +
  +  void _handleDragUpdate(double delta) {
  +    if (_dismissUnderway)
  +      return;
  +    performance.progress -= delta / (childHeight ?? delta);
  +  }
  +
  +  void _handleDragEnd(Offset velocity, BuildContext context) {
  +    if (_dismissUnderway)
  +      return;
  +    if (velocity.dy > _kMinFlingVelocity)
  +      performance.fling(velocity: -velocity.dy / childHeight).then((dynamic value) {
  +        Navigator.of(context).pop(value);
  +      });
  +    else if (performance.progress < _kCloseProgressThreshold)
  +      performance.fling(velocity: -1.0).then((dynamic value) {
  +        Navigator.of(context).pop(value);
  +      });
  +    else
  +      performance.forward();
  +  }
  +
  +  Widget build(BuildContext context) {
  +    return new GestureDetector(
  +      onVerticalDragUpdate: _handleDragUpdate,
  +      onVerticalDragEnd: (Offset velocity) { _handleDragEnd(velocity, context); },
  +      child: child
  +    );
  +  }
  +}
  +
   
   class _ModalBottomSheet extends StatefulComponent {
     _ModalBottomSheet({ Key key, this.route }) : super(key: key);
  
positive.code: 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(
  
negative.code: }
  
  class _ModalBottomSheetRoute extends ModalRoute {
    _ModalBottomSheetRoute({ this.completer, this.child });
  
    final Completer completer;
    final Widget child;
  