Commit 9cb9eaf5 authored by Ian Hickson's avatar Ian Hickson

Merge pull request #1403 from Hixie/clickable-stocks

Make Stocks demo list rows clickable
parents 84f2b5a5 f43591b3
...@@ -9,6 +9,7 @@ import 'dart:math' as math; ...@@ -9,6 +9,7 @@ import 'dart:math' as math;
import 'dart:sky' as sky; import 'dart:sky' as sky;
import 'package:sky/animation.dart'; import 'package:sky/animation.dart';
import 'package:sky/gestures.dart';
import 'package:sky/material.dart'; import 'package:sky/material.dart';
import 'package:sky/painting.dart'; import 'package:sky/painting.dart';
import 'package:sky/src/fn3.dart'; import 'package:sky/src/fn3.dart';
......
...@@ -183,27 +183,30 @@ class StockHomeState extends State<StockHome> { ...@@ -183,27 +183,30 @@ class StockHomeState extends State<StockHome> {
return stocks.where((stock) => stock.symbol.contains(regexp)); return stocks.where((stock) => stock.symbol.contains(regexp));
} }
Widget buildMarketStockList(BuildContext context) { Widget buildStockList(BuildContext context, Iterable<Stock> stocks) {
return new Stocklist(stocks: _filterBySearchQuery(config.stocks).toList()); return new StockList(
stocks: stocks.toList(),
onAction: (Stock stock) {
setState(() {
stock.percentChange = 100.0 * (1.0 / stock.lastSale);
stock.lastSale += 1.0;
});
} }
);
Widget buildPortfolioStocklist(BuildContext context) {
return new Stocklist(stocks: _filterBySearchQuery(_filterByPortfolio(config.stocks)).toList());
} }
Widget buildTabNavigator() { Widget buildTabNavigator() {
List<TabNavigatorView> views = <TabNavigatorView>[ return new TabNavigator(
views: <TabNavigatorView>[
new TabNavigatorView( new TabNavigatorView(
label: const TabLabel(text: 'MARKET'), label: const TabLabel(text: 'MARKET'),
builder: buildMarketStockList builder: (BuildContext context) => buildStockList(context, _filterBySearchQuery(config.stocks))
), ),
new TabNavigatorView( new TabNavigatorView(
label: const TabLabel(text: 'PORTFOLIO'), label: const TabLabel(text: 'PORTFOLIO'),
builder: buildPortfolioStocklist builder: (BuildContext context) => buildStockList(context, _filterByPortfolio(config.stocks))
) )
]; ],
return new TabNavigator(
views: views,
selectedIndex: selectedTabIndex, selectedIndex: selectedTabIndex,
onChanged: (tabIndex) { onChanged: (tabIndex) {
setState(() { selectedTabIndex = tabIndex; } ); setState(() { selectedTabIndex = tabIndex; } );
......
...@@ -4,10 +4,13 @@ ...@@ -4,10 +4,13 @@
part of stocks; part of stocks;
class Stocklist extends StatelessComponent { typedef void StockActionListener(Stock stock);
Stocklist({ Key key, this.stocks }) : super(key: key);
class StockList extends StatelessComponent {
StockList({ Key key, this.stocks, this.onAction }) : super(key: key);
final List<Stock> stocks; final List<Stock> stocks;
final StockActionListener onAction;
Widget build(BuildContext context) { Widget build(BuildContext context) {
return new Material( return new Material(
...@@ -15,7 +18,12 @@ class Stocklist extends StatelessComponent { ...@@ -15,7 +18,12 @@ class Stocklist extends StatelessComponent {
child: new ScrollableList<Stock>( child: new ScrollableList<Stock>(
items: stocks, items: stocks,
itemExtent: StockRow.kHeight, itemExtent: StockRow.kHeight,
itemBuilder: (BuildContext context, Stock stock) => new StockRow(stock: stock) itemBuilder: (BuildContext context, Stock stock) {
return new StockRow(
stock: stock,
onPressed: () { onAction(stock); }
);
}
) )
); );
} }
......
...@@ -5,9 +5,10 @@ ...@@ -5,9 +5,10 @@
part of stocks; part of stocks;
class StockRow extends StatelessComponent { class StockRow extends StatelessComponent {
StockRow({ Stock stock }) : this.stock = stock, super(key: new Key(stock.symbol)); StockRow({ Stock stock, this.onPressed }) : this.stock = stock, super(key: new Key(stock.symbol));
final Stock stock; final Stock stock;
final GestureTapListener onPressed;
static const double kHeight = 79.0; static const double kHeight = 79.0;
...@@ -36,10 +37,11 @@ class StockRow extends StatelessComponent { ...@@ -36,10 +37,11 @@ class StockRow extends StatelessComponent {
) )
]; ];
// TODO(hansmuller): An explicit |height| shouldn't be needed return new GestureDetector(
return new Container( onTap: onPressed,
child: new InkWell(
child: new Container(
padding: const EdgeDims(16.0, 16.0, 20.0, 16.0), padding: const EdgeDims(16.0, 16.0, 20.0, 16.0),
height: kHeight,
decoration: new BoxDecoration( decoration: new BoxDecoration(
border: new Border( border: new Border(
bottom: new BorderSide(color: Theme.of(context).dividerColor) bottom: new BorderSide(color: Theme.of(context).dividerColor)
...@@ -58,6 +60,8 @@ class StockRow extends StatelessComponent { ...@@ -58,6 +60,8 @@ class StockRow extends StatelessComponent {
) )
) )
]) ])
)
)
); );
} }
} }
...@@ -572,17 +572,16 @@ class TabBarState extends ScrollableState<TabBar> { ...@@ -572,17 +572,16 @@ class TabBarState extends ScrollableState<TabBar> {
} }
class TabNavigatorView { class TabNavigatorView {
TabNavigatorView({ this.label, this.builder }); TabNavigatorView({ this.label, this.builder }) {
assert(builder != null);
}
// this uses a builder for the contents, rather than a raw Widget child,
// because there might be many, many tabs and some might be relatively
// expensive to create up front. This way, the view is only created lazily.
final TabLabel label; final TabLabel label;
final WidgetBuilder builder; final WidgetBuilder builder;
Widget buildContent(BuildContext context) {
assert(builder != null);
Widget content = builder(context);
assert(content != null);
return content;
}
} }
class TabNavigator extends StatelessComponent { class TabNavigator extends StatelessComponent {
...@@ -607,15 +606,14 @@ class TabNavigator extends StatelessComponent { ...@@ -607,15 +606,14 @@ class TabNavigator extends StatelessComponent {
Widget build(BuildContext context) { Widget build(BuildContext context) {
assert(views != null && views.isNotEmpty); assert(views != null && views.isNotEmpty);
assert(selectedIndex >= 0 && selectedIndex < views.length); assert(selectedIndex >= 0 && selectedIndex < views.length);
return new Column([
TabBar tabBar = new TabBar( new TabBar(
labels: views.map((view) => view.label), labels: views.map((view) => view.label),
onChanged: _handleSelectedIndexChanged, onChanged: _handleSelectedIndexChanged,
selectedIndex: selectedIndex, selectedIndex: selectedIndex,
isScrollable: isScrollable isScrollable: isScrollable
); ),
new Flexible(child: views[selectedIndex].builder(context))
Widget content = views[selectedIndex].buildContent(context); ]);
return new Column([tabBar, new Flexible(child: content)]);
} }
} }
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