app.dart 4.6 KB
Newer Older
1 2 3 4
// 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.

5 6
import 'dart:async';

7
import 'package:flutter/foundation.dart' show defaultTargetPlatform;
8
import 'package:flutter/material.dart';
9
import 'package:flutter/scheduler.dart' show timeDilation;
10 11

import 'home.dart';
12
import 'item.dart';
13
import 'updates.dart';
14

15
final Map<String, WidgetBuilder> _kRoutes = new Map<String, WidgetBuilder>.fromIterable(
16 17 18
  // For a different example of how to set up an application routing table,
  // consider the Stocks example:
  // https://github.com/flutter/flutter/blob/master/examples/stocks/lib/main.dart
19 20
  kAllGalleryItems,
  key: (GalleryItem item) => item.routeName,
21
  value: (GalleryItem item) => item.buildRoute,
22
);
23

24
final ThemeData _kGalleryLightTheme = new ThemeData(
25
  brightness: Brightness.light,
26
  primarySwatch: Colors.blue,
27 28 29
);

final ThemeData _kGalleryDarkTheme = new ThemeData(
30
  brightness: Brightness.dark,
31
  primarySwatch: Colors.blue,
32 33
);

34
class GalleryApp extends StatefulWidget {
35
  const GalleryApp({
36 37
    this.updateUrlFetcher,
    this.enablePerformanceOverlay: true,
38
    this.checkerboardRasterCacheImages: true,
39
    this.checkerboardOffscreenLayers: true,
40
    this.onSendFeedback,
41 42
    Key key}
  ) : super(key: key);
43 44

  final UpdateUrlFetcher updateUrlFetcher;
45

46
  final bool enablePerformanceOverlay;
47

48 49
  final bool checkerboardRasterCacheImages;

50 51
  final bool checkerboardOffscreenLayers;

52 53
  final VoidCallback onSendFeedback;

54
  @override
55 56 57 58
  GalleryAppState createState() => new GalleryAppState();
}

class GalleryAppState extends State<GalleryApp> {
59
  bool _useLightTheme = true;
Eric Seidel's avatar
Eric Seidel committed
60
  bool _showPerformanceOverlay = false;
61
  bool _checkerboardRasterCacheImages = false;
62
  bool _checkerboardOffscreenLayers = false;
63
  double _timeDilation = 1.0;
64
  TargetPlatform _platform;
65 66

  Timer _timeDilationTimer;
67

68 69 70 71 72 73 74 75 76 77 78 79
  @override
  void initState() {
    _timeDilation = timeDilation;
    super.initState();
  }

  @override
  void dispose() {
    _timeDilationTimer?.cancel();
    _timeDilationTimer = null;
    super.dispose();
  }
80

81
  @override
82
  Widget build(BuildContext context) {
83 84
    Widget home = new GalleryHome(
      useLightTheme: _useLightTheme,
85 86 87 88 89
      onThemeChanged: (bool value) {
        setState(() {
          _useLightTheme = value;
        });
      },
90
      showPerformanceOverlay: _showPerformanceOverlay,
91
      onShowPerformanceOverlayChanged: widget.enablePerformanceOverlay ? (bool value) {
92 93 94
        setState(() {
          _showPerformanceOverlay = value;
        });
95
      } : null,
96
      checkerboardRasterCacheImages: _checkerboardRasterCacheImages,
97
      onCheckerboardRasterCacheImagesChanged: widget.checkerboardRasterCacheImages ? (bool value) {
98 99 100 101
        setState(() {
          _checkerboardRasterCacheImages = value;
        });
      } : null,
102 103 104 105 106 107
      checkerboardOffscreenLayers: _checkerboardOffscreenLayers,
      onCheckerboardOffscreenLayersChanged: widget.checkerboardOffscreenLayers ? (bool value) {
        setState(() {
          _checkerboardOffscreenLayers = value;
        });
      } : null,
108 109
      onPlatformChanged: (TargetPlatform value) {
        setState(() {
110
          _platform = value == defaultTargetPlatform ? null : value;
111 112
        });
      },
113
      timeDilation: _timeDilation,
114 115
      onTimeDilationChanged: (double value) {
        setState(() {
116 117 118 119 120 121 122 123 124 125 126 127 128
          _timeDilationTimer?.cancel();
          _timeDilationTimer = null;
          _timeDilation = value;
          if (_timeDilation > 1.0) {
            // We delay the time dilation change long enough that the user can see
            // that the checkbox in the drawer has started reacting, then we slam
            // on the brakes so that they see that the time is in fact now dilated.
            _timeDilationTimer = new Timer(const Duration(milliseconds: 150), () {
              timeDilation = _timeDilation;
            });
          } else {
            timeDilation = _timeDilation;
          }
129 130
        });
      },
131
      onSendFeedback: widget.onSendFeedback,
132 133
    );

134
    if (widget.updateUrlFetcher != null) {
135
      home = new Updater(
136
        updateUrlFetcher: widget.updateUrlFetcher,
137
        child: home,
138
      );
139
    }
140

141
    return new MaterialApp(
142
      title: 'Flutter Gallery',
143
      color: Colors.grey,
144
      theme: (_useLightTheme ? _kGalleryLightTheme : _kGalleryDarkTheme).copyWith(platform: _platform ?? defaultTargetPlatform),
Eric Seidel's avatar
Eric Seidel committed
145
      showPerformanceOverlay: _showPerformanceOverlay,
146
      checkerboardRasterCacheImages: _checkerboardRasterCacheImages,
147
      checkerboardOffscreenLayers: _checkerboardOffscreenLayers,
148
      routes: _kRoutes,
149
      home: home,
150 151 152
    );
  }
}