blob: 318bb1b3a297874a7b4faa4c9c0f3fa97c13b371 [file]
// 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.
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
import 'colors.dart';
import 'page.dart';
import 'theme.dart';
export 'dart:ui' show Locale;
const TextStyle _errorTextStyle = const TextStyle(
color: const Color(0xD0FF0000),
fontFamily: 'monospace',
fontSize: 48.0,
fontWeight: FontWeight.w900,
textAlign: TextAlign.right,
decoration: TextDecoration.underline,
decorationColor: const Color(0xFFFFFF00),
decorationStyle: TextDecorationStyle.double
);
class MaterialApp extends WidgetsApp {
MaterialApp({
Key key,
String title,
ThemeData theme,
Map<String, WidgetBuilder> routes: const <String, WidgetBuilder>{},
RouteFactory onGenerateRoute,
LocaleChangedCallback onLocaleChanged,
this.debugShowMaterialGrid: false,
bool showPerformanceOverlay: false,
bool showSemanticsDebugger: false,
bool debugShowCheckedModeBanner: true
}) : theme = theme,
super(
key: key,
title: title,
textStyle: _errorTextStyle,
color: theme?.primaryColor ?? Colors.blue[500], // blue[500] is the primary color of the default theme
routes: routes,
onGenerateRoute: (RouteSettings settings) {
WidgetBuilder builder = routes[settings.name];
if (builder != null) {
return new MaterialPageRoute<Null>(
builder: builder,
settings: settings
);
}
if (onGenerateRoute != null)
return onGenerateRoute(settings);
return null;
},
onLocaleChanged: onLocaleChanged,
showPerformanceOverlay: showPerformanceOverlay,
showSemanticsDebugger: showSemanticsDebugger,
debugShowCheckedModeBanner: debugShowCheckedModeBanner
) {
assert(debugShowMaterialGrid != null);
}
/// The colors to use for the application's widgets.
final ThemeData theme;
/// Turns on a [GridPaper] overlay that paints a baseline grid
/// Material apps:
/// https://www.google.com/design/spec/layout/metrics-keylines.html
/// Only available in checked mode.
final bool debugShowMaterialGrid;
@override
_MaterialAppState createState() => new _MaterialAppState();
}
class _MaterialAppState extends WidgetsAppState<MaterialApp> {
final HeroController _heroController = new HeroController();
@override
NavigatorObserver get navigatorObserver => _heroController;
@override
Widget build(BuildContext context) {
ThemeData theme = config.theme ?? new ThemeData.fallback();
Widget result = new AnimatedTheme(
data: theme,
duration: kThemeAnimationDuration,
child: super.build(context)
);
assert(() {
if (config.debugShowMaterialGrid) {
result = new GridPaper(
color: const Color(0xE0F9BBE0),
interval: 8.0,
divisions: 2,
subDivisions: 1,
child: result
);
}
return true;
});
return result;
}
}