
This is not a grand refactor yet, it's just cleaning up what we have already, so that people who keep using this API (e.g. dialogs) have something coherent to deal with. The major changes are that Navigator and NavigatorState have the same API now, that most of the examples use `<void>` instead of `<Null>`, that the navigator observer can see replaces, and that the `settings` is moved from ModalRoute to Route. I also cleaned up some of the API documentation.
149 lines
4.5 KiB
Dart
149 lines
4.5 KiB
Dart
// Copyright 2015 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.
|
|
|
|
library stocks;
|
|
|
|
import 'dart:async';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/rendering.dart' show
|
|
debugPaintSizeEnabled,
|
|
debugPaintBaselinesEnabled,
|
|
debugPaintLayerBordersEnabled,
|
|
debugPaintPointersEnabled,
|
|
debugRepaintRainbowEnabled;
|
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
|
|
|
import 'stock_data.dart';
|
|
import 'stock_home.dart';
|
|
import 'stock_settings.dart';
|
|
import 'stock_strings.dart';
|
|
import 'stock_symbol_viewer.dart';
|
|
import 'stock_types.dart';
|
|
|
|
class _StocksLocalizationsDelegate extends LocalizationsDelegate<StockStrings> {
|
|
@override
|
|
Future<StockStrings> load(Locale locale) => StockStrings.load(locale);
|
|
|
|
@override
|
|
bool isSupported(Locale locale) => locale.languageCode == 'es' || locale.languageCode == 'en';
|
|
|
|
@override
|
|
bool shouldReload(_StocksLocalizationsDelegate old) => false;
|
|
}
|
|
|
|
class StocksApp extends StatefulWidget {
|
|
@override
|
|
StocksAppState createState() => new StocksAppState();
|
|
}
|
|
|
|
class StocksAppState extends State<StocksApp> {
|
|
StockData stocks;
|
|
|
|
StockConfiguration _configuration = new StockConfiguration(
|
|
stockMode: StockMode.optimistic,
|
|
backupMode: BackupMode.enabled,
|
|
debugShowGrid: false,
|
|
debugShowSizes: false,
|
|
debugShowBaselines: false,
|
|
debugShowLayers: false,
|
|
debugShowPointers: false,
|
|
debugShowRainbow: false,
|
|
showPerformanceOverlay: false,
|
|
showSemanticsDebugger: false
|
|
);
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
stocks = new StockData();
|
|
}
|
|
|
|
void configurationUpdater(StockConfiguration value) {
|
|
setState(() {
|
|
_configuration = value;
|
|
});
|
|
}
|
|
|
|
ThemeData get theme {
|
|
switch (_configuration.stockMode) {
|
|
case StockMode.optimistic:
|
|
return new ThemeData(
|
|
brightness: Brightness.light,
|
|
primarySwatch: Colors.purple
|
|
);
|
|
case StockMode.pessimistic:
|
|
return new ThemeData(
|
|
brightness: Brightness.dark,
|
|
accentColor: Colors.redAccent
|
|
);
|
|
}
|
|
assert(_configuration.stockMode != null);
|
|
return null;
|
|
}
|
|
|
|
Route<dynamic> _getRoute(RouteSettings settings) {
|
|
// Routes, by convention, are split on slashes, like filesystem paths.
|
|
final List<String> path = settings.name.split('/');
|
|
// We only support paths that start with a slash, so bail if
|
|
// the first component is not empty:
|
|
if (path[0] != '')
|
|
return null;
|
|
// If the path is "/stock:..." then show a stock page for the
|
|
// specified stock symbol.
|
|
if (path[1].startsWith('stock:')) {
|
|
// We don't yet support subpages of a stock, so bail if there's
|
|
// any more path components.
|
|
if (path.length != 2)
|
|
return null;
|
|
// Extract the symbol part of "stock:..." and return a route
|
|
// for that symbol.
|
|
final String symbol = path[1].substring(6);
|
|
return new MaterialPageRoute<void>(
|
|
settings: settings,
|
|
builder: (BuildContext context) => new StockSymbolPage(symbol: symbol, stocks: stocks),
|
|
);
|
|
}
|
|
// The other paths we support are in the routes table.
|
|
return null;
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
assert(() {
|
|
debugPaintSizeEnabled = _configuration.debugShowSizes;
|
|
debugPaintBaselinesEnabled = _configuration.debugShowBaselines;
|
|
debugPaintLayerBordersEnabled = _configuration.debugShowLayers;
|
|
debugPaintPointersEnabled = _configuration.debugShowPointers;
|
|
debugRepaintRainbowEnabled = _configuration.debugShowRainbow;
|
|
return true;
|
|
}());
|
|
return new MaterialApp(
|
|
title: 'Stocks',
|
|
theme: theme,
|
|
localizationsDelegates: <LocalizationsDelegate<dynamic>>[
|
|
new _StocksLocalizationsDelegate(),
|
|
GlobalMaterialLocalizations.delegate,
|
|
GlobalWidgetsLocalizations.delegate,
|
|
],
|
|
supportedLocales: const <Locale>[
|
|
const Locale('en', 'US'),
|
|
const Locale('es', 'ES'),
|
|
],
|
|
debugShowMaterialGrid: _configuration.debugShowGrid,
|
|
showPerformanceOverlay: _configuration.showPerformanceOverlay,
|
|
showSemanticsDebugger: _configuration.showSemanticsDebugger,
|
|
routes: <String, WidgetBuilder>{
|
|
'/': (BuildContext context) => new StockHome(stocks, _configuration, configurationUpdater),
|
|
'/settings': (BuildContext context) => new StockSettings(_configuration, configurationUpdater)
|
|
},
|
|
onGenerateRoute: _getRoute,
|
|
);
|
|
}
|
|
}
|
|
|
|
void main() {
|
|
runApp(new StocksApp());
|
|
}
|