Commit f43591b3 authored by Hixie's avatar Hixie

Make Stocks demo list rows clickable

Not having them clickable was making it hard to notice InkSplash bugs.
Also, this paves the way to having a stock page.
parent 4150615e
...@@ -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) {
Widget buildPortfolioStocklist(BuildContext context) { setState(() {
return new Stocklist(stocks: _filterBySearchQuery(_filterByPortfolio(config.stocks)).toList()); stock.percentChange = 100.0 * (1.0 / stock.lastSale);
stock.lastSale += 1.0;
});
}
);
} }
Widget buildTabNavigator() { Widget buildTabNavigator() {
List<TabNavigatorView> views = <TabNavigatorView>[
new TabNavigatorView(
label: const TabLabel(text: 'MARKET'),
builder: buildMarketStockList
),
new TabNavigatorView(
label: const TabLabel(text: 'PORTFOLIO'),
builder: buildPortfolioStocklist
)
];
return new TabNavigator( return new TabNavigator(
views: views, views: <TabNavigatorView>[
new TabNavigatorView(
label: const TabLabel(text: 'MARKET'),
builder: (BuildContext context) => buildStockList(context, _filterBySearchQuery(config.stocks))
),
new TabNavigatorView(
label: const TabLabel(text: 'PORTFOLIO'),
builder: (BuildContext context) => buildStockList(context, _filterByPortfolio(config.stocks))
)
],
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,28 +37,31 @@ class StockRow extends StatelessComponent { ...@@ -36,28 +37,31 @@ class StockRow extends StatelessComponent {
) )
]; ];
// TODO(hansmuller): An explicit |height| shouldn't be needed return new GestureDetector(
return new Container( onTap: onPressed,
padding: const EdgeDims(16.0, 16.0, 20.0, 16.0), child: new InkWell(
height: kHeight, child: new Container(
decoration: new BoxDecoration( padding: const EdgeDims(16.0, 16.0, 20.0, 16.0),
border: new Border( decoration: new BoxDecoration(
bottom: new BorderSide(color: Theme.of(context).dividerColor) border: new Border(
bottom: new BorderSide(color: Theme.of(context).dividerColor)
)
),
child: new Row([
new Container(
child: new StockArrow(percentChange: stock.percentChange),
margin: const EdgeDims.only(right: 5.0)
),
new Flexible(
child: new Row(
children,
alignItems: FlexAlignItems.baseline,
textBaseline: DefaultTextStyle.of(context).textBaseline
)
)
])
) )
), )
child: new Row([
new Container(
child: new StockArrow(percentChange: stock.percentChange),
margin: const EdgeDims.only(right: 5.0)
),
new Flexible(
child: new Row(
children,
alignItems: FlexAlignItems.baseline,
textBaseline: DefaultTextStyle.of(context).textBaseline
)
)
])
); );
} }
} }
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:async'; import 'dart:async';
import 'dart:sky' as sky;
import 'package:mojo_services/keyboard/keyboard.mojom.dart'; import 'package:mojo_services/keyboard/keyboard.mojom.dart';
import 'package:sky/painting.dart'; import 'package:sky/painting.dart';
......
...@@ -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