anchor.diff:        rect: _kMenuHorizontalPadding.inflateRect(rect),
         elevation: config.elevation
       ));
  -    completer.future.then((T newValue) {
  -      if (!mounted)
  +    completer.future.then((_DropDownRouteResult<T> newValue) {
  +      if (!mounted || newValue == null)
           return;
         if (config.onChanged != null)
  -        config.onChanged(newValue);
  +        config.onChanged(newValue.result);
       });
     }
   
  
positive.code:             padding: _kMenuHorizontalPadding,
              child: route.items[itemIndex]
            ),
            onTap: () => Navigator.pop(context, route.items[itemIndex].value)
          )
        ));
      }
  
negative.code:   }
  }
  
  // We box the return value so that the return value can be null. Otherwise,
  // canceling the route (which returns null) would get confused with actually
  // returning a real null value.
  class _DropDownRouteResult<T> {
    const _DropDownRouteResult(this.result);
    final T result;
    bool operator ==(dynamic other) {
      if (other is! _DropDownRouteResult)
        return false;
      final _DropDownRouteResult<T> typedOther = other;
      return result == typedOther.result;
    }
    int get hashCode => result.hashCode;
  }
  
  class _DropDownRoute<T> extends PopupRoute<_DropDownRouteResult<T>> {
    _DropDownRoute({
      Completer<_DropDownRouteResult<T>> completer,
      this.items,
      this.selectedIndex,
      this.rect,
  