mirror of
https://github.com/encounter/engine.git
synced 2026-03-30 11:09:55 -07:00
23df3e6bcb
Broke a fake implementation of Accessibility features in the framework.
While this change is unlikely to break any users in the wild, this is a
breaking change by the standards set out in our documentation and
should follow the breaking change announcement process. Details can be
found at https://github.com/flutter/flutter/wiki/Tree-hygiene#handling-breaking-changes.
The error in question:
Missing concrete implementation of 'getter AccessibilityFeatures.onOffSwitchLabels' • packages/flutter_test/test/window_test.dart:252:7 • non_abstract_class_inherits_abstract_member
This reverts commit d12f2a6096.
1302 lines
54 KiB
Dart
1302 lines
54 KiB
Dart
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||
// Use of this source code is governed by a BSD-style license that can be
|
||
// found in the LICENSE file.
|
||
|
||
part of dart.ui;
|
||
|
||
/// Signature of callbacks that have no arguments and return no data.
|
||
typedef VoidCallback = void Function();
|
||
|
||
/// Signature for [Window.onBeginFrame].
|
||
typedef FrameCallback = void Function(Duration duration);
|
||
|
||
/// Signature for [Window.onReportTimings].
|
||
///
|
||
/// {@template dart.ui.TimingsCallback.list}
|
||
/// The callback takes a list of [FrameTiming] because it may not be
|
||
/// immediately triggered after each frame. Instead, Flutter tries to batch
|
||
/// frames together and send all their timings at once to decrease the
|
||
/// overhead (as this is available in the release mode). The list is sorted in
|
||
/// ascending order of time (earliest frame first). The timing of any frame
|
||
/// will be sent within about 1 second (100ms if in the profile/debug mode)
|
||
/// even if there are no later frames to batch. The timing of the first frame
|
||
/// will be sent immediately without batching.
|
||
/// {@endtemplate}
|
||
typedef TimingsCallback = void Function(List<FrameTiming> timings);
|
||
|
||
/// Signature for [Window.onPointerDataPacket].
|
||
typedef PointerDataPacketCallback = void Function(PointerDataPacket packet);
|
||
|
||
/// Signature for [Window.onSemanticsAction].
|
||
typedef SemanticsActionCallback = void Function(int id, SemanticsAction action, ByteData args);
|
||
|
||
/// Signature for responses to platform messages.
|
||
///
|
||
/// Used as a parameter to [Window.sendPlatformMessage] and
|
||
/// [Window.onPlatformMessage].
|
||
typedef PlatformMessageResponseCallback = void Function(ByteData data);
|
||
|
||
/// Signature for [Window.onPlatformMessage].
|
||
typedef PlatformMessageCallback = void Function(String name, ByteData data, PlatformMessageResponseCallback callback);
|
||
|
||
// Signature for _setNeedsReportTimings.
|
||
typedef _SetNeedsReportTimingsFunc = void Function(bool value);
|
||
|
||
/// Various important time points in the lifetime of a frame.
|
||
///
|
||
/// [FrameTiming] records a timestamp of each phase for performance analysis.
|
||
enum FramePhase {
|
||
/// When the UI thread starts building a frame.
|
||
///
|
||
/// See also [FrameTiming.buildDuration].
|
||
buildStart,
|
||
|
||
/// When the UI thread finishes building a frame.
|
||
///
|
||
/// See also [FrameTiming.buildDuration].
|
||
buildFinish,
|
||
|
||
/// When the GPU thread starts rasterizing a frame.
|
||
///
|
||
/// See also [FrameTiming.rasterDuration].
|
||
rasterStart,
|
||
|
||
/// When the GPU thread finishes rasterizing a frame.
|
||
///
|
||
/// See also [FrameTiming.rasterDuration].
|
||
rasterFinish,
|
||
}
|
||
|
||
/// Time-related performance metrics of a frame.
|
||
///
|
||
/// If you're using the whole Flutter framework, please use
|
||
/// [SchedulerBinding.addTimingsCallback] to get this. It's preferred over using
|
||
/// [Window.onReportTimings] directly because
|
||
/// [SchedulerBinding.addTimingsCallback] allows multiple callbacks. If
|
||
/// [SchedulerBinding] is unavailable, then see [Window.onReportTimings] for how
|
||
/// to get this.
|
||
///
|
||
/// The metrics in debug mode (`flutter run` without any flags) may be very
|
||
/// different from those in profile and release modes due to the debug overhead.
|
||
/// Therefore it's recommended to only monitor and analyze performance metrics
|
||
/// in profile and release modes.
|
||
class FrameTiming {
|
||
/// Construct [FrameTiming] with raw timestamps in microseconds.
|
||
///
|
||
/// List [timestamps] must have the same number of elements as
|
||
/// [FramePhase.values].
|
||
///
|
||
/// This constructor is usually only called by the Flutter engine, or a test.
|
||
/// To get the [FrameTiming] of your app, see [Window.onReportTimings].
|
||
FrameTiming(List<int> timestamps)
|
||
: assert(timestamps.length == FramePhase.values.length), _timestamps = timestamps;
|
||
|
||
/// This is a raw timestamp in microseconds from some epoch. The epoch in all
|
||
/// [FrameTiming] is the same, but it may not match [DateTime]'s epoch.
|
||
int timestampInMicroseconds(FramePhase phase) => _timestamps[phase.index];
|
||
|
||
Duration _rawDuration(FramePhase phase) => Duration(microseconds: _timestamps[phase.index]);
|
||
|
||
/// The duration to build the frame on the UI thread.
|
||
///
|
||
/// The build starts approximately when [Window.onBeginFrame] is called. The
|
||
/// [Duration] in the [Window.onBeginFrame] callback is exactly the
|
||
/// `Duration(microseconds: timestampInMicroseconds(FramePhase.buildStart))`.
|
||
///
|
||
/// The build finishes when [Window.render] is called.
|
||
///
|
||
/// {@template dart.ui.FrameTiming.fps_smoothness_milliseconds}
|
||
/// To ensure smooth animations of X fps, this should not exceed 1000/X
|
||
/// milliseconds.
|
||
/// {@endtemplate}
|
||
/// {@template dart.ui.FrameTiming.fps_milliseconds}
|
||
/// That's about 16ms for 60fps, and 8ms for 120fps.
|
||
/// {@endtemplate}
|
||
Duration get buildDuration => _rawDuration(FramePhase.buildFinish) - _rawDuration(FramePhase.buildStart);
|
||
|
||
/// The duration to rasterize the frame on the GPU thread.
|
||
///
|
||
/// {@macro dart.ui.FrameTiming.fps_smoothness_milliseconds}
|
||
/// {@macro dart.ui.FrameTiming.fps_milliseconds}
|
||
Duration get rasterDuration => _rawDuration(FramePhase.rasterFinish) - _rawDuration(FramePhase.rasterStart);
|
||
|
||
/// The timespan between build start and raster finish.
|
||
///
|
||
/// To achieve the lowest latency on an X fps display, this should not exceed
|
||
/// 1000/X milliseconds.
|
||
/// {@macro dart.ui.FrameTiming.fps_milliseconds}
|
||
///
|
||
/// See also [buildDuration] and [rasterDuration].
|
||
Duration get totalSpan => _rawDuration(FramePhase.rasterFinish) - _rawDuration(FramePhase.buildStart);
|
||
|
||
final List<int> _timestamps; // in microseconds
|
||
|
||
String _formatMS(Duration duration) => '${duration.inMicroseconds * 0.001}ms';
|
||
|
||
@override
|
||
String toString() {
|
||
return '$runtimeType(buildDuration: ${_formatMS(buildDuration)}, rasterDuration: ${_formatMS(rasterDuration)}, totalSpan: ${_formatMS(totalSpan)})';
|
||
}
|
||
}
|
||
|
||
/// States that an application can be in.
|
||
///
|
||
/// The values below describe notifications from the operating system.
|
||
/// Applications should not expect to always receive all possible
|
||
/// notifications. For example, if the users pulls out the battery from the
|
||
/// device, no notification will be sent before the application is suddenly
|
||
/// terminated, along with the rest of the operating system.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [WidgetsBindingObserver], for a mechanism to observe the lifecycle state
|
||
/// from the widgets layer.
|
||
enum AppLifecycleState {
|
||
/// The application is visible and responding to user input.
|
||
resumed,
|
||
|
||
/// The application is in an inactive state and is not receiving user input.
|
||
///
|
||
/// On iOS, this state corresponds to an app or the Flutter host view running
|
||
/// in the foreground inactive state. Apps transition to this state when in
|
||
/// a phone call, responding to a TouchID request, when entering the app
|
||
/// switcher or the control center, or when the UIViewController hosting the
|
||
/// Flutter app is transitioning.
|
||
///
|
||
/// On Android, this corresponds to an app or the Flutter host view running
|
||
/// in the foreground inactive state. Apps transition to this state when
|
||
/// another activity is focused, such as a split-screen app, a phone call,
|
||
/// a picture-in-picture app, a system dialog, or another window.
|
||
///
|
||
/// Apps in this state should assume that they may be [paused] at any time.
|
||
inactive,
|
||
|
||
/// The application is not currently visible to the user, not responding to
|
||
/// user input, and running in the background.
|
||
///
|
||
/// When the application is in this state, the engine will not call the
|
||
/// [Window.onBeginFrame] and [Window.onDrawFrame] callbacks.
|
||
paused,
|
||
|
||
/// The application is still hosted on a flutter engine but is detached from
|
||
/// any host views.
|
||
///
|
||
/// When the application is in this state, the engine is running without
|
||
/// a view. It can either be in the progress of attaching a view when engine
|
||
/// was first initializes, or after the view being destroyed due to a Navigator
|
||
/// pop.
|
||
detached,
|
||
}
|
||
|
||
/// A representation of distances for each of the four edges of a rectangle,
|
||
/// used to encode the view insets and padding that applications should place
|
||
/// around their user interface, as exposed by [Window.viewInsets] and
|
||
/// [Window.padding]. View insets and padding are preferably read via
|
||
/// [MediaQuery.of].
|
||
///
|
||
/// For a generic class that represents distances around a rectangle, see the
|
||
/// [EdgeInsets] class.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [WidgetsBindingObserver], for a widgets layer mechanism to receive
|
||
/// notifications when the padding changes.
|
||
/// * [MediaQuery.of], for the preferred mechanism for accessing these values.
|
||
/// * [Scaffold], which automatically applies the padding in material design
|
||
/// applications.
|
||
class WindowPadding {
|
||
const WindowPadding._({ this.left, this.top, this.right, this.bottom });
|
||
|
||
/// The distance from the left edge to the first unpadded pixel, in physical pixels.
|
||
final double left;
|
||
|
||
/// The distance from the top edge to the first unpadded pixel, in physical pixels.
|
||
final double top;
|
||
|
||
/// The distance from the right edge to the first unpadded pixel, in physical pixels.
|
||
final double right;
|
||
|
||
/// The distance from the bottom edge to the first unpadded pixel, in physical pixels.
|
||
final double bottom;
|
||
|
||
/// A window padding that has zeros for each edge.
|
||
static const WindowPadding zero = WindowPadding._(left: 0.0, top: 0.0, right: 0.0, bottom: 0.0);
|
||
|
||
@override
|
||
String toString() {
|
||
return 'WindowPadding(left: $left, top: $top, right: $right, bottom: $bottom)';
|
||
}
|
||
}
|
||
|
||
/// An identifier used to select a user's language and formatting preferences.
|
||
///
|
||
/// This represents a [Unicode Language
|
||
/// Identifier](https://www.unicode.org/reports/tr35/#Unicode_language_identifier)
|
||
/// (i.e. without Locale extensions), except variants are not supported.
|
||
///
|
||
/// Locales are canonicalized according to the "preferred value" entries in the
|
||
/// [IANA Language Subtag
|
||
/// Registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry).
|
||
/// For example, `const Locale('he')` and `const Locale('iw')` are equal and
|
||
/// both have the [languageCode] `he`, because `iw` is a deprecated language
|
||
/// subtag that was replaced by the subtag `he`.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [Window.locale], which specifies the system's currently selected
|
||
/// [Locale].
|
||
class Locale {
|
||
/// Creates a new Locale object. The first argument is the
|
||
/// primary language subtag, the second is the region (also
|
||
/// referred to as 'country') subtag.
|
||
///
|
||
/// For example:
|
||
///
|
||
/// ```dart
|
||
/// const Locale swissFrench = Locale('fr', 'CH');
|
||
/// const Locale canadianFrench = Locale('fr', 'CA');
|
||
/// ```
|
||
///
|
||
/// The primary language subtag must not be null. The region subtag is
|
||
/// optional. When there is no region/country subtag, the parameter should
|
||
/// be omitted or passed `null` instead of an empty-string.
|
||
///
|
||
/// The subtag values are _case sensitive_ and must be one of the valid
|
||
/// subtags according to CLDR supplemental data:
|
||
/// [language](http://unicode.org/cldr/latest/common/validity/language.xml),
|
||
/// [region](http://unicode.org/cldr/latest/common/validity/region.xml). The
|
||
/// primary language subtag must be at least two and at most eight lowercase
|
||
/// letters, but not four letters. The region region subtag must be two
|
||
/// uppercase letters or three digits. See the [Unicode Language
|
||
/// Identifier](https://www.unicode.org/reports/tr35/#Unicode_language_identifier)
|
||
/// specification.
|
||
///
|
||
/// Validity is not checked by default, but some methods may throw away
|
||
/// invalid data.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [Locale.fromSubtags], which also allows a [scriptCode] to be
|
||
/// specified.
|
||
const Locale(
|
||
this._languageCode, [
|
||
this._countryCode,
|
||
]) : assert(_languageCode != null),
|
||
assert(_languageCode != ''),
|
||
scriptCode = null;
|
||
|
||
/// Creates a new Locale object.
|
||
///
|
||
/// The keyword arguments specify the subtags of the Locale.
|
||
///
|
||
/// The subtag values are _case sensitive_ and must be valid subtags according
|
||
/// to CLDR supplemental data:
|
||
/// [language](http://unicode.org/cldr/latest/common/validity/language.xml),
|
||
/// [script](http://unicode.org/cldr/latest/common/validity/script.xml) and
|
||
/// [region](http://unicode.org/cldr/latest/common/validity/region.xml) for
|
||
/// each of languageCode, scriptCode and countryCode respectively.
|
||
///
|
||
/// The [countryCode] subtag is optional. When there is no country subtag,
|
||
/// the parameter should be omitted or passed `null` instead of an empty-string.
|
||
///
|
||
/// Validity is not checked by default, but some methods may throw away
|
||
/// invalid data.
|
||
const Locale.fromSubtags({
|
||
String languageCode = 'und',
|
||
this.scriptCode,
|
||
String countryCode,
|
||
}) : assert(languageCode != null),
|
||
assert(languageCode != ''),
|
||
_languageCode = languageCode,
|
||
assert(scriptCode != ''),
|
||
assert(countryCode != ''),
|
||
_countryCode = countryCode;
|
||
|
||
/// The primary language subtag for the locale.
|
||
///
|
||
/// This must not be null. It may be 'und', representing 'undefined'.
|
||
///
|
||
/// This is expected to be string registered in the [IANA Language Subtag
|
||
/// Registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry)
|
||
/// with the type "language". The string specified must match the case of the
|
||
/// string in the registry.
|
||
///
|
||
/// Language subtags that are deprecated in the registry and have a preferred
|
||
/// code are changed to their preferred code. For example, `const
|
||
/// Locale('he')` and `const Locale('iw')` are equal, and both have the
|
||
/// [languageCode] `he`, because `iw` is a deprecated language subtag that was
|
||
/// replaced by the subtag `he`.
|
||
///
|
||
/// This must be a valid Unicode Language subtag as listed in [Unicode CLDR
|
||
/// supplemental
|
||
/// data](http://unicode.org/cldr/latest/common/validity/language.xml).
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [Locale.fromSubtags], which describes the conventions for creating
|
||
/// [Locale] objects.
|
||
String get languageCode => _deprecatedLanguageSubtagMap[_languageCode] ?? _languageCode;
|
||
final String _languageCode;
|
||
|
||
// This map is generated by //flutter/tools/gen_locale.dart
|
||
// Mappings generated for language subtag registry as of 2019-02-27.
|
||
static const Map<String, String> _deprecatedLanguageSubtagMap = <String, String>{
|
||
'in': 'id', // Indonesian; deprecated 1989-01-01
|
||
'iw': 'he', // Hebrew; deprecated 1989-01-01
|
||
'ji': 'yi', // Yiddish; deprecated 1989-01-01
|
||
'jw': 'jv', // Javanese; deprecated 2001-08-13
|
||
'mo': 'ro', // Moldavian, Moldovan; deprecated 2008-11-22
|
||
'aam': 'aas', // Aramanik; deprecated 2015-02-12
|
||
'adp': 'dz', // Adap; deprecated 2015-02-12
|
||
'aue': 'ktz', // ǂKxʼauǁʼein; deprecated 2015-02-12
|
||
'ayx': 'nun', // Ayi (China); deprecated 2011-08-16
|
||
'bgm': 'bcg', // Baga Mboteni; deprecated 2016-05-30
|
||
'bjd': 'drl', // Bandjigali; deprecated 2012-08-12
|
||
'ccq': 'rki', // Chaungtha; deprecated 2012-08-12
|
||
'cjr': 'mom', // Chorotega; deprecated 2010-03-11
|
||
'cka': 'cmr', // Khumi Awa Chin; deprecated 2012-08-12
|
||
'cmk': 'xch', // Chimakum; deprecated 2010-03-11
|
||
'coy': 'pij', // Coyaima; deprecated 2016-05-30
|
||
'cqu': 'quh', // Chilean Quechua; deprecated 2016-05-30
|
||
'drh': 'khk', // Darkhat; deprecated 2010-03-11
|
||
'drw': 'prs', // Darwazi; deprecated 2010-03-11
|
||
'gav': 'dev', // Gabutamon; deprecated 2010-03-11
|
||
'gfx': 'vaj', // Mangetti Dune ǃXung; deprecated 2015-02-12
|
||
'ggn': 'gvr', // Eastern Gurung; deprecated 2016-05-30
|
||
'gti': 'nyc', // Gbati-ri; deprecated 2015-02-12
|
||
'guv': 'duz', // Gey; deprecated 2016-05-30
|
||
'hrr': 'jal', // Horuru; deprecated 2012-08-12
|
||
'ibi': 'opa', // Ibilo; deprecated 2012-08-12
|
||
'ilw': 'gal', // Talur; deprecated 2013-09-10
|
||
'jeg': 'oyb', // Jeng; deprecated 2017-02-23
|
||
'kgc': 'tdf', // Kasseng; deprecated 2016-05-30
|
||
'kgh': 'kml', // Upper Tanudan Kalinga; deprecated 2012-08-12
|
||
'koj': 'kwv', // Sara Dunjo; deprecated 2015-02-12
|
||
'krm': 'bmf', // Krim; deprecated 2017-02-23
|
||
'ktr': 'dtp', // Kota Marudu Tinagas; deprecated 2016-05-30
|
||
'kvs': 'gdj', // Kunggara; deprecated 2016-05-30
|
||
'kwq': 'yam', // Kwak; deprecated 2015-02-12
|
||
'kxe': 'tvd', // Kakihum; deprecated 2015-02-12
|
||
'kzj': 'dtp', // Coastal Kadazan; deprecated 2016-05-30
|
||
'kzt': 'dtp', // Tambunan Dusun; deprecated 2016-05-30
|
||
'lii': 'raq', // Lingkhim; deprecated 2015-02-12
|
||
'lmm': 'rmx', // Lamam; deprecated 2014-02-28
|
||
'meg': 'cir', // Mea; deprecated 2013-09-10
|
||
'mst': 'mry', // Cataelano Mandaya; deprecated 2010-03-11
|
||
'mwj': 'vaj', // Maligo; deprecated 2015-02-12
|
||
'myt': 'mry', // Sangab Mandaya; deprecated 2010-03-11
|
||
'nad': 'xny', // Nijadali; deprecated 2016-05-30
|
||
'ncp': 'kdz', // Ndaktup; deprecated 2018-03-08
|
||
'nnx': 'ngv', // Ngong; deprecated 2015-02-12
|
||
'nts': 'pij', // Natagaimas; deprecated 2016-05-30
|
||
'oun': 'vaj', // ǃOǃung; deprecated 2015-02-12
|
||
'pcr': 'adx', // Panang; deprecated 2013-09-10
|
||
'pmc': 'huw', // Palumata; deprecated 2016-05-30
|
||
'pmu': 'phr', // Mirpur Panjabi; deprecated 2015-02-12
|
||
'ppa': 'bfy', // Pao; deprecated 2016-05-30
|
||
'ppr': 'lcq', // Piru; deprecated 2013-09-10
|
||
'pry': 'prt', // Pray 3; deprecated 2016-05-30
|
||
'puz': 'pub', // Purum Naga; deprecated 2014-02-28
|
||
'sca': 'hle', // Sansu; deprecated 2012-08-12
|
||
'skk': 'oyb', // Sok; deprecated 2017-02-23
|
||
'tdu': 'dtp', // Tempasuk Dusun; deprecated 2016-05-30
|
||
'thc': 'tpo', // Tai Hang Tong; deprecated 2016-05-30
|
||
'thx': 'oyb', // The; deprecated 2015-02-12
|
||
'tie': 'ras', // Tingal; deprecated 2011-08-16
|
||
'tkk': 'twm', // Takpa; deprecated 2011-08-16
|
||
'tlw': 'weo', // South Wemale; deprecated 2012-08-12
|
||
'tmp': 'tyj', // Tai Mène; deprecated 2016-05-30
|
||
'tne': 'kak', // Tinoc Kallahan; deprecated 2016-05-30
|
||
'tnf': 'prs', // Tangshewi; deprecated 2010-03-11
|
||
'tsf': 'taj', // Southwestern Tamang; deprecated 2015-02-12
|
||
'uok': 'ema', // Uokha; deprecated 2015-02-12
|
||
'xba': 'cax', // Kamba (Brazil); deprecated 2016-05-30
|
||
'xia': 'acn', // Xiandao; deprecated 2013-09-10
|
||
'xkh': 'waw', // Karahawyana; deprecated 2016-05-30
|
||
'xsj': 'suj', // Subi; deprecated 2015-02-12
|
||
'ybd': 'rki', // Yangbye; deprecated 2012-08-12
|
||
'yma': 'lrr', // Yamphe; deprecated 2012-08-12
|
||
'ymt': 'mtm', // Mator-Taygi-Karagas; deprecated 2015-02-12
|
||
'yos': 'zom', // Yos; deprecated 2013-09-10
|
||
'yuu': 'yug', // Yugh; deprecated 2014-02-28
|
||
};
|
||
|
||
/// The script subtag for the locale.
|
||
///
|
||
/// This may be null, indicating that there is no specified script subtag.
|
||
///
|
||
/// This must be a valid Unicode Language Identifier script subtag as listed
|
||
/// in [Unicode CLDR supplemental
|
||
/// data](http://unicode.org/cldr/latest/common/validity/script.xml).
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [Locale.fromSubtags], which describes the conventions for creating
|
||
/// [Locale] objects.
|
||
final String scriptCode;
|
||
|
||
/// The region subtag for the locale.
|
||
///
|
||
/// This may be null, indicating that there is no specified region subtag.
|
||
///
|
||
/// This is expected to be string registered in the [IANA Language Subtag
|
||
/// Registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry)
|
||
/// with the type "region". The string specified must match the case of the
|
||
/// string in the registry.
|
||
///
|
||
/// Region subtags that are deprecated in the registry and have a preferred
|
||
/// code are changed to their preferred code. For example, `const Locale('de',
|
||
/// 'DE')` and `const Locale('de', 'DD')` are equal, and both have the
|
||
/// [countryCode] `DE`, because `DD` is a deprecated language subtag that was
|
||
/// replaced by the subtag `DE`.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [Locale.fromSubtags], which describes the conventions for creating
|
||
/// [Locale] objects.
|
||
String get countryCode => _deprecatedRegionSubtagMap[_countryCode] ?? _countryCode;
|
||
final String _countryCode;
|
||
|
||
// This map is generated by //flutter/tools/gen_locale.dart
|
||
// Mappings generated for language subtag registry as of 2019-02-27.
|
||
static const Map<String, String> _deprecatedRegionSubtagMap = <String, String>{
|
||
'BU': 'MM', // Burma; deprecated 1989-12-05
|
||
'DD': 'DE', // German Democratic Republic; deprecated 1990-10-30
|
||
'FX': 'FR', // Metropolitan France; deprecated 1997-07-14
|
||
'TP': 'TL', // East Timor; deprecated 2002-05-20
|
||
'YD': 'YE', // Democratic Yemen; deprecated 1990-08-14
|
||
'ZR': 'CD', // Zaire; deprecated 1997-07-14
|
||
};
|
||
|
||
@override
|
||
bool operator ==(dynamic other) {
|
||
if (identical(this, other))
|
||
return true;
|
||
if (other is! Locale)
|
||
return false;
|
||
final Locale typedOther = other;
|
||
return languageCode == typedOther.languageCode
|
||
&& scriptCode == typedOther.scriptCode
|
||
&& countryCode == typedOther.countryCode;
|
||
}
|
||
|
||
@override
|
||
int get hashCode => hashValues(languageCode, scriptCode, countryCode);
|
||
|
||
static Locale cachedLocale;
|
||
static String cachedLocaleString;
|
||
|
||
/// Returns a string representing the locale.
|
||
///
|
||
/// This identifier happens to be a valid Unicode Locale Identifier using
|
||
/// underscores as separator, however it is intended to be used for debugging
|
||
/// purposes only. For parseable results, use [toLanguageTag] instead.
|
||
@override
|
||
String toString() {
|
||
if (!identical(cachedLocale, this)) {
|
||
cachedLocale = this;
|
||
cachedLocaleString = _rawToString('_');
|
||
}
|
||
return cachedLocaleString;
|
||
}
|
||
|
||
/// Returns a syntactically valid Unicode BCP47 Locale Identifier.
|
||
///
|
||
/// Some examples of such identifiers: "en", "es-419", "hi-Deva-IN" and
|
||
/// "zh-Hans-CN". See http://www.unicode.org/reports/tr35/ for technical
|
||
/// details.
|
||
String toLanguageTag() => _rawToString('-');
|
||
|
||
String _rawToString(String separator) {
|
||
final StringBuffer out = StringBuffer(languageCode);
|
||
if (scriptCode != null)
|
||
out.write('$separator$scriptCode');
|
||
if (_countryCode != null)
|
||
out.write('$separator$countryCode');
|
||
return out.toString();
|
||
}
|
||
}
|
||
|
||
/// The most basic interface to the host operating system's user interface.
|
||
///
|
||
/// It exposes the size of the display, the core scheduler API, the input event
|
||
/// callback, the graphics drawing API, and other such core services.
|
||
///
|
||
/// There is a single Window instance in the system, which you can
|
||
/// obtain from `WidgetsBinding.instance.window`.
|
||
///
|
||
/// There is also a [window] singleton object in `dart:ui` if `WidgetsBinding`
|
||
/// is unavailable. But we strongly advise to avoid statically referencing it.
|
||
/// See the document of [window] for more details of why it should be avoided.
|
||
///
|
||
/// ## Insets and Padding
|
||
///
|
||
/// {@animation 300 300 https://flutter.github.io/assets-for-api-docs/assets/widgets/window_padding.mp4}
|
||
///
|
||
/// In this diagram, the black areas represent system UI that the app cannot
|
||
/// draw over. The red area represents view padding that the application may not
|
||
/// be able to detect gestures in and may not want to draw in. The grey area
|
||
/// represents the system keyboard, which can cover over the bottom view
|
||
/// padding when visible.
|
||
///
|
||
/// The [Window.viewInsets] are the physical pixels which the operating
|
||
/// system reserves for system UI, such as the keyboard, which would fully
|
||
/// obscure any content drawn in that area.
|
||
///
|
||
/// The [Window.viewPadding] are the physical pixels on each side of the display
|
||
/// that may be partially obscured by system UI or by physical intrusions into
|
||
/// the display, such as an overscan region on a television or a "notch" on a
|
||
/// phone. Unlike the insets, these areas may have portions that show the user
|
||
/// application painted pixels without being obscured, such as a notch at the
|
||
/// top of a phone that covers only a subset of the area. Insets, on the other
|
||
/// hand, either partially or fully obscure the window, such as an opaque
|
||
/// keyboard or a partially transluscent statusbar, which cover an area without
|
||
/// gaps.
|
||
///
|
||
/// The [Window.padding] property is computed from both [Window.viewInsets] and
|
||
/// [Window.viewPadding]. It will allow a view inset to consume view padding
|
||
/// where appropriate, such as when a phone's keyboard is covering the bottom
|
||
/// view padding and so "absorbs" it.
|
||
///
|
||
/// Clients that want to position elements relative to the view padding
|
||
/// regardless of the view insets should use the [Window.viewPadding] property,
|
||
/// e.g. if you wish to draw a widget at the center of the screen with respect
|
||
/// to the iPhone "safe area" regardless of whether the keyboard is showing.
|
||
///
|
||
/// [Window.padding] is useful for clients that want to know how much padding
|
||
/// should be accounted for without concern for the current inset(s) state, e.g.
|
||
/// determining whether a gesture should be considered for scrolling purposes.
|
||
/// This value varies based on the current state of the insets. For example, a
|
||
/// visible keyboard will consume all gestures in the bottom part of the
|
||
/// [Window.viewPadding] anyway, so there is no need to account for that in the
|
||
/// [Window.padding], which is always safe to use for such calculations.
|
||
class Window {
|
||
Window._() {
|
||
_setNeedsReportTimings = _nativeSetNeedsReportTimings;
|
||
}
|
||
|
||
/// The number of device pixels for each logical pixel. This number might not
|
||
/// be a power of two. Indeed, it might not even be an integer. For example,
|
||
/// the Nexus 6 has a device pixel ratio of 3.5.
|
||
///
|
||
/// Device pixels are also referred to as physical pixels. Logical pixels are
|
||
/// also referred to as device-independent or resolution-independent pixels.
|
||
///
|
||
/// By definition, there are roughly 38 logical pixels per centimeter, or
|
||
/// about 96 logical pixels per inch, of the physical display. The value
|
||
/// returned by [devicePixelRatio] is ultimately obtained either from the
|
||
/// hardware itself, the device drivers, or a hard-coded value stored in the
|
||
/// operating system or firmware, and may be inaccurate, sometimes by a
|
||
/// significant margin.
|
||
///
|
||
/// The Flutter framework operates in logical pixels, so it is rarely
|
||
/// necessary to directly deal with this property.
|
||
///
|
||
/// When this changes, [onMetricsChanged] is called.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [WidgetsBindingObserver], for a mechanism at the widgets layer to
|
||
/// observe when this value changes.
|
||
double get devicePixelRatio => _devicePixelRatio;
|
||
double _devicePixelRatio = 1.0;
|
||
|
||
/// The dimensions of the rectangle into which the application will be drawn,
|
||
/// in physical pixels.
|
||
///
|
||
/// When this changes, [onMetricsChanged] is called.
|
||
///
|
||
/// At startup, the size of the application window may not be known before Dart
|
||
/// code runs. If this value is observed early in the application lifecycle,
|
||
/// it may report [Size.zero].
|
||
///
|
||
/// This value does not take into account any on-screen keyboards or other
|
||
/// system UI. The [padding] and [viewInsets] properties provide a view into
|
||
/// how much of each side of the application may be obscured by system UI.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [WidgetsBindingObserver], for a mechanism at the widgets layer to
|
||
/// observe when this value changes.
|
||
Size get physicalSize => _physicalSize;
|
||
Size _physicalSize = Size.zero;
|
||
|
||
/// The physical depth is the maximum elevation that the Window allows.
|
||
///
|
||
/// Physical layers drawn at or above this elevation will have their elevation
|
||
/// clamped to this value. This can happen if the physical layer itself has
|
||
/// an elevation larger than available depth, or if some ancestor of the layer
|
||
/// causes it to have a cumulative elevation that is larger than the available
|
||
/// depth.
|
||
///
|
||
/// The default value is [double.maxFinite], which is used for platforms that
|
||
/// do not specify a maximum elevation. This property is currently on expected
|
||
/// to be set to a non-default value on Fuchsia.
|
||
double get physicalDepth => _physicalDepth;
|
||
double _physicalDepth = double.maxFinite;
|
||
|
||
/// The number of physical pixels on each side of the display rectangle into
|
||
/// which the application can render, but over which the operating system
|
||
/// will likely place system UI, such as the keyboard, that fully obscures
|
||
/// any content.
|
||
///
|
||
/// When this property changes, [onMetricsChanged] is called.
|
||
///
|
||
/// The relationship between this [Window.viewInsets], [Window.viewPadding],
|
||
/// and [Window.padding] are described in more detail in the documentation for
|
||
/// [Window].
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [WidgetsBindingObserver], for a mechanism at the widgets layer to
|
||
/// observe when this value changes.
|
||
/// * [MediaQuery.of], a simpler mechanism for the same.
|
||
/// * [Scaffold], which automatically applies the view insets in material
|
||
/// design applications.
|
||
WindowPadding get viewInsets => _viewInsets;
|
||
WindowPadding _viewInsets = WindowPadding.zero;
|
||
|
||
/// The number of physical pixels on each side of the display rectangle into
|
||
/// which the application can render, but which may be partially obscured by
|
||
/// system UI (such as the system notification area), or or physical
|
||
/// intrusions in the display (e.g. overscan regions on television screens or
|
||
/// phone sensor housings).
|
||
///
|
||
/// Unlike [Window.padding], this value does not change relative to
|
||
/// [Window.viewInsets]. For example, on an iPhone X, it will not change in
|
||
/// response to the soft keyboard being visible or hidden, whereas
|
||
/// [Window.padding] will.
|
||
///
|
||
/// When this property changes, [onMetricsChanged] is called.
|
||
///
|
||
/// The relationship between this [Window.viewInsets], [Window.viewPadding],
|
||
/// and [Window.padding] are described in more detail in the documentation for
|
||
/// [Window].
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [WidgetsBindingObserver], for a mechanism at the widgets layer to
|
||
/// observe when this value changes.
|
||
/// * [MediaQuery.of], a simpler mechanism for the same.
|
||
/// * [Scaffold], which automatically applies the padding in material design
|
||
/// applications.
|
||
WindowPadding get viewPadding => _viewPadding;
|
||
WindowPadding _viewPadding = WindowPadding.zero;
|
||
|
||
/// The number of physical pixels on each side of the display rectangle into
|
||
/// which the application can render, but where the operating system will
|
||
/// consume input gestures for the sake of system navigation.
|
||
///
|
||
/// For example, an operating system might use the vertical edges of the
|
||
/// screen, where swiping inwards from the edges takes users backward
|
||
/// through the history of screens they previously visited.
|
||
///
|
||
/// When this property changes, [onMetricsChanged] is called.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [WidgetsBindingObserver], for a mechanism at the widgets layer to
|
||
/// observe when this value changes.
|
||
/// * [MediaQuery.of], a simpler mechanism for the same.
|
||
WindowPadding get systemGestureInsets => _systemGestureInsets;
|
||
WindowPadding _systemGestureInsets = WindowPadding.zero;
|
||
|
||
/// The number of physical pixels on each side of the display rectangle into
|
||
/// which the application can render, but which may be partially obscured by
|
||
/// system UI (such as the system notification area), or or physical
|
||
/// intrusions in the display (e.g. overscan regions on television screens or
|
||
/// phone sensor housings).
|
||
///
|
||
/// This value is calculated by taking
|
||
/// `max(0.0, Window.viewPadding - Window.viewInsets)`. This will treat a
|
||
/// system IME that increases the bottom inset as consuming that much of the
|
||
/// bottom padding. For example, on an iPhone X, [Window.padding.bottom] is
|
||
/// the same as [Window.viewPadding.bottom] when the soft keyboard is not
|
||
/// drawn (to account for the bottom soft button area), but will be `0.0` when
|
||
/// the soft keyboard is visible.
|
||
///
|
||
/// When this changes, [onMetricsChanged] is called.
|
||
///
|
||
/// The relationship between this [Window.viewInsets], [Window.viewPadding],
|
||
/// and [Window.padding] are described in more detail in the documentation for
|
||
/// [Window].
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [WidgetsBindingObserver], for a mechanism at the widgets layer to
|
||
/// observe when this value changes.
|
||
/// * [MediaQuery.of], a simpler mechanism for the same.
|
||
/// * [Scaffold], which automatically applies the padding in material design
|
||
/// applications.
|
||
WindowPadding get padding => _padding;
|
||
WindowPadding _padding = WindowPadding.zero;
|
||
|
||
/// A callback that is invoked whenever the [devicePixelRatio],
|
||
/// [physicalSize], [padding], [viewInsets], or [systemGestureInsets]
|
||
/// values change, for example when the device is rotated or when the
|
||
/// application is resized (e.g. when showing applications side-by-side
|
||
/// on Android).
|
||
///
|
||
/// The engine invokes this callback in the same zone in which the callback
|
||
/// was set.
|
||
///
|
||
/// The framework registers with this callback and updates the layout
|
||
/// appropriately.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [WidgetsBindingObserver], for a mechanism at the widgets layer to
|
||
/// register for notifications when this is called.
|
||
/// * [MediaQuery.of], a simpler mechanism for the same.
|
||
VoidCallback get onMetricsChanged => _onMetricsChanged;
|
||
VoidCallback _onMetricsChanged;
|
||
Zone _onMetricsChangedZone;
|
||
set onMetricsChanged(VoidCallback callback) {
|
||
_onMetricsChanged = callback;
|
||
_onMetricsChangedZone = Zone.current;
|
||
}
|
||
|
||
/// The system-reported default locale of the device.
|
||
///
|
||
/// This establishes the language and formatting conventions that application
|
||
/// should, if possible, use to render their user interface.
|
||
///
|
||
/// This is the first locale selected by the user and is the user's
|
||
/// primary locale (the locale the device UI is displayed in)
|
||
///
|
||
/// This is equivalent to `locales.first` and will provide an empty non-null locale
|
||
/// if the [locales] list has not been set or is empty.
|
||
Locale get locale {
|
||
if (_locales != null && _locales.isNotEmpty) {
|
||
return _locales.first;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/// The full system-reported supported locales of the device.
|
||
///
|
||
/// This establishes the language and formatting conventions that application
|
||
/// should, if possible, use to render their user interface.
|
||
///
|
||
/// The list is ordered in order of priority, with lower-indexed locales being
|
||
/// preferred over higher-indexed ones. The first element is the primary [locale].
|
||
///
|
||
/// The [onLocaleChanged] callback is called whenever this value changes.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [WidgetsBindingObserver], for a mechanism at the widgets layer to
|
||
/// observe when this value changes.
|
||
List<Locale> get locales => _locales;
|
||
List<Locale> _locales;
|
||
|
||
/// A callback that is invoked whenever [locale] changes value.
|
||
///
|
||
/// The framework invokes this callback in the same zone in which the
|
||
/// callback was set.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [WidgetsBindingObserver], for a mechanism at the widgets layer to
|
||
/// observe when this callback is invoked.
|
||
VoidCallback get onLocaleChanged => _onLocaleChanged;
|
||
VoidCallback _onLocaleChanged;
|
||
Zone _onLocaleChangedZone;
|
||
set onLocaleChanged(VoidCallback callback) {
|
||
_onLocaleChanged = callback;
|
||
_onLocaleChangedZone = Zone.current;
|
||
}
|
||
|
||
/// The lifecycle state immediately after dart isolate initialization.
|
||
///
|
||
/// This property will not be updated as the lifecycle changes.
|
||
///
|
||
/// It is used to initialize [SchedulerBinding.lifecycleState] at startup
|
||
/// with any buffered lifecycle state events.
|
||
String get initialLifecycleState {
|
||
_initialLifecycleStateAccessed = true;
|
||
return _initialLifecycleState;
|
||
}
|
||
String _initialLifecycleState;
|
||
/// Tracks if the initial state has been accessed. Once accessed, we
|
||
/// will stop updating the [initialLifecycleState], as it is not the
|
||
/// preferred way to access the state.
|
||
bool _initialLifecycleStateAccessed = false;
|
||
|
||
/// The system-reported text scale.
|
||
///
|
||
/// This establishes the text scaling factor to use when rendering text,
|
||
/// according to the user's platform preferences.
|
||
///
|
||
/// The [onTextScaleFactorChanged] callback is called whenever this value
|
||
/// changes.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [WidgetsBindingObserver], for a mechanism at the widgets layer to
|
||
/// observe when this value changes.
|
||
double get textScaleFactor => _textScaleFactor;
|
||
double _textScaleFactor = 1.0;
|
||
|
||
/// The setting indicating whether time should always be shown in the 24-hour
|
||
/// format.
|
||
///
|
||
/// This option is used by [showTimePicker].
|
||
bool get alwaysUse24HourFormat => _alwaysUse24HourFormat;
|
||
bool _alwaysUse24HourFormat = false;
|
||
|
||
/// A callback that is invoked whenever [textScaleFactor] changes value.
|
||
///
|
||
/// The framework invokes this callback in the same zone in which the
|
||
/// callback was set.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [WidgetsBindingObserver], for a mechanism at the widgets layer to
|
||
/// observe when this callback is invoked.
|
||
VoidCallback get onTextScaleFactorChanged => _onTextScaleFactorChanged;
|
||
VoidCallback _onTextScaleFactorChanged;
|
||
Zone _onTextScaleFactorChangedZone;
|
||
set onTextScaleFactorChanged(VoidCallback callback) {
|
||
_onTextScaleFactorChanged = callback;
|
||
_onTextScaleFactorChangedZone = Zone.current;
|
||
}
|
||
|
||
/// The setting indicating the current brightness mode of the host platform.
|
||
/// If the platform has no preference, [platformBrightness] defaults to [Brightness.light].
|
||
Brightness get platformBrightness => _platformBrightness;
|
||
Brightness _platformBrightness = Brightness.light;
|
||
|
||
/// A callback that is invoked whenever [platformBrightness] changes value.
|
||
///
|
||
/// The framework invokes this callback in the same zone in which the
|
||
/// callback was set.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [WidgetsBindingObserver], for a mechanism at the widgets layer to
|
||
/// observe when this callback is invoked.
|
||
VoidCallback get onPlatformBrightnessChanged => _onPlatformBrightnessChanged;
|
||
VoidCallback _onPlatformBrightnessChanged;
|
||
Zone _onPlatformBrightnessChangedZone;
|
||
set onPlatformBrightnessChanged(VoidCallback callback) {
|
||
_onPlatformBrightnessChanged = callback;
|
||
_onPlatformBrightnessChangedZone = Zone.current;
|
||
}
|
||
|
||
/// A callback that is invoked to notify the application that it is an
|
||
/// appropriate time to provide a scene using the [SceneBuilder] API and the
|
||
/// [render] method. When possible, this is driven by the hardware VSync
|
||
/// signal. This is only called if [scheduleFrame] has been called since the
|
||
/// last time this callback was invoked.
|
||
///
|
||
/// The [onDrawFrame] callback is invoked immediately after [onBeginFrame],
|
||
/// after draining any microtasks (e.g. completions of any [Future]s) queued
|
||
/// by the [onBeginFrame] handler.
|
||
///
|
||
/// The framework invokes this callback in the same zone in which the
|
||
/// callback was set.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [SchedulerBinding], the Flutter framework class which manages the
|
||
/// scheduling of frames.
|
||
/// * [RendererBinding], the Flutter framework class which manages layout and
|
||
/// painting.
|
||
FrameCallback get onBeginFrame => _onBeginFrame;
|
||
FrameCallback _onBeginFrame;
|
||
Zone _onBeginFrameZone;
|
||
set onBeginFrame(FrameCallback callback) {
|
||
_onBeginFrame = callback;
|
||
_onBeginFrameZone = Zone.current;
|
||
}
|
||
|
||
/// A callback that is invoked for each frame after [onBeginFrame] has
|
||
/// completed and after the microtask queue has been drained. This can be
|
||
/// used to implement a second phase of frame rendering that happens
|
||
/// after any deferred work queued by the [onBeginFrame] phase.
|
||
///
|
||
/// The framework invokes this callback in the same zone in which the
|
||
/// callback was set.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [SchedulerBinding], the Flutter framework class which manages the
|
||
/// scheduling of frames.
|
||
/// * [RendererBinding], the Flutter framework class which manages layout and
|
||
/// painting.
|
||
VoidCallback get onDrawFrame => _onDrawFrame;
|
||
VoidCallback _onDrawFrame;
|
||
Zone _onDrawFrameZone;
|
||
set onDrawFrame(VoidCallback callback) {
|
||
_onDrawFrame = callback;
|
||
_onDrawFrameZone = Zone.current;
|
||
}
|
||
|
||
/// A callback that is invoked to report the [FrameTiming] of recently
|
||
/// rasterized frames.
|
||
///
|
||
/// It's prefered to use [SchedulerBinding.addTimingsCallback] than to use
|
||
/// [Window.onReportTimings] directly because
|
||
/// [SchedulerBinding.addTimingsCallback] allows multiple callbacks.
|
||
///
|
||
/// This can be used to see if the application has missed frames (through
|
||
/// [FrameTiming.buildDuration] and [FrameTiming.rasterDuration]), or high
|
||
/// latencies (through [FrameTiming.totalSpan]).
|
||
///
|
||
/// Unlike [Timeline], the timing information here is available in the release
|
||
/// mode (additional to the profile and the debug mode). Hence this can be
|
||
/// used to monitor the application's performance in the wild.
|
||
///
|
||
/// {@macro dart.ui.TimingsCallback.list}
|
||
///
|
||
/// If this is null, no additional work will be done. If this is not null,
|
||
/// Flutter spends less than 0.1ms every 1 second to report the timings
|
||
/// (measured on iPhone6S). The 0.1ms is about 0.6% of 16ms (frame budget for
|
||
/// 60fps), or 0.01% CPU usage per second.
|
||
TimingsCallback get onReportTimings => _onReportTimings;
|
||
TimingsCallback _onReportTimings;
|
||
Zone _onReportTimingsZone;
|
||
set onReportTimings(TimingsCallback callback) {
|
||
if ((callback == null) != (_onReportTimings == null)) {
|
||
_setNeedsReportTimings(callback != null);
|
||
}
|
||
_onReportTimings = callback;
|
||
_onReportTimingsZone = Zone.current;
|
||
}
|
||
|
||
_SetNeedsReportTimingsFunc _setNeedsReportTimings;
|
||
void _nativeSetNeedsReportTimings(bool value) native 'Window_setNeedsReportTimings';
|
||
|
||
/// A callback that is invoked when pointer data is available.
|
||
///
|
||
/// The framework invokes this callback in the same zone in which the
|
||
/// callback was set.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [GestureBinding], the Flutter framework class which manages pointer
|
||
/// events.
|
||
PointerDataPacketCallback get onPointerDataPacket => _onPointerDataPacket;
|
||
PointerDataPacketCallback _onPointerDataPacket;
|
||
Zone _onPointerDataPacketZone;
|
||
set onPointerDataPacket(PointerDataPacketCallback callback) {
|
||
_onPointerDataPacket = callback;
|
||
_onPointerDataPacketZone = Zone.current;
|
||
}
|
||
|
||
/// The route or path that the embedder requested when the application was
|
||
/// launched.
|
||
///
|
||
/// This will be the string "`/`" if no particular route was requested.
|
||
///
|
||
/// ## Android
|
||
///
|
||
/// On Android, calling
|
||
/// [`FlutterView.setInitialRoute`](/javadoc/io/flutter/view/FlutterView.html#setInitialRoute-java.lang.String-)
|
||
/// will set this value. The value must be set sufficiently early, i.e. before
|
||
/// the [runApp] call is executed in Dart, for this to have any effect on the
|
||
/// framework. The `createFlutterView` method in your `FlutterActivity`
|
||
/// subclass is a suitable time to set the value. The application's
|
||
/// `AndroidManifest.xml` file must also be updated to have a suitable
|
||
/// [`<intent-filter>`](https://developer.android.com/guide/topics/manifest/intent-filter-element.html).
|
||
///
|
||
/// ## iOS
|
||
///
|
||
/// On iOS, calling
|
||
/// [`FlutterViewController.setInitialRoute`](/objcdoc/Classes/FlutterViewController.html#/c:objc%28cs%29FlutterViewController%28im%29setInitialRoute:)
|
||
/// will set this value. The value must be set sufficiently early, i.e. before
|
||
/// the [runApp] call is executed in Dart, for this to have any effect on the
|
||
/// framework. The `application:didFinishLaunchingWithOptions:` method is a
|
||
/// suitable time to set this value.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [Navigator], a widget that handles routing.
|
||
/// * [SystemChannels.navigation], which handles subsequent navigation
|
||
/// requests from the embedder.
|
||
String get defaultRouteName => _defaultRouteName();
|
||
String _defaultRouteName() native 'Window_defaultRouteName';
|
||
|
||
/// Requests that, at the next appropriate opportunity, the [onBeginFrame]
|
||
/// and [onDrawFrame] callbacks be invoked.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [SchedulerBinding], the Flutter framework class which manages the
|
||
/// scheduling of frames.
|
||
void scheduleFrame() native 'Window_scheduleFrame';
|
||
|
||
/// Updates the application's rendering on the GPU with the newly provided
|
||
/// [Scene]. This function must be called within the scope of the
|
||
/// [onBeginFrame] or [onDrawFrame] callbacks being invoked. If this function
|
||
/// is called a second time during a single [onBeginFrame]/[onDrawFrame]
|
||
/// callback sequence or called outside the scope of those callbacks, the call
|
||
/// will be ignored.
|
||
///
|
||
/// To record graphical operations, first create a [PictureRecorder], then
|
||
/// construct a [Canvas], passing that [PictureRecorder] to its constructor.
|
||
/// After issuing all the graphical operations, call the
|
||
/// [PictureRecorder.endRecording] function on the [PictureRecorder] to obtain
|
||
/// the final [Picture] that represents the issued graphical operations.
|
||
///
|
||
/// Next, create a [SceneBuilder], and add the [Picture] to it using
|
||
/// [SceneBuilder.addPicture]. With the [SceneBuilder.build] method you can
|
||
/// then obtain a [Scene] object, which you can display to the user via this
|
||
/// [render] function.
|
||
///
|
||
/// See also:
|
||
///
|
||
/// * [SchedulerBinding], the Flutter framework class which manages the
|
||
/// scheduling of frames.
|
||
/// * [RendererBinding], the Flutter framework class which manages layout and
|
||
/// painting.
|
||
void render(Scene scene) native 'Window_render';
|
||
|
||
/// Whether the user has requested that [updateSemantics] be called when
|
||
/// the semantic contents of window changes.
|
||
///
|
||
/// The [onSemanticsEnabledChanged] callback is called whenever this value
|
||
/// changes.
|
||
bool get semanticsEnabled => _semanticsEnabled;
|
||
bool _semanticsEnabled = false;
|
||
|
||
/// A callback that is invoked when the value of [semanticsEnabled] changes.
|
||
///
|
||
/// The framework invokes this callback in the same zone in which the
|
||
/// callback was set.
|
||
VoidCallback get onSemanticsEnabledChanged => _onSemanticsEnabledChanged;
|
||
VoidCallback _onSemanticsEnabledChanged;
|
||
Zone _onSemanticsEnabledChangedZone;
|
||
set onSemanticsEnabledChanged(VoidCallback callback) {
|
||
_onSemanticsEnabledChanged = callback;
|
||
_onSemanticsEnabledChangedZone = Zone.current;
|
||
}
|
||
|
||
/// A callback that is invoked whenever the user requests an action to be
|
||
/// performed.
|
||
///
|
||
/// This callback is used when the user expresses the action they wish to
|
||
/// perform based on the semantics supplied by [updateSemantics].
|
||
///
|
||
/// The framework invokes this callback in the same zone in which the
|
||
/// callback was set.
|
||
SemanticsActionCallback get onSemanticsAction => _onSemanticsAction;
|
||
SemanticsActionCallback _onSemanticsAction;
|
||
Zone _onSemanticsActionZone;
|
||
set onSemanticsAction(SemanticsActionCallback callback) {
|
||
_onSemanticsAction = callback;
|
||
_onSemanticsActionZone = Zone.current;
|
||
}
|
||
|
||
/// Additional accessibility features that may be enabled by the platform.
|
||
AccessibilityFeatures get accessibilityFeatures => _accessibilityFeatures;
|
||
AccessibilityFeatures _accessibilityFeatures;
|
||
|
||
/// A callback that is invoked when the value of [accessibilityFeatures] changes.
|
||
///
|
||
/// The framework invokes this callback in the same zone in which the
|
||
/// callback was set.
|
||
VoidCallback get onAccessibilityFeaturesChanged => _onAccessibilityFeaturesChanged;
|
||
VoidCallback _onAccessibilityFeaturesChanged;
|
||
Zone _onAccessibilityFlagsChangedZone;
|
||
set onAccessibilityFeaturesChanged(VoidCallback callback) {
|
||
_onAccessibilityFeaturesChanged = callback;
|
||
_onAccessibilityFlagsChangedZone = Zone.current;
|
||
}
|
||
|
||
/// Change the retained semantics data about this window.
|
||
///
|
||
/// If [semanticsEnabled] is true, the user has requested that this function
|
||
/// be called whenever the semantic content of this window changes.
|
||
///
|
||
/// In either case, this function disposes the given update, which means the
|
||
/// semantics update cannot be used further.
|
||
void updateSemantics(SemanticsUpdate update) native 'Window_updateSemantics';
|
||
|
||
/// Set the debug name associated with this window's root isolate.
|
||
///
|
||
/// Normally debug names are automatically generated from the Dart port, entry
|
||
/// point, and source file. For example: `main.dart$main-1234`.
|
||
///
|
||
/// This can be combined with flutter tools `--isolate-filter` flag to debug
|
||
/// specific root isolates. For example: `flutter attach --isolate-filter=[name]`.
|
||
/// Note that this does not rename any child isolates of the root.
|
||
void setIsolateDebugName(String name) native 'Window_setIsolateDebugName';
|
||
|
||
/// Sends a message to a platform-specific plugin.
|
||
///
|
||
/// The `name` parameter determines which plugin receives the message. The
|
||
/// `data` parameter contains the message payload and is typically UTF-8
|
||
/// encoded JSON but can be arbitrary data. If the plugin replies to the
|
||
/// message, `callback` will be called with the response.
|
||
///
|
||
/// The framework invokes [callback] in the same zone in which this method
|
||
/// was called.
|
||
void sendPlatformMessage(String name,
|
||
ByteData data,
|
||
PlatformMessageResponseCallback callback) {
|
||
final String error =
|
||
_sendPlatformMessage(name, _zonedPlatformMessageResponseCallback(callback), data);
|
||
if (error != null)
|
||
throw Exception(error);
|
||
}
|
||
String _sendPlatformMessage(String name,
|
||
PlatformMessageResponseCallback callback,
|
||
ByteData data) native 'Window_sendPlatformMessage';
|
||
|
||
/// Called whenever this window receives a message from a platform-specific
|
||
/// plugin.
|
||
///
|
||
/// The `name` parameter determines which plugin sent the message. The `data`
|
||
/// parameter is the payload and is typically UTF-8 encoded JSON but can be
|
||
/// arbitrary data.
|
||
///
|
||
/// Message handlers must call the function given in the `callback` parameter.
|
||
/// If the handler does not need to respond, the handler should pass null to
|
||
/// the callback.
|
||
///
|
||
/// The framework invokes this callback in the same zone in which the
|
||
/// callback was set.
|
||
PlatformMessageCallback get onPlatformMessage => _onPlatformMessage;
|
||
PlatformMessageCallback _onPlatformMessage;
|
||
Zone _onPlatformMessageZone;
|
||
set onPlatformMessage(PlatformMessageCallback callback) {
|
||
_onPlatformMessage = callback;
|
||
_onPlatformMessageZone = Zone.current;
|
||
}
|
||
|
||
/// Called by [_dispatchPlatformMessage].
|
||
void _respondToPlatformMessage(int responseId, ByteData data)
|
||
native 'Window_respondToPlatformMessage';
|
||
|
||
/// Wraps the given [callback] in another callback that ensures that the
|
||
/// original callback is called in the zone it was registered in.
|
||
static PlatformMessageResponseCallback _zonedPlatformMessageResponseCallback(PlatformMessageResponseCallback callback) {
|
||
if (callback == null)
|
||
return null;
|
||
|
||
// Store the zone in which the callback is being registered.
|
||
final Zone registrationZone = Zone.current;
|
||
|
||
return (ByteData data) {
|
||
registrationZone.runUnaryGuarded(callback, data);
|
||
};
|
||
}
|
||
|
||
|
||
/// The embedder can specify data that the isolate can request synchronously
|
||
/// on launch. This accessor fetches that data.
|
||
///
|
||
/// This data is persistent for the duration of the Flutter application and is
|
||
/// available even after isolate restarts. Because of this lifecycle, the size
|
||
/// of this data must be kept to a minimum.
|
||
///
|
||
/// For asynchronous communication between the embedder and isolate, a
|
||
/// platform channel may be used.
|
||
ByteData getPersistentIsolateData() native 'Window_getPersistentIsolateData';
|
||
}
|
||
|
||
/// Additional accessibility features that may be enabled by the platform.
|
||
///
|
||
/// It is not possible to enable these settings from Flutter, instead they are
|
||
/// used by the platform to indicate that additional accessibility features are
|
||
/// enabled.
|
||
//
|
||
// When changes are made to this class, the equivalent APIs in each of the
|
||
// embedders *must* be updated.
|
||
class AccessibilityFeatures {
|
||
const AccessibilityFeatures._(this._index);
|
||
|
||
static const int _kAccessibleNavigation = 1 << 0;
|
||
static const int _kInvertColorsIndex = 1 << 1;
|
||
static const int _kDisableAnimationsIndex = 1 << 2;
|
||
static const int _kBoldTextIndex = 1 << 3;
|
||
static const int _kReduceMotionIndex = 1 << 4;
|
||
|
||
// A bitfield which represents each enabled feature.
|
||
final int _index;
|
||
|
||
/// Whether there is a running accessibility service which is changing the
|
||
/// interaction model of the device.
|
||
///
|
||
/// For example, TalkBack on Android and VoiceOver on iOS enable this flag.
|
||
bool get accessibleNavigation => _kAccessibleNavigation & _index != 0;
|
||
|
||
/// The platform is inverting the colors of the application.
|
||
bool get invertColors => _kInvertColorsIndex & _index != 0;
|
||
|
||
/// The platform is requesting that animations be disabled or simplified.
|
||
bool get disableAnimations => _kDisableAnimationsIndex & _index != 0;
|
||
|
||
/// The platform is requesting that text be rendered at a bold font weight.
|
||
///
|
||
/// Only supported on iOS.
|
||
bool get boldText => _kBoldTextIndex & _index != 0;
|
||
|
||
/// The platform is requesting that certain animations be simplified and
|
||
/// parallax effects removed.
|
||
///
|
||
/// Only supported on iOS.
|
||
bool get reduceMotion => _kReduceMotionIndex & _index != 0;
|
||
|
||
@override
|
||
String toString() {
|
||
final List<String> features = <String>[];
|
||
if (accessibleNavigation)
|
||
features.add('accessibleNavigation');
|
||
if (invertColors)
|
||
features.add('invertColors');
|
||
if (disableAnimations)
|
||
features.add('disableAnimations');
|
||
if (boldText)
|
||
features.add('boldText');
|
||
if (reduceMotion)
|
||
features.add('reduceMotion');
|
||
return 'AccessibilityFeatures$features';
|
||
}
|
||
|
||
@override
|
||
bool operator ==(dynamic other) {
|
||
if (other.runtimeType != runtimeType)
|
||
return false;
|
||
final AccessibilityFeatures typedOther = other;
|
||
return _index == typedOther._index;
|
||
}
|
||
|
||
@override
|
||
int get hashCode => _index.hashCode;
|
||
}
|
||
|
||
/// Describes the contrast of a theme or color palette.
|
||
enum Brightness {
|
||
/// The color is dark and will require a light text color to achieve readable
|
||
/// contrast.
|
||
///
|
||
/// For example, the color might be dark grey, requiring white text.
|
||
dark,
|
||
|
||
/// The color is light and will require a dark text color to achieve readable
|
||
/// contrast.
|
||
///
|
||
/// For example, the color might be bright white, requiring black text.
|
||
light,
|
||
}
|
||
|
||
/// The [Window] singleton.
|
||
///
|
||
/// Please try to avoid statically referencing this and instead use a
|
||
/// binding for dependency resolution such as `WidgetsBinding.instance.window`.
|
||
///
|
||
/// Static access of this "window" object means that Flutter has few, if any
|
||
/// options to fake or mock the given object in tests. Even in cases where Dart
|
||
/// offers special language constructs to forcefully shadow such properties,
|
||
/// those mechanisms would only be reasonable for tests and they would not be
|
||
/// reasonable for a future of Flutter where we legitimately want to select an
|
||
/// appropriate implementation at runtime.
|
||
///
|
||
/// The only place that `WidgetsBinding.instance.window` is inappropriate is if
|
||
/// a `Window` is required before invoking `runApp()`. In that case, it is
|
||
/// acceptable (though unfortunate) to use this object statically.
|
||
final Window window = Window._();
|