mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

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.
178 lines
5.4 KiB
Dart
178 lines
5.4 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.
|
|
|
|
import 'dart:async';
|
|
|
|
import 'package:flutter/foundation.dart' show defaultTargetPlatform;
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/scheduler.dart' show timeDilation;
|
|
|
|
import 'home.dart';
|
|
import 'item.dart';
|
|
import 'theme.dart';
|
|
import 'updates.dart';
|
|
|
|
class GalleryApp extends StatefulWidget {
|
|
const GalleryApp({
|
|
this.updateUrlFetcher,
|
|
this.enablePerformanceOverlay: true,
|
|
this.checkerboardRasterCacheImages: true,
|
|
this.checkerboardOffscreenLayers: true,
|
|
this.onSendFeedback,
|
|
Key key}
|
|
) : super(key: key);
|
|
|
|
final UpdateUrlFetcher updateUrlFetcher;
|
|
|
|
final bool enablePerformanceOverlay;
|
|
|
|
final bool checkerboardRasterCacheImages;
|
|
|
|
final bool checkerboardOffscreenLayers;
|
|
|
|
final VoidCallback onSendFeedback;
|
|
|
|
@override
|
|
GalleryAppState createState() => new GalleryAppState();
|
|
}
|
|
|
|
class GalleryAppState extends State<GalleryApp> {
|
|
GalleryTheme _galleryTheme = kAllGalleryThemes[0];
|
|
bool _showPerformanceOverlay = false;
|
|
bool _checkerboardRasterCacheImages = false;
|
|
bool _checkerboardOffscreenLayers = false;
|
|
TextDirection _overrideDirection = TextDirection.ltr;
|
|
double _timeDilation = 1.0;
|
|
TargetPlatform _platform;
|
|
|
|
// A null value indicates "use system default".
|
|
double _textScaleFactor;
|
|
|
|
Timer _timeDilationTimer;
|
|
|
|
@override
|
|
void initState() {
|
|
_timeDilation = timeDilation;
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_timeDilationTimer?.cancel();
|
|
_timeDilationTimer = null;
|
|
super.dispose();
|
|
}
|
|
|
|
Widget _applyScaleFactor(Widget child) {
|
|
return new Builder(
|
|
builder: (BuildContext context) => new MediaQuery(
|
|
data: MediaQuery.of(context).copyWith(
|
|
textScaleFactor: _textScaleFactor,
|
|
),
|
|
child: child,
|
|
),
|
|
);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
Widget home = new GalleryHome(
|
|
galleryTheme: _galleryTheme,
|
|
onThemeChanged: (GalleryTheme value) {
|
|
setState(() {
|
|
_galleryTheme = value;
|
|
});
|
|
},
|
|
showPerformanceOverlay: _showPerformanceOverlay,
|
|
onShowPerformanceOverlayChanged: widget.enablePerformanceOverlay ? (bool value) {
|
|
setState(() {
|
|
_showPerformanceOverlay = value;
|
|
});
|
|
} : null,
|
|
checkerboardRasterCacheImages: _checkerboardRasterCacheImages,
|
|
onCheckerboardRasterCacheImagesChanged: widget.checkerboardRasterCacheImages ? (bool value) {
|
|
setState(() {
|
|
_checkerboardRasterCacheImages = value;
|
|
});
|
|
} : null,
|
|
checkerboardOffscreenLayers: _checkerboardOffscreenLayers,
|
|
onCheckerboardOffscreenLayersChanged: widget.checkerboardOffscreenLayers ? (bool value) {
|
|
setState(() {
|
|
_checkerboardOffscreenLayers = value;
|
|
});
|
|
} : null,
|
|
onPlatformChanged: (TargetPlatform value) {
|
|
setState(() {
|
|
_platform = value == defaultTargetPlatform ? null : value;
|
|
});
|
|
},
|
|
timeDilation: _timeDilation,
|
|
onTimeDilationChanged: (double value) {
|
|
setState(() {
|
|
_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;
|
|
}
|
|
});
|
|
},
|
|
textScaleFactor: _textScaleFactor,
|
|
onTextScaleFactorChanged: (double value) {
|
|
setState(() {
|
|
_textScaleFactor = value;
|
|
});
|
|
},
|
|
overrideDirection: _overrideDirection,
|
|
onOverrideDirectionChanged: (TextDirection value) {
|
|
setState(() {
|
|
_overrideDirection = value;
|
|
});
|
|
},
|
|
onSendFeedback: widget.onSendFeedback,
|
|
);
|
|
|
|
if (widget.updateUrlFetcher != null) {
|
|
home = new Updater(
|
|
updateUrlFetcher: widget.updateUrlFetcher,
|
|
child: home,
|
|
);
|
|
}
|
|
|
|
final Map<String, WidgetBuilder> _kRoutes = <String, WidgetBuilder>{};
|
|
for (GalleryItem item in kAllGalleryItems) {
|
|
// For a different example of how to set up an application routing table
|
|
// using named routes, consider the example in the Navigator class documentation:
|
|
// https://docs.flutter.io/flutter/widgets/Navigator-class.html
|
|
_kRoutes[item.routeName] = (BuildContext context) {
|
|
return item.buildRoute(context);
|
|
};
|
|
}
|
|
|
|
return new MaterialApp(
|
|
title: 'Flutter Gallery',
|
|
color: Colors.grey,
|
|
theme: _galleryTheme.theme.copyWith(platform: _platform ?? defaultTargetPlatform),
|
|
showPerformanceOverlay: _showPerformanceOverlay,
|
|
checkerboardRasterCacheImages: _checkerboardRasterCacheImages,
|
|
checkerboardOffscreenLayers: _checkerboardOffscreenLayers,
|
|
routes: _kRoutes,
|
|
home: home,
|
|
builder: (BuildContext context, Widget child) {
|
|
return new Directionality(
|
|
textDirection: _overrideDirection,
|
|
child: _applyScaleFactor(child),
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}
|