Index: sky/sdk/lib/widgets/tabs.dart |
diff --git a/sky/sdk/lib/widgets/tabs.dart b/sky/sdk/lib/widgets/tabs.dart |
index 37f19cbf5b8dc0040b31dc4195e4ff7534c4f5cf..13cfaa35ed2abd3fd01020e32bc72940e2922946 100644 |
--- a/sky/sdk/lib/widgets/tabs.dart |
+++ b/sky/sdk/lib/widgets/tabs.dart |
@@ -261,7 +261,7 @@ class TabBar extends Component { |
this.onChanged |
}) : super(key: key); |
- final List<TabLabel> labels; |
+ final Iterable<TabLabel> labels; |
final int selectedIndex; |
final SelectedIndexChanged onChanged; |
@@ -286,9 +286,10 @@ class TabBar extends Component { |
assert(labels != null && labels.isNotEmpty); |
List<Widget> tabs = <Widget>[]; |
bool textAndIcons = false; |
- for (int tabIndex = 0; tabIndex < labels.length; tabIndex++) { |
- tabs.add(_toTab(labels[tabIndex], tabIndex)); |
- if (labels[tabIndex].text != null && labels[tabIndex].icon != null) |
+ int tabIndex = 0; |
+ for (TabLabel label in labels) { |
+ tabs.add(_toTab(label, tabIndex++)); |
+ if (label.text != null && label.icon != null) |
textAndIcons = true; |
} |
return new TabBarWrapper( |
@@ -300,3 +301,51 @@ class TabBar extends Component { |
); |
} |
} |
+ |
+class TabNavigatorView { |
+ TabNavigatorView({ this.label, this.builder }); |
+ |
+ final TabLabel label; |
+ final Builder builder; |
+ |
+ Widget buildContent() { |
+ assert(builder != null); |
+ Widget content = builder(); |
+ assert(content != null); |
+ return content; |
+ } |
+} |
+ |
+class TabNavigator extends Component { |
+ TabNavigator({ |
+ String key, |
+ this.views, |
+ this.selectedIndex: 0, |
+ this.onChanged |
+ }) : super(key: key); |
+ |
+ final List<TabNavigatorView> views; |
+ final int selectedIndex; |
+ final SelectedIndexChanged onChanged; |
+ |
+ void _handleSelectedIndexChanged(int tabIndex) { |
+ if (onChanged != null) |
+ onChanged(tabIndex); |
+ } |
+ |
+ Widget build() { |
+ assert(views != null && views.isNotEmpty); |
+ assert(selectedIndex >= 0 && selectedIndex < views.length); |
+ |
+ TabBar tabBar = new TabBar( |
+ labels: views.map((view) => view.label), |
+ onChanged: _handleSelectedIndexChanged, |
+ selectedIndex: selectedIndex |
+ ); |
+ |
+ Widget content = views[selectedIndex].buildContent(); |
+ return new Flex([tabBar, new Flexible(child: content)], |
+ direction: FlexDirection.vertical |
+ ); |
+ } |
+} |