Added an additional Material theme to the Gallery (#15492)
diff --git a/examples/flutter_gallery/lib/gallery/app.dart b/examples/flutter_gallery/lib/gallery/app.dart
index c34c54d..db3a9d6 100644
--- a/examples/flutter_gallery/lib/gallery/app.dart
+++ b/examples/flutter_gallery/lib/gallery/app.dart
@@ -10,18 +10,9 @@
import 'home.dart';
import 'item.dart';
+import 'theme.dart';
import 'updates.dart';
-final ThemeData _kGalleryLightTheme = new ThemeData(
- brightness: Brightness.light,
- primarySwatch: Colors.blue,
-);
-
-final ThemeData _kGalleryDarkTheme = new ThemeData(
- brightness: Brightness.dark,
- primarySwatch: Colors.blue,
-);
-
class GalleryApp extends StatefulWidget {
const GalleryApp({
this.updateUrlFetcher,
@@ -47,7 +38,7 @@
}
class GalleryAppState extends State<GalleryApp> {
- bool _useLightTheme = true;
+ GalleryTheme _galleryTheme = kAllGalleryThemes[0];
bool _showPerformanceOverlay = false;
bool _checkerboardRasterCacheImages = false;
bool _checkerboardOffscreenLayers = false;
@@ -87,10 +78,10 @@
@override
Widget build(BuildContext context) {
Widget home = new GalleryHome(
- useLightTheme: _useLightTheme,
- onThemeChanged: (bool value) {
+ galleryTheme: _galleryTheme,
+ onThemeChanged: (GalleryTheme value) {
setState(() {
- _useLightTheme = value;
+ _galleryTheme = value;
});
},
showPerformanceOverlay: _showPerformanceOverlay,
@@ -138,7 +129,7 @@
onTextScaleFactorChanged: (double value) {
setState(() {
_textScaleFactor = value;
- });
+ });
},
overrideDirection: _overrideDirection,
onOverrideDirectionChanged: (TextDirection value) {
@@ -169,7 +160,7 @@
return new MaterialApp(
title: 'Flutter Gallery',
color: Colors.grey,
- theme: (_useLightTheme ? _kGalleryLightTheme : _kGalleryDarkTheme).copyWith(platform: _platform ?? defaultTargetPlatform),
+ theme: _galleryTheme.theme.copyWith(platform: _platform ?? defaultTargetPlatform),
showPerformanceOverlay: _showPerformanceOverlay,
checkerboardRasterCacheImages: _checkerboardRasterCacheImages,
checkerboardOffscreenLayers: _checkerboardOffscreenLayers,
diff --git a/examples/flutter_gallery/lib/gallery/drawer.dart b/examples/flutter_gallery/lib/gallery/drawer.dart
index fabe75a..6c0b0be 100644
--- a/examples/flutter_gallery/lib/gallery/drawer.dart
+++ b/examples/flutter_gallery/lib/gallery/drawer.dart
@@ -10,6 +10,8 @@
import 'package:url_launcher/url_launcher.dart';
+import 'theme.dart';
+
class LinkTextSpan extends TextSpan {
// Beware!
@@ -107,7 +109,7 @@
class GalleryDrawer extends StatelessWidget {
const GalleryDrawer({
Key key,
- this.useLightTheme,
+ this.galleryTheme,
@required this.onThemeChanged,
this.timeDilation,
@required this.onTimeDilationChanged,
@@ -127,8 +129,8 @@
assert(onTimeDilationChanged != null),
super(key: key);
- final bool useLightTheme;
- final ValueChanged<bool> onThemeChanged;
+ final GalleryTheme galleryTheme;
+ final ValueChanged<GalleryTheme> onThemeChanged;
final double timeDilation;
final ValueChanged<double> onTimeDilationChanged;
@@ -158,23 +160,16 @@
final TextStyle aboutTextStyle = themeData.textTheme.body2;
final TextStyle linkStyle = themeData.textTheme.body2.copyWith(color: themeData.accentColor);
- final Widget lightThemeItem = new RadioListTile<bool>(
- secondary: const Icon(Icons.brightness_5),
- title: const Text('Light'),
- value: true,
- groupValue: useLightTheme,
- onChanged: onThemeChanged,
- selected: useLightTheme,
- );
-
- final Widget darkThemeItem = new RadioListTile<bool>(
- secondary: const Icon(Icons.brightness_7),
- title: const Text('Dark'),
- value: false,
- groupValue: useLightTheme,
- onChanged: onThemeChanged,
- selected: !useLightTheme,
- );
+ final List<Widget> themeItems = kAllGalleryThemes.map<Widget>((GalleryTheme theme) {
+ return new RadioListTile<GalleryTheme>(
+ title: new Text(theme.name),
+ secondary: new Icon(theme.icon),
+ value: theme,
+ groupValue: galleryTheme,
+ onChanged: onThemeChanged,
+ selected: galleryTheme == theme,
+ );
+ }).toList();
final Widget mountainViewItem = new RadioListTile<TargetPlatform>(
// on iOS, we don't want to show an Android phone icon
@@ -288,18 +283,19 @@
);
final List<Widget> allDrawerItems = <Widget>[
- new GalleryDrawerHeader(light: useLightTheme),
- lightThemeItem,
- darkThemeItem,
+ new GalleryDrawerHeader(
+ light: galleryTheme.theme.brightness == Brightness.light,
+ ),
+ ]
+ ..addAll(themeItems)
+ ..addAll(<Widget>[
const Divider(),
mountainViewItem,
cupertinoItem,
const Divider(),
- ];
-
- allDrawerItems.addAll(textSizeItems);
-
- allDrawerItems..addAll(<Widget>[
+ ])
+ ..addAll(textSizeItems)
+ ..addAll(<Widget>[
overrideDirectionItem,
const Divider(),
animateSlowlyItem,
diff --git a/examples/flutter_gallery/lib/gallery/home.dart b/examples/flutter_gallery/lib/gallery/home.dart
index cfc8372..8d4fd96 100644
--- a/examples/flutter_gallery/lib/gallery/home.dart
+++ b/examples/flutter_gallery/lib/gallery/home.dart
@@ -7,6 +7,7 @@
import 'drawer.dart';
import 'item.dart';
+import 'theme.dart';
const double _kFlexibleSpaceMaxHeight = 256.0;
const String _kGalleryAssetsPackage = 'flutter_gallery_assets';
@@ -64,7 +65,7 @@
class GalleryHome extends StatefulWidget {
const GalleryHome({
Key key,
- this.useLightTheme,
+ this.galleryTheme,
@required this.onThemeChanged,
this.timeDilation,
@required this.onTimeDilationChanged,
@@ -84,8 +85,8 @@
assert(onTimeDilationChanged != null),
super(key: key);
- final bool useLightTheme;
- final ValueChanged<bool> onThemeChanged;
+ final GalleryTheme galleryTheme;
+ final ValueChanged<GalleryTheme> onThemeChanged;
final double timeDilation;
final ValueChanged<double> onTimeDilationChanged;
@@ -172,7 +173,7 @@
Widget home = new Scaffold(
key: _scaffoldKey,
drawer: new GalleryDrawer(
- useLightTheme: widget.useLightTheme,
+ galleryTheme: widget.galleryTheme,
onThemeChanged: widget.onThemeChanged,
timeDilation: widget.timeDilation,
onTimeDilationChanged: widget.onTimeDilationChanged,
diff --git a/examples/flutter_gallery/lib/gallery/theme.dart b/examples/flutter_gallery/lib/gallery/theme.dart
new file mode 100644
index 0000000..04bc7d2
--- /dev/null
+++ b/examples/flutter_gallery/lib/gallery/theme.dart
@@ -0,0 +1,62 @@
+// Copyright 2018 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/material.dart';
+
+class GalleryTheme {
+ const GalleryTheme({ this.name, this.icon, this.theme });
+ final String name;
+ final IconData icon;
+ final ThemeData theme;
+}
+
+const MaterialColor _kPurpleSwatch = const MaterialColor(
+ 500,
+ const <int, Color> {
+ 50: const Color(0xFFF2E7FE),
+ 100: const Color(0xFFD7B7FD),
+ 200: const Color(0xFFBB86FC),
+ 300: const Color(0xFF9E55FC),
+ 400: const Color(0xFF7F22FD),
+ 500: const Color(0xFF6200EE),
+ 600: const Color(0xFF4B00D1),
+ 700: const Color(0xFF3700B3),
+ 800: const Color(0xFF270096),
+ 900: const Color(0xFF190078),
+ }
+);
+
+final List<GalleryTheme> kAllGalleryThemes = <GalleryTheme>[
+ new GalleryTheme(
+ name: 'Light',
+ icon: Icons.brightness_5,
+ theme: new ThemeData(
+ brightness: Brightness.light,
+ primarySwatch: Colors.blue,
+ ),
+ ),
+ new GalleryTheme(
+ name: 'Dark',
+ icon: Icons.brightness_7,
+ theme: new ThemeData(
+ brightness: Brightness.dark,
+ primarySwatch: Colors.blue,
+ ),
+ ),
+ new GalleryTheme(
+ name: 'Purple',
+ icon: Icons.brightness_6,
+ theme: new ThemeData(
+ brightness: Brightness.light,
+ primarySwatch: _kPurpleSwatch,
+ buttonColor: _kPurpleSwatch[500],
+ splashColor: Colors.white24,
+ splashFactory: InkRipple.splashFactory,
+ errorColor: const Color(0xFFFF1744),
+ buttonTheme: const ButtonThemeData(
+ textTheme: ButtonTextTheme.primary,
+ ),
+ ),
+ ),
+];