Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(358)

Side by Side Diff: sky/sdk/lib/widgets/navigator.dart

Issue 1191153002: Make back button control drawer in stocks app (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: abarth feedback Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « sky/sdk/lib/widgets/drawer.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 import 'basic.dart'; 5 import 'basic.dart';
6 6
7 typedef Widget Builder(Navigator navigator); 7 typedef Widget Builder(Navigator navigator, RouteBase route);
8 8
9 abstract class RouteBase { 9 abstract class RouteBase {
10 RouteBase({ this.name }); 10 RouteBase({ this.name });
11 final String name; 11 final String name;
12 Widget build(Navigator navigator); 12 Widget build(Navigator navigator, RouteBase route);
13 void popState() { }
13 } 14 }
14 15
15 class Route extends RouteBase { 16 class Route extends RouteBase {
16 Route({ String name, this.builder }) : super(name: name); 17 Route({ String name, this.builder }) : super(name: name);
17 final Builder builder; 18 final Builder builder;
18 Widget build(Navigator navigator) => builder(navigator); 19 Widget build(Navigator navigator, RouteBase route) => builder(navigator, route );
20 }
21
22 class RouteState extends RouteBase {
23
24 RouteState({this.callback, this.route, String name}) : super(name: name);
25
26 RouteBase route;
27 Function callback;
28
29 Widget build(Navigator navigator, _) => route.build(navigator, this);
30
31 void popState() {
32 if (callback != null)
33 callback(this);
34 }
19 } 35 }
20 36
21 class NavigationState { 37 class NavigationState {
22 38
23 NavigationState(List<Route> routes) { 39 NavigationState(List<Route> routes) {
24 for (Route route in routes) { 40 for (Route route in routes) {
25 if (route.name != null) 41 if (route.name != null)
26 namedRoutes[route.name] = route; 42 namedRoutes[route.name] = route;
27 } 43 }
28 history.add(routes[0]); 44 history.add(routes[0]);
(...skipping 15 matching lines...) Expand all
44 60
45 void push(RouteBase route) { 61 void push(RouteBase route) {
46 // Discard future history 62 // Discard future history
47 history.removeRange(historyIndex + 1, history.length); 63 history.removeRange(historyIndex + 1, history.length);
48 historyIndex = history.length; 64 historyIndex = history.length;
49 history.add(route); 65 history.add(route);
50 } 66 }
51 67
52 void pop() { 68 void pop() {
53 if (historyIndex > 0) { 69 if (historyIndex > 0) {
70 history[historyIndex].popState();
54 history.removeLast(); 71 history.removeLast();
55 historyIndex--; 72 historyIndex--;
56 } 73 }
57 } 74 }
58
59 void back() {
60 if (historyIndex > 0)
61 historyIndex--;
62 }
63
64 void forward() {
65 historyIndex++;
66 assert(historyIndex < history.length);
67 }
68 } 75 }
69 76
70 class Navigator extends Component { 77 class Navigator extends Component {
71 78
72 Navigator(this.state, { String key }) : super(key: key); 79 Navigator(this.state, { String key }) : super(key: key, stateful: true);
73 80
74 NavigationState state; 81 NavigationState state;
75 82
76 void syncFields(Navigator source) { 83 void syncFields(Navigator source) {
77 state = source.state; 84 state = source.state;
78 } 85 }
79 86
87 RouteBase get currentRoute => state.currentRoute;
88
89 void pushState(String name, Function callback) {
90 RouteBase route = new RouteState(
91 name: name,
92 callback: callback,
93 route: state.currentRoute
94 );
95 push(route);
96 }
97
80 void pushNamed(String name) { 98 void pushNamed(String name) {
81 setState(() { 99 setState(() {
82 state.pushNamed(name); 100 state.pushNamed(name);
83 }); 101 });
84 } 102 }
85 103
86 void push(RouteBase route) { 104 void push(RouteBase route) {
87 setState(() { 105 setState(() {
88 state.push(route); 106 state.push(route);
89 }); 107 });
90 } 108 }
91 109
92 void pop() { 110 void pop() {
93 setState(() { 111 setState(() {
94 state.pop(); 112 state.pop();
95 }); 113 });
96 } 114 }
97 115
98 void back() {
99 setState(() {
100 state.back();
101 });
102 }
103
104 void forward() {
105 setState(() {
106 state.forward();
107 });
108 }
109
110 Widget build() { 116 Widget build() {
111 return state.currentRoute.build(this); 117 return state.currentRoute.build(this, state.currentRoute);
112 } 118 }
113 } 119 }
OLDNEW
« no previous file with comments | « sky/sdk/lib/widgets/drawer.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698