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

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

Issue 1212993003: Add TabNavigator (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: 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/sdk/lib/example/widgets/tabs.dart ('k') | sky/tests/examples/tabs-expected.txt » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sky/sdk/lib/widgets/tabs.dart
diff --git a/sky/sdk/lib/widgets/tabs.dart b/sky/sdk/lib/widgets/tabs.dart
index 09d03be9df8a2b0fa35f882b0701c291a97318b1..c1372cc4645f198ba9eed03f67510378997928ef 100644
--- a/sky/sdk/lib/widgets/tabs.dart
+++ b/sky/sdk/lib/widgets/tabs.dart
@@ -299,3 +299,58 @@ class TabBar extends Component {
);
}
}
+
+class TabNavigatorView {
+ TabNavigatorView({ this.label, this.content });
+
+ final TabLabel label;
+ final Function content;
Hixie 2015/06/27 00:12:38 Function doesn't have a return type. Make a typede
hansmuller 2015/06/29 16:49:42 Thanks, that's better than the names I had in mind
+
+ Widget buildContent() {
+ return content != null ? content() : null;
abarth-chromium 2015/06/27 00:27:36 Should we just build unconditionally? What does i
hansmuller 2015/06/29 16:49:42 I suppose it could mean that there's no view for t
+ }
+}
+
+class TabNavigator extends Component {
+ TabNavigator({
+ String key,
+ this.views,
+ this.selectedIndex: 0,
+ this.onChanged
+ }) : super(key: key, stateful: true);
+
+ List<TabNavigatorView> views;
+ int selectedIndex;
+ SelectedIndexChanged onChanged;
+
+ void syncFields(TabNavigator source) {
+ views = source.views;
+ selectedIndex = source.selectedIndex;
+ onChanged = source.onChanged;
+ }
+
+ void _selectedTabIndexChanged(int tabIndex) {
+ setState(() {
+ selectedIndex = tabIndex;
+ });
+ if (onChanged != null)
+ onChanged(selectedIndex);
abarth-chromium 2015/06/27 00:27:36 I'm not sure it makes sense to do both of these.
+ }
+
+ Widget build() {
+ assert(views != null && views.isNotEmpty);
+ assert(selectedIndex >= 0 && selectedIndex < views.length);
+
+ TabBar tabBar = new TabBar(
+ labels: views.map((view) => view.label).toList(),
Hixie 2015/06/27 00:12:38 Why toList()?
hansmuller 2015/06/29 16:49:42 I've changed the type of TabBar.labels to Iterable
+ onChanged: _selectedTabIndexChanged,
abarth-chromium 2015/06/27 00:27:36 If you make that change, you can just pass onChang
+ selectedIndex: selectedIndex
+ );
+
+ Widget content = views[selectedIndex].buildContent();
+ return new Flex(
+ <Widget>[tabBar, new Flexible(child: content)],
Hixie 2015/06/27 00:12:38 We don't usually bother type-annotating the childr
hansmuller 2015/06/29 16:49:41 OK. As you know, without the annotation code like
+ direction: FlexDirection.vertical
+ );
+ }
+}
« no previous file with comments | « sky/sdk/lib/example/widgets/tabs.dart ('k') | sky/tests/examples/tabs-expected.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698