// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Snapshot from http://www.nasdaq.com/screening/company-list.aspx // Fetched 2/23/2014. // "Symbol","Name","LastSale","MarketCap","IPOyear","Sector","industry","Summary Quote", // Data in stock_data.json import 'dart:convert'; import 'dart:math' as math; import 'package:flutter/http.dart' as http; final math.Random _rng = new math.Random(); class Stock { String symbol; String name; double lastSale; String marketCap; double percentChange; Stock(this.symbol, this.name, this.lastSale, this.marketCap, this.percentChange); Stock.fromFields(List<String> fields) { // FIXME: This class should only have static data, not lastSale, etc. // "Symbol","Name","LastSale","MarketCap","IPOyear","Sector","industry","Summary Quote", lastSale = 0.0; try{ lastSale = double.parse(fields[2]); } catch(_) {} symbol = fields[0]; name = fields[1]; marketCap = fields[4]; percentChange = (_rng.nextDouble() * 20) - 10; } } class StockData { List<List<String>> _data; StockData(this._data); void appendTo(Map<String, Stock> stocks, List<String> symbols) { for (List<String> fields in _data) { Stock stock = new Stock.fromFields(fields); symbols.add(stock.symbol); stocks[stock.symbol] = stock; } symbols.sort(); } } typedef void StockDataCallback(StockData data); const int _kChunkCount = 30; String _urlToFetch(int chunk) { return 'https://domokit.github.io/examples/stocks/data/stock_data_$chunk.json'; } class StockDataFetcher { int _nextChunk = 0; final StockDataCallback callback; static bool actuallyFetchData = true; StockDataFetcher(this.callback) { _fetchNextChunk(); } void _fetchNextChunk() { if (!actuallyFetchData) return; http.get(_urlToFetch(_nextChunk++)).then((http.Response response) { String json = response.body; if (json == null) { print("Failed to load stock data chunk ${_nextChunk - 1}"); return; } JsonDecoder decoder = new JsonDecoder(); callback(new StockData(decoder.convert(json))); if (_nextChunk < _kChunkCount) _fetchNextChunk(); }); } }