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

Unified Diff: sky/sdk/lib/widgets/navigator.dart

Issue 1181773006: Add back/forward history to navigation (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: rebase 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sky/examples/widgets/navigation.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sky/sdk/lib/widgets/navigator.dart
diff --git a/sky/sdk/lib/widgets/navigator.dart b/sky/sdk/lib/widgets/navigator.dart
index 4bbded3b71cc069c261c6a85a462d0ce1f4076c6..ea31c8bafed632a8bacc77c0896042ab36f1351e 100644
--- a/sky/sdk/lib/widgets/navigator.dart
+++ b/sky/sdk/lib/widgets/navigator.dart
@@ -7,51 +7,79 @@ import 'basic.dart';
typedef Widget Builder(Navigator navigator);
abstract class RouteBase {
- RouteBase({this.name});
+ RouteBase({ this.name });
final String name;
Widget build(Navigator navigator);
}
class Route extends RouteBase {
- Route({String name, this.builder}) : super(name: name);
+ Route({ String name, this.builder }) : super(name: name);
final Builder builder;
Widget build(Navigator navigator) => builder(navigator);
}
class Navigator extends Component {
- Navigator({Object key, this.currentRoute, this.routes})
- : super(key: key, stateful: true);
+ Navigator({ Object key, RouteBase defaultRoute, List<RouteBase> routes })
+ : super(key: key, stateful: true) {
+ if (routes != null) {
+ if (defaultRoute == null)
+ defaultRoute = routes[0];
+ for (Route route in routes) {
+ if (route.name != null)
+ namedRoutes[route.name] = route;
+ }
+ }
+ assert(defaultRoute != null);
+ _history.add(defaultRoute);
+ }
+
+ List<RouteBase> _history = new List<RouteBase>();
+ int _historyIndex = 0;
+ Map<String, RouteBase> namedRoutes = new Map<String, RouteBase>();
- RouteBase currentRoute;
- List<RouteBase> routes;
-
void syncFields(Navigator source) {
- currentRoute = source.currentRoute;
- routes = source.routes;
- }
-
- void pushNamedRoute(String name) {
- assert(routes != null);
- for (RouteBase route in routes) {
- if (route.name == name) {
- setState(() {
- currentRoute = route;
- });
- return;
+ namedRoutes = source.namedRoutes;
+ }
+
+ void pushNamed(String name) {
+ Route route = namedRoutes[name];
+ assert(route != null);
+ push(route);
+ }
+
+ void push(RouteBase route) {
+ setState(() {
+ // Discard future history
+ _history.removeRange(_historyIndex + 1, _history.length);
+ _historyIndex = _history.length;
+ _history.add(route);
+ });
+ }
+
+ void pop() {
+ setState(() {
+ if (_historyIndex > 0) {
+ _history.removeLast();
+ _historyIndex--;
}
- }
- assert(false); // route not found
+ });
}
- void pushRoute(RouteBase route) {
+ void back() {
setState(() {
- currentRoute = route;
+ if (_historyIndex > 0)
+ _historyIndex--;
+ });
+ }
+
+ void forward() {
+ setState(() {
+ _historyIndex++;
+ assert(_historyIndex < _history.length);
});
}
Widget build() {
- Route route = currentRoute == null ? routes[0] : currentRoute;
- assert(route != null);
- return route.build(this);
+ return _history[_historyIndex].build(this);
}
}
« no previous file with comments | « sky/examples/widgets/navigation.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698