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) {
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 {
) )
) )
]) ])
)
)
); );
} }
} }
...@@ -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