anchor.diff:    return completer.future;
   }
   
  -class _PersistentBottomSheet extends StatelessComponent {
  -  _PersistentBottomSheet({
  -    Key key,
  -    this.child,
  -    this.route
  -  }) : super(key: key);
  -
  -  final TransitionRoute route;
  -  final Widget child;
  +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: route.performance,
  +      performance: config.route.performance,
         alignment: new AnimatedValue<FractionalOffset>(const FractionalOffset(0.0, 0.0)),
         heightFactor: new AnimatedValue<double>(0.0, end: 1.0),
  -      child: child
  +      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;
  -}
  -
  -void showBottomSheet({ BuildContext context, GlobalKey<PlaceholderState> placeholderKey, Widget child }) {
  +
  +  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);
  -  _PersistentBottomSheetRoute route = new _PersistentBottomSheetRoute();
  -  placeholderKey.currentState.child = new _PersistentBottomSheet(route: route, child: child);
  +  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;
  +}
  
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:             child: new CustomOneChildLayout(
                delegate: _layout,
                token: _layout.childTop.value,
                child: new _BottomSheetDragController(
                  performance: config.route._performance,
                  child: new Material(child: config.route.child),
                  childHeight: _layout.childTop.end
                )
              )
            );
  