diff --git a/sdk/example/stocks/lib/stock_home.dart b/sdk/example/stocks/lib/stock_home.dart index 7e83be1c43e..b7a314c160a 100644 --- a/sdk/example/stocks/lib/stock_home.dart +++ b/sdk/example/stocks/lib/stock_home.dart @@ -306,6 +306,7 @@ class StockHome extends AnimatedComponent { children: [new StockMenu( showing: _menuShowing, onStatusChanged: _handleMenuStatusChanged, + navigator: navigator, autorefresh: _autorefresh, onAutorefreshChanged: _handleAutorefreshChanged )], diff --git a/sdk/example/stocks/lib/stock_menu.dart b/sdk/example/stocks/lib/stock_menu.dart index 6ef3f4e8138..9cb7a093631 100644 --- a/sdk/example/stocks/lib/stock_menu.dart +++ b/sdk/example/stocks/lib/stock_menu.dart @@ -6,6 +6,7 @@ import 'dart:sky' as sky; import 'package:sky/widgets/basic.dart'; import 'package:sky/widgets/checkbox.dart'; +import 'package:sky/widgets/navigator.dart'; import 'package:sky/widgets/popup_menu_item.dart'; import 'package:sky/widgets/popup_menu.dart'; @@ -16,12 +17,14 @@ class StockMenu extends Component { String key, this.showing, this.onStatusChanged, + this.navigator, this.autorefresh: false, this.onAutorefreshChanged }) : super(key: key); - bool showing; - PopupMenuStatusChangedCallback onStatusChanged; + final bool showing; + final PopupMenuStatusChangedCallback onStatusChanged; + final Navigator navigator; final bool autorefresh; final ValueChanged onAutorefreshChanged; @@ -40,7 +43,8 @@ class StockMenu extends Component { ], level: 4, showing: showing, - onStatusChanged: onStatusChanged + onStatusChanged: onStatusChanged, + navigator: navigator ), right: sky.view.paddingRight, top: sky.view.paddingTop diff --git a/sdk/lib/widgets/popup_menu.dart b/sdk/lib/widgets/popup_menu.dart index 7b4641c1904..2d8a0dd50e7 100644 --- a/sdk/lib/widgets/popup_menu.dart +++ b/sdk/lib/widgets/popup_menu.dart @@ -11,6 +11,7 @@ import 'package:sky/theme/colors.dart'; import 'package:sky/theme/shadows.dart'; import 'package:sky/widgets/animated_component.dart'; import 'package:sky/widgets/basic.dart'; +import 'package:sky/widgets/navigator.dart'; import 'package:sky/widgets/popup_menu_item.dart'; import 'package:sky/widgets/scrollable_viewport.dart'; @@ -37,13 +38,15 @@ class PopupMenu extends AnimatedComponent { this.showing, this.onStatusChanged, this.items, - this.level + this.level, + this.navigator }) : super(key: key); bool showing; PopupMenuStatusChangedCallback onStatusChanged; List items; int level; + Navigator navigator; AnimatedType _opacity; AnimatedType _width; @@ -79,6 +82,7 @@ class PopupMenu extends AnimatedComponent { if (items.length != source.items.length) _updateAnimationVariables(); items = source.items; + navigator = source.navigator; super.syncFields(source); } @@ -115,14 +119,23 @@ class PopupMenu extends AnimatedComponent { PopupMenuStatus _lastStatus; void _checkForStateChanged() { PopupMenuStatus status = _status; - if (_lastStatus != null && status != _lastStatus && onStatusChanged != null) - onStatusChanged(status); + if (_lastStatus != null && status != _lastStatus) { + if (status == PopupMenuStatus.inactive && + navigator != null && + navigator.currentRoute.key == this) + navigator.pop(); + if (onStatusChanged != null) + onStatusChanged(status); + } _lastStatus = status; } + void _open() { _animationList.interval = null; _performance.play(); + if (navigator != null) + navigator.pushState(this, (_) => _close()); } void _close() {