Commit dbb876b2 authored by Collin Jackson's avatar Collin Jackson

Make back button control drawer in stocks app

Currently you lose your scroll and drawer state when coming back from the settings pane.
I think we should solve this by having the Navigator maintain a Stack and
keeping the StockHome alive underneath it. But this is good enough for a first iteration.

R=abarth@chromium.org, abarth

Review URL: https://codereview.chromium.org/1191153002.
parent 627aeff3
...@@ -7,29 +7,45 @@ import 'package:sky/widgets/basic.dart'; ...@@ -7,29 +7,45 @@ import 'package:sky/widgets/basic.dart';
import 'package:sky/widgets/navigator.dart'; import 'package:sky/widgets/navigator.dart';
import 'package:sky/widgets/widget.dart'; import 'package:sky/widgets/widget.dart';
import 'stock_data.dart';
import 'stock_home.dart'; import 'stock_home.dart';
import 'stock_settings.dart'; import 'stock_settings.dart';
class StocksApp extends App { class StocksApp extends App {
NavigationState _navState = new NavigationState([ StocksApp() {
new Route(name: '/', builder: (navigator) => new StockHome(navigator)), _navigationState = new NavigationState([
new Route(name: '/settings', builder: (navigator) => new StockSettings(navigator)), new Route(
]); name: '/',
builder: (navigator, route) => new StockHome(navigator, route, _stocks)
),
new Route(
name: '/settings',
builder: (navigator, route) => new StockSettings(navigator)
),
]);
}
void onBack() { void didMount() {
if (_navState.hasPrevious()) { new StockDataFetcher((StockData data) {
setState(() { setState(() {
_navState.pop(); data.appendTo(_stocks);
}); });
return; });
} }
print ("Should exit app here");
final List<Stock> _stocks = [];
NavigationState _navigationState;
void onBack() {
setState(() {
_navigationState.pop();
});
// TODO(jackson): Need a way to invoke default back behavior here // TODO(jackson): Need a way to invoke default back behavior here
} }
Widget build() { Widget build() {
return new Navigator(_navState); return new Navigator(_navigationState);
} }
} }
......
...@@ -29,19 +29,19 @@ enum StockMode { optimistic, pessimistic } ...@@ -29,19 +29,19 @@ enum StockMode { optimistic, pessimistic }
class StockHome extends Component { class StockHome extends Component {
StockHome(this._navigator) { StockHome(this.navigator, RouteBase route, this.stocks) : super(stateful: true) {
// if (debug) // if (debug)
// new Timer(new Duration(seconds: 1), dumpState); // new Timer(new Duration(seconds: 1), dumpState);
new StockDataFetcher((StockData data) {
setState(() {
data.appendTo(_stocks);
});
});
_drawerController = new DrawerController(_handleDrawerStatusChanged); _drawerController = new DrawerController(_handleDrawerStatusChanged);
} }
List<Stock> _stocks = []; void syncFields(StockHome source) {
Navigator _navigator; navigator = source.navigator;
stocks = source.stocks;
}
Navigator navigator;
List<Stock> stocks;
bool _isSearching = false; bool _isSearching = false;
String _searchQuery; String _searchQuery;
...@@ -69,6 +69,9 @@ class StockHome extends Component { ...@@ -69,6 +69,9 @@ class StockHome extends Component {
bool _drawerShowing = false; bool _drawerShowing = false;
void _handleDrawerStatusChanged(bool showing) { void _handleDrawerStatusChanged(bool showing) {
if (!showing && navigator.currentRoute.name == "/drawer") {
navigator.pop();
}
setState(() { setState(() {
_drawerShowing = showing; _drawerShowing = showing;
}); });
...@@ -137,7 +140,7 @@ class StockHome extends Component { ...@@ -137,7 +140,7 @@ class StockHome extends Component {
new MenuDivider(), new MenuDivider(),
new MenuItem( new MenuItem(
icon: 'action/settings', icon: 'action/settings',
onPressed: () => _navigator.pushNamed('/settings'), onPressed: () => navigator.pushNamed('/settings'),
children: [new Text('Settings')]), children: [new Text('Settings')]),
new MenuItem( new MenuItem(
icon: 'action/help', icon: 'action/help',
...@@ -146,11 +149,18 @@ class StockHome extends Component { ...@@ -146,11 +149,18 @@ class StockHome extends Component {
); );
} }
void _handleOpenDrawer() {
_drawerController.open();
navigator.pushState("/drawer", (_) {
_drawerController.close();
});
}
Widget buildToolBar() { Widget buildToolBar() {
return new ToolBar( return new ToolBar(
left: new IconButton( left: new IconButton(
icon: 'navigation/menu_white', icon: 'navigation/menu_white',
onPressed: _drawerController.toggle), onPressed: _handleOpenDrawer),
center: new Text('Stocks', style: typography.white.title), center: new Text('Stocks', style: typography.white.title),
right: [ right: [
new IconButton( new IconButton(
...@@ -194,7 +204,7 @@ class StockHome extends Component { ...@@ -194,7 +204,7 @@ class StockHome extends Component {
List<Widget> overlays = [ List<Widget> overlays = [
new Scaffold( new Scaffold(
toolbar: _isSearching ? buildSearchBar() : buildToolBar(), toolbar: _isSearching ? buildSearchBar() : buildToolBar(),
body: new Stocklist(stocks: _stocks, query: _searchQuery), body: new Stocklist(stocks: stocks, query: _searchQuery),
floatingActionButton: new FloatingActionButton( floatingActionButton: new FloatingActionButton(
child: new Icon(type: 'content/add_white', size: 24) child: new Icon(type: 'content/add_white', size: 24)
), ),
......
...@@ -4,13 +4,12 @@ ...@@ -4,13 +4,12 @@
import 'package:sky/widgets/basic.dart'; import 'package:sky/widgets/basic.dart';
import 'package:sky/widgets/navigator.dart'; import 'package:sky/widgets/navigator.dart';
import 'package:sky/widgets/transition.dart';
import 'package:sky/widgets/raised_button.dart'; import 'package:sky/widgets/raised_button.dart';
List<Route> routes = [ List<Route> routes = [
new Route( new Route(
name: 'home', name: 'home',
builder: (navigator) => new Container( builder: (navigator, route) => new Container(
padding: const EdgeDims.all(20.0), padding: const EdgeDims.all(20.0),
decoration: new BoxDecoration(backgroundColor: const Color(0xFFCCCCCC)), decoration: new BoxDecoration(backgroundColor: const Color(0xFFCCCCCC)),
child: new Block([ child: new Block([
...@@ -28,14 +27,14 @@ List<Route> routes = [ ...@@ -28,14 +27,14 @@ List<Route> routes = [
), ),
new Route( new Route(
name: 'shopping', name: 'shopping',
builder: (navigator) => new Container( builder: (navigator, route) => new Container(
padding: const EdgeDims.all(20.0), padding: const EdgeDims.all(20.0),
decoration: new BoxDecoration(backgroundColor: const Color(0xFFBF5FFF)), decoration: new BoxDecoration(backgroundColor: const Color(0xFFBF5FFF)),
child: new Block([ child: new Block([
new Text("Village Shop"), new Text("Village Shop"),
new RaisedButton( new RaisedButton(
child: new Text('RETURN HOME'), child: new Text('RETURN HOME'),
onPressed: () => navigator.back() onPressed: () => navigator.pop()
), ),
new RaisedButton( new RaisedButton(
child: new Text('GO TO DUNGEON'), child: new Text('GO TO DUNGEON'),
...@@ -46,7 +45,7 @@ List<Route> routes = [ ...@@ -46,7 +45,7 @@ List<Route> routes = [
), ),
new Route( new Route(
name: 'adventure', name: 'adventure',
builder: (navigator) => new Container( builder: (navigator, route) => new Container(
padding: const EdgeDims.all(20.0), padding: const EdgeDims.all(20.0),
decoration: new BoxDecoration(backgroundColor: const Color(0xFFDC143C)), decoration: new BoxDecoration(backgroundColor: const Color(0xFFDC143C)),
child: new Block([ child: new Block([
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment