Make Material/CupertinoLocalizations non-nullable (#68807)
This commit is contained in:
parent
ce3ce20b14
commit
6cb6eef615
@ -209,14 +209,7 @@ class CupertinoTabBar extends StatelessWidget implements PreferredSizeWidget {
|
|||||||
|
|
||||||
List<Widget> _buildTabItems(BuildContext context) {
|
List<Widget> _buildTabItems(BuildContext context) {
|
||||||
final List<Widget> result = <Widget>[];
|
final List<Widget> result = <Widget>[];
|
||||||
final CupertinoLocalizations? localizations = CupertinoLocalizations.of(context);
|
final CupertinoLocalizations localizations = CupertinoLocalizations.of(context);
|
||||||
assert(
|
|
||||||
localizations != null,
|
|
||||||
'CupertinoTabBar requires a Localizations parent in order to provide an '
|
|
||||||
'appropriate Semantics hint for tab indexing. A CupertinoApp will '
|
|
||||||
'provide the DefaultCupertinoLocalizations, or you can instantiate your '
|
|
||||||
'own Localizations.'
|
|
||||||
);
|
|
||||||
|
|
||||||
for (int index = 0; index < items.length; index += 1) {
|
for (int index = 0; index < items.length; index += 1) {
|
||||||
final bool active = index == currentIndex;
|
final bool active = index == currentIndex;
|
||||||
@ -226,7 +219,7 @@ class CupertinoTabBar extends StatelessWidget implements PreferredSizeWidget {
|
|||||||
Expanded(
|
Expanded(
|
||||||
child: Semantics(
|
child: Semantics(
|
||||||
selected: active,
|
selected: active,
|
||||||
hint: localizations!.tabSemanticsLabel(
|
hint: localizations.tabSemanticsLabel(
|
||||||
tabIndex: index + 1,
|
tabIndex: index + 1,
|
||||||
tabCount: items.length,
|
tabCount: items.length,
|
||||||
),
|
),
|
||||||
|
@ -623,7 +623,7 @@ class _CupertinoDatePickerDateTimeState extends State<CupertinoDatePicker> {
|
|||||||
super.didChangeDependencies();
|
super.didChangeDependencies();
|
||||||
|
|
||||||
textDirectionFactor = Directionality.of(context) == TextDirection.ltr ? 1 : -1;
|
textDirectionFactor = Directionality.of(context) == TextDirection.ltr ? 1 : -1;
|
||||||
localizations = CupertinoLocalizations.of(context)!;
|
localizations = CupertinoLocalizations.of(context);
|
||||||
|
|
||||||
alignCenterLeft = textDirectionFactor == 1 ? Alignment.centerLeft : Alignment.centerRight;
|
alignCenterLeft = textDirectionFactor == 1 ? Alignment.centerLeft : Alignment.centerRight;
|
||||||
alignCenterRight = textDirectionFactor == 1 ? Alignment.centerRight : Alignment.centerLeft;
|
alignCenterRight = textDirectionFactor == 1 ? Alignment.centerRight : Alignment.centerLeft;
|
||||||
@ -1113,7 +1113,7 @@ class _CupertinoDatePickerDateState extends State<CupertinoDatePicker> {
|
|||||||
super.didChangeDependencies();
|
super.didChangeDependencies();
|
||||||
|
|
||||||
textDirectionFactor = Directionality.of(context) == TextDirection.ltr ? 1 : -1;
|
textDirectionFactor = Directionality.of(context) == TextDirection.ltr ? 1 : -1;
|
||||||
localizations = CupertinoLocalizations.of(context)!;
|
localizations = CupertinoLocalizations.of(context);
|
||||||
|
|
||||||
alignCenterLeft = textDirectionFactor == 1 ? Alignment.centerLeft : Alignment.centerRight;
|
alignCenterLeft = textDirectionFactor == 1 ? Alignment.centerLeft : Alignment.centerRight;
|
||||||
alignCenterRight = textDirectionFactor == 1 ? Alignment.centerRight : Alignment.centerLeft;
|
alignCenterRight = textDirectionFactor == 1 ? Alignment.centerRight : Alignment.centerLeft;
|
||||||
@ -1621,7 +1621,7 @@ class _CupertinoTimerPickerState extends State<CupertinoTimerPicker> {
|
|||||||
super.didChangeDependencies();
|
super.didChangeDependencies();
|
||||||
|
|
||||||
textDirection = Directionality.of(context)!;
|
textDirection = Directionality.of(context)!;
|
||||||
localizations = CupertinoLocalizations.of(context)!;
|
localizations = CupertinoLocalizations.of(context);
|
||||||
|
|
||||||
_measureLabelMetrics();
|
_measureLabelMetrics();
|
||||||
}
|
}
|
||||||
|
46
packages/flutter/lib/src/cupertino/debug.dart
Normal file
46
packages/flutter/lib/src/cupertino/debug.dart
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
// Copyright 2014 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.
|
||||||
|
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
|
import 'localizations.dart';
|
||||||
|
|
||||||
|
/// Asserts that the given context has a [Localizations] ancestor that contains
|
||||||
|
/// a [CupertinoLocalizations] delegate.
|
||||||
|
///
|
||||||
|
/// To call this function, use the following pattern, typically in the
|
||||||
|
/// relevant Widget's build method:
|
||||||
|
///
|
||||||
|
/// ```dart
|
||||||
|
/// assert(debugCheckHasCupertinoLocalizations(context));
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Does nothing if asserts are disabled. Always returns true.
|
||||||
|
bool debugCheckHasCupertinoLocalizations(BuildContext context) {
|
||||||
|
assert(() {
|
||||||
|
if (Localizations.of<CupertinoLocalizations>(context, CupertinoLocalizations) == null) {
|
||||||
|
throw FlutterError.fromParts(<DiagnosticsNode>[
|
||||||
|
ErrorSummary('No CupertinoLocalizations found.'),
|
||||||
|
ErrorDescription(
|
||||||
|
'${context.widget.runtimeType} widgets require CupertinoLocalizations '
|
||||||
|
'to be provided by a Localizations widget ancestor.'
|
||||||
|
),
|
||||||
|
ErrorDescription(
|
||||||
|
'The cupertino library uses Localizations to generate messages, '
|
||||||
|
'labels, and abbreviations.'
|
||||||
|
),
|
||||||
|
ErrorHint(
|
||||||
|
'To introduce a CupertinoLocalizations, either use a '
|
||||||
|
'CupertinoApp at the root of your application to include them '
|
||||||
|
'automatically, or add a Localization widget with a '
|
||||||
|
'CupertinoLocalizations delegate.'
|
||||||
|
),
|
||||||
|
...context.describeMissingAncestor(expectedAncestorType: CupertinoLocalizations)
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}());
|
||||||
|
return true;
|
||||||
|
}
|
@ -226,7 +226,7 @@ class CupertinoAlertDialog extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final CupertinoLocalizations localizations = CupertinoLocalizations.of(context)!;
|
final CupertinoLocalizations localizations = CupertinoLocalizations.of(context);
|
||||||
final bool isInAccessibilityMode = _isInAccessibilityMode(context);
|
final bool isInAccessibilityMode = _isInAccessibilityMode(context);
|
||||||
final double textScaleFactor = MediaQuery.of(context)!.textScaleFactor;
|
final double textScaleFactor = MediaQuery.of(context)!.textScaleFactor;
|
||||||
return CupertinoUserInterfaceLevel(
|
return CupertinoUserInterfaceLevel(
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
import 'date_picker.dart';
|
import 'debug.dart';
|
||||||
|
|
||||||
/// Determines the order of the columns inside [CupertinoDatePicker] in
|
/// Determines the order of the columns inside [CupertinoDatePicker] in
|
||||||
/// time and date time mode.
|
/// time and date time mode.
|
||||||
@ -242,8 +242,11 @@ abstract class CupertinoLocalizations {
|
|||||||
/// The `CupertinoLocalizations` from the closest [Localizations] instance
|
/// The `CupertinoLocalizations` from the closest [Localizations] instance
|
||||||
/// that encloses the given context.
|
/// that encloses the given context.
|
||||||
///
|
///
|
||||||
|
/// If no [CupertinoLocalizations] are available in the given `context`, this
|
||||||
|
/// method throws an exception.
|
||||||
|
///
|
||||||
/// This method is just a convenient shorthand for:
|
/// This method is just a convenient shorthand for:
|
||||||
/// `Localizations.of<CupertinoLocalizations>(context, CupertinoLocalizations)`.
|
/// `Localizations.of<CupertinoLocalizations>(context, CupertinoLocalizations)!`.
|
||||||
///
|
///
|
||||||
/// References to the localized resources defined by this class are typically
|
/// References to the localized resources defined by this class are typically
|
||||||
/// written in terms of this method. For example:
|
/// written in terms of this method. For example:
|
||||||
@ -251,8 +254,9 @@ abstract class CupertinoLocalizations {
|
|||||||
/// ```dart
|
/// ```dart
|
||||||
/// CupertinoLocalizations.of(context).anteMeridiemAbbreviation;
|
/// CupertinoLocalizations.of(context).anteMeridiemAbbreviation;
|
||||||
/// ```
|
/// ```
|
||||||
static CupertinoLocalizations? of(BuildContext context) {
|
static CupertinoLocalizations of(BuildContext context) {
|
||||||
return Localizations.of<CupertinoLocalizations>(context, CupertinoLocalizations);
|
debugCheckHasCupertinoLocalizations(context);
|
||||||
|
return Localizations.of<CupertinoLocalizations>(context, CupertinoLocalizations)!;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1146,7 +1146,7 @@ Future<T?> showCupertinoDialog<T>({
|
|||||||
return showGeneralDialog(
|
return showGeneralDialog(
|
||||||
context: context,
|
context: context,
|
||||||
barrierDismissible: barrierDismissible,
|
barrierDismissible: barrierDismissible,
|
||||||
barrierLabel: CupertinoLocalizations.of(context)!.modalBarrierDismissLabel,
|
barrierLabel: CupertinoLocalizations.of(context).modalBarrierDismissLabel,
|
||||||
barrierColor: CupertinoDynamicColor.resolve(_kModalBarrierColor, context)!,
|
barrierColor: CupertinoDynamicColor.resolve(_kModalBarrierColor, context)!,
|
||||||
// This transition duration was eyeballed comparing with iOS
|
// This transition duration was eyeballed comparing with iOS
|
||||||
transitionDuration: const Duration(milliseconds: 250),
|
transitionDuration: const Duration(milliseconds: 250),
|
||||||
|
@ -152,7 +152,7 @@ class _CupertinoTextSelectionToolbarWrapperState extends State<_CupertinoTextSel
|
|||||||
}
|
}
|
||||||
|
|
||||||
final List<Widget> items = <Widget>[];
|
final List<Widget> items = <Widget>[];
|
||||||
final CupertinoLocalizations? localizations = CupertinoLocalizations.of(context);
|
final CupertinoLocalizations localizations = CupertinoLocalizations.of(context);
|
||||||
final EdgeInsets arrowPadding = widget.isArrowPointingDown
|
final EdgeInsets arrowPadding = widget.isArrowPointingDown
|
||||||
? EdgeInsets.only(bottom: _kToolbarArrowSize.height)
|
? EdgeInsets.only(bottom: _kToolbarArrowSize.height)
|
||||||
: EdgeInsets.only(top: _kToolbarArrowSize.height);
|
: EdgeInsets.only(top: _kToolbarArrowSize.height);
|
||||||
@ -183,17 +183,17 @@ class _CupertinoTextSelectionToolbarWrapperState extends State<_CupertinoTextSel
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (widget.handleCut != null) {
|
if (widget.handleCut != null) {
|
||||||
addToolbarButton(localizations!.cutButtonLabel, widget.handleCut!);
|
addToolbarButton(localizations.cutButtonLabel, widget.handleCut!);
|
||||||
}
|
}
|
||||||
if (widget.handleCopy != null) {
|
if (widget.handleCopy != null) {
|
||||||
addToolbarButton(localizations!.copyButtonLabel, widget.handleCopy!);
|
addToolbarButton(localizations.copyButtonLabel, widget.handleCopy!);
|
||||||
}
|
}
|
||||||
if (widget.handlePaste != null
|
if (widget.handlePaste != null
|
||||||
&& _clipboardStatus.value == ClipboardStatus.pasteable) {
|
&& _clipboardStatus.value == ClipboardStatus.pasteable) {
|
||||||
addToolbarButton(localizations!.pasteButtonLabel, widget.handlePaste!);
|
addToolbarButton(localizations.pasteButtonLabel, widget.handlePaste!);
|
||||||
}
|
}
|
||||||
if (widget.handleSelectAll != null) {
|
if (widget.handleSelectAll != null) {
|
||||||
addToolbarButton(localizations!.selectAllButtonLabel, widget.handleSelectAll!);
|
addToolbarButton(localizations.selectAllButtonLabel, widget.handleSelectAll!);
|
||||||
}
|
}
|
||||||
|
|
||||||
return CupertinoTextSelectionToolbar._(
|
return CupertinoTextSelectionToolbar._(
|
||||||
|
@ -201,7 +201,7 @@ class AboutListTile extends StatelessWidget {
|
|||||||
assert(debugCheckHasMaterialLocalizations(context));
|
assert(debugCheckHasMaterialLocalizations(context));
|
||||||
return ListTile(
|
return ListTile(
|
||||||
leading: icon,
|
leading: icon,
|
||||||
title: child ?? Text(MaterialLocalizations.of(context)!.aboutListTileTitle(
|
title: child ?? Text(MaterialLocalizations.of(context).aboutListTileTitle(
|
||||||
applicationName ?? _defaultApplicationName(context),
|
applicationName ?? _defaultApplicationName(context),
|
||||||
)),
|
)),
|
||||||
dense: dense,
|
dense: dense,
|
||||||
@ -405,7 +405,7 @@ class AboutDialog extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
actions: <Widget>[
|
actions: <Widget>[
|
||||||
TextButton(
|
TextButton(
|
||||||
child: Text(MaterialLocalizations.of(context)!.viewLicensesButtonLabel),
|
child: Text(MaterialLocalizations.of(context).viewLicensesButtonLabel),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
showLicensePage(
|
showLicensePage(
|
||||||
context: context,
|
context: context,
|
||||||
@ -417,7 +417,7 @@ class AboutDialog extends StatelessWidget {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
TextButton(
|
TextButton(
|
||||||
child: Text(MaterialLocalizations.of(context)!.closeButtonLabel),
|
child: Text(MaterialLocalizations.of(context).closeButtonLabel),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
},
|
},
|
||||||
@ -493,7 +493,7 @@ class _LicensePageState extends State<LicensePage> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return _MasterDetailFlow(
|
return _MasterDetailFlow(
|
||||||
detailPageFABlessGutterWidth: _getGutterSize(context),
|
detailPageFABlessGutterWidth: _getGutterSize(context),
|
||||||
title: Text(MaterialLocalizations.of(context)!.licensesPageTitle),
|
title: Text(MaterialLocalizations.of(context).licensesPageTitle),
|
||||||
detailPageBuilder: _packageLicensePage,
|
detailPageBuilder: _packageLicensePage,
|
||||||
masterViewBuilder: _packagesView,
|
masterViewBuilder: _packagesView,
|
||||||
);
|
);
|
||||||
@ -720,7 +720,7 @@ class _PackageListTile extends StatelessWidget {
|
|||||||
color: isSelected ? Theme.of(context)!.highlightColor : Theme.of(context)!.cardColor,
|
color: isSelected ? Theme.of(context)!.highlightColor : Theme.of(context)!.cardColor,
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
title: Text(packageName),
|
title: Text(packageName),
|
||||||
subtitle: Text(MaterialLocalizations.of(context)!.licensesPackageDetailText(numberLicenses)),
|
subtitle: Text(MaterialLocalizations.of(context).licensesPackageDetailText(numberLicenses)),
|
||||||
selected: isSelected,
|
selected: isSelected,
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
),
|
),
|
||||||
@ -890,7 +890,7 @@ class _PackageLicensePageState extends State<_PackageLicensePage> {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
assert(debugCheckHasMaterialLocalizations(context));
|
assert(debugCheckHasMaterialLocalizations(context));
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final ThemeData? theme = Theme.of(context);
|
final ThemeData? theme = Theme.of(context);
|
||||||
final String title = widget.packageName;
|
final String title = widget.packageName;
|
||||||
final String subtitle = localizations.licensesPackageDetailText(widget.licenseEntries.length);
|
final String subtitle = localizations.licensesPackageDetailText(widget.licenseEntries.length);
|
||||||
|
@ -543,7 +543,7 @@ class _AppBarState extends State<AppBar> {
|
|||||||
leading = IconButton(
|
leading = IconButton(
|
||||||
icon: const Icon(Icons.menu),
|
icon: const Icon(Icons.menu),
|
||||||
onPressed: _handleDrawerButton,
|
onPressed: _handleDrawerButton,
|
||||||
tooltip: MaterialLocalizations.of(context)!.openAppDrawerTooltip,
|
tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
if (!hasEndDrawer && canPop)
|
if (!hasEndDrawer && canPop)
|
||||||
@ -616,7 +616,7 @@ class _AppBarState extends State<AppBar> {
|
|||||||
actions = IconButton(
|
actions = IconButton(
|
||||||
icon: const Icon(Icons.menu),
|
icon: const Icon(Icons.menu),
|
||||||
onPressed: _handleDrawerButtonEnd,
|
onPressed: _handleDrawerButtonEnd,
|
||||||
tooltip: MaterialLocalizations.of(context)!.openAppDrawerTooltip,
|
tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ class BackButton extends StatelessWidget {
|
|||||||
return IconButton(
|
return IconButton(
|
||||||
icon: const BackButtonIcon(),
|
icon: const BackButtonIcon(),
|
||||||
color: color,
|
color: color,
|
||||||
tooltip: MaterialLocalizations.of(context)!.backButtonTooltip,
|
tooltip: MaterialLocalizations.of(context).backButtonTooltip,
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
if (onPressed != null) {
|
if (onPressed != null) {
|
||||||
onPressed!();
|
onPressed!();
|
||||||
@ -152,7 +152,7 @@ class CloseButton extends StatelessWidget {
|
|||||||
return IconButton(
|
return IconButton(
|
||||||
icon: const Icon(Icons.close),
|
icon: const Icon(Icons.close),
|
||||||
color: color,
|
color: color,
|
||||||
tooltip: MaterialLocalizations.of(context)!.closeButtonTooltip,
|
tooltip: MaterialLocalizations.of(context).closeButtonTooltip,
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
if (onPressed != null) {
|
if (onPressed != null) {
|
||||||
onPressed!();
|
onPressed!();
|
||||||
|
@ -823,7 +823,7 @@ class _BottomNavigationBarState extends State<BottomNavigationBar> with TickerPr
|
|||||||
}
|
}
|
||||||
|
|
||||||
List<Widget> _createTiles() {
|
List<Widget> _createTiles() {
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
assert(localizations != null);
|
assert(localizations != null);
|
||||||
|
|
||||||
final ThemeData themeData = Theme.of(context)!;
|
final ThemeData themeData = Theme.of(context)!;
|
||||||
|
@ -370,7 +370,7 @@ class _ModalBottomSheetState<T> extends State<_ModalBottomSheet<T>> {
|
|||||||
assert(debugCheckHasMediaQuery(context));
|
assert(debugCheckHasMediaQuery(context));
|
||||||
assert(debugCheckHasMaterialLocalizations(context));
|
assert(debugCheckHasMaterialLocalizations(context));
|
||||||
final MediaQueryData? mediaQuery = MediaQuery.of(context);
|
final MediaQueryData? mediaQuery = MediaQuery.of(context);
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final String routeLabel = _getRouteLabel(localizations);
|
final String routeLabel = _getRouteLabel(localizations);
|
||||||
|
|
||||||
return AnimatedBuilder(
|
return AnimatedBuilder(
|
||||||
@ -671,7 +671,7 @@ Future<T?> showModalBottomSheet<T>({
|
|||||||
builder: builder,
|
builder: builder,
|
||||||
theme: Theme.of(context, shadowThemeOnly: true),
|
theme: Theme.of(context, shadowThemeOnly: true),
|
||||||
isScrollControlled: isScrollControlled,
|
isScrollControlled: isScrollControlled,
|
||||||
barrierLabel: MaterialLocalizations.of(context)!.modalBarrierDismissLabel,
|
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
|
||||||
backgroundColor: backgroundColor,
|
backgroundColor: backgroundColor,
|
||||||
elevation: elevation,
|
elevation: elevation,
|
||||||
shape: shape,
|
shape: shape,
|
||||||
|
@ -1789,7 +1789,7 @@ class _RawChipState extends State<RawChip> with TickerProviderStateMixin<RawChip
|
|||||||
container: true,
|
container: true,
|
||||||
button: true,
|
button: true,
|
||||||
child: _wrapWithTooltip(
|
child: _wrapWithTooltip(
|
||||||
widget.deleteButtonTooltipMessage ?? MaterialLocalizations.of(context)?.deleteButtonTooltip,
|
widget.deleteButtonTooltipMessage ?? MaterialLocalizations.of(context).deleteButtonTooltip,
|
||||||
widget.onDeleted,
|
widget.onDeleted,
|
||||||
GestureDetector(
|
GestureDetector(
|
||||||
key: deleteIconKey,
|
key: deleteIconKey,
|
||||||
|
@ -463,7 +463,7 @@ class AlertDialog extends StatelessWidget {
|
|||||||
case TargetPlatform.fuchsia:
|
case TargetPlatform.fuchsia:
|
||||||
case TargetPlatform.linux:
|
case TargetPlatform.linux:
|
||||||
case TargetPlatform.windows:
|
case TargetPlatform.windows:
|
||||||
label ??= MaterialLocalizations.of(context)?.alertDialogLabel;
|
label ??= MaterialLocalizations.of(context).alertDialogLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The paddingScaleFactor is used to adjust the padding of Dialog's
|
// The paddingScaleFactor is used to adjust the padding of Dialog's
|
||||||
@ -814,13 +814,12 @@ class SimpleDialog extends StatelessWidget {
|
|||||||
switch (theme.platform) {
|
switch (theme.platform) {
|
||||||
case TargetPlatform.macOS:
|
case TargetPlatform.macOS:
|
||||||
case TargetPlatform.iOS:
|
case TargetPlatform.iOS:
|
||||||
label = semanticLabel;
|
|
||||||
break;
|
break;
|
||||||
case TargetPlatform.android:
|
case TargetPlatform.android:
|
||||||
case TargetPlatform.fuchsia:
|
case TargetPlatform.fuchsia:
|
||||||
case TargetPlatform.linux:
|
case TargetPlatform.linux:
|
||||||
case TargetPlatform.windows:
|
case TargetPlatform.windows:
|
||||||
label = semanticLabel ?? MaterialLocalizations.of(context)?.dialogLabel;
|
label = semanticLabel ?? MaterialLocalizations.of(context).dialogLabel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -997,7 +996,7 @@ Future<T?> showDialog<T>({
|
|||||||
return dialog;
|
return dialog;
|
||||||
},
|
},
|
||||||
barrierDismissible: barrierDismissible,
|
barrierDismissible: barrierDismissible,
|
||||||
barrierLabel: MaterialLocalizations.of(context)!.modalBarrierDismissLabel,
|
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
|
||||||
barrierColor: barrierColor ?? Colors.black54,
|
barrierColor: barrierColor ?? Colors.black54,
|
||||||
transitionDuration: const Duration(milliseconds: 150),
|
transitionDuration: const Duration(milliseconds: 150),
|
||||||
transitionBuilder: _buildMaterialDialogTransitions,
|
transitionBuilder: _buildMaterialDialogTransitions,
|
||||||
|
@ -180,13 +180,12 @@ class Drawer extends StatelessWidget {
|
|||||||
switch (Theme.of(context)!.platform) {
|
switch (Theme.of(context)!.platform) {
|
||||||
case TargetPlatform.iOS:
|
case TargetPlatform.iOS:
|
||||||
case TargetPlatform.macOS:
|
case TargetPlatform.macOS:
|
||||||
label = semanticLabel;
|
|
||||||
break;
|
break;
|
||||||
case TargetPlatform.android:
|
case TargetPlatform.android:
|
||||||
case TargetPlatform.fuchsia:
|
case TargetPlatform.fuchsia:
|
||||||
case TargetPlatform.linux:
|
case TargetPlatform.linux:
|
||||||
case TargetPlatform.windows:
|
case TargetPlatform.windows:
|
||||||
label = semanticLabel ?? MaterialLocalizations.of(context)?.drawerLabel;
|
label = semanticLabel ?? MaterialLocalizations.of(context).drawerLabel;
|
||||||
}
|
}
|
||||||
return Semantics(
|
return Semantics(
|
||||||
scopesRoute: true,
|
scopesRoute: true,
|
||||||
@ -566,7 +565,7 @@ class DrawerControllerState extends State<DrawerController> with SingleTickerPro
|
|||||||
child: GestureDetector(
|
child: GestureDetector(
|
||||||
onTap: close,
|
onTap: close,
|
||||||
child: Semantics(
|
child: Semantics(
|
||||||
label: MaterialLocalizations.of(context)?.modalBarrierDismissLabel,
|
label: MaterialLocalizations.of(context).modalBarrierDismissLabel,
|
||||||
child: MouseRegion(
|
child: MouseRegion(
|
||||||
opaque: true,
|
opaque: true,
|
||||||
child: Container( // The drawer's "scrim"
|
child: Container( // The drawer's "scrim"
|
||||||
|
@ -253,7 +253,7 @@ class _DropdownMenuState<T> extends State<_DropdownMenu<T>> {
|
|||||||
// When the menu is dismissed we just fade the entire thing out
|
// When the menu is dismissed we just fade the entire thing out
|
||||||
// in the first 0.25s.
|
// in the first 0.25s.
|
||||||
assert(debugCheckHasMaterialLocalizations(context));
|
assert(debugCheckHasMaterialLocalizations(context));
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final _DropdownRoute<T> route = widget.route;
|
final _DropdownRoute<T> route = widget.route;
|
||||||
final List<Widget> children = <Widget>[
|
final List<Widget> children = <Widget>[
|
||||||
for (int itemIndex = 0; itemIndex < route.items.length; ++itemIndex)
|
for (int itemIndex = 0; itemIndex < route.items.length; ++itemIndex)
|
||||||
@ -1216,7 +1216,7 @@ class _DropdownButtonState<T> extends State<DropdownButton<T>> with WidgetsBindi
|
|||||||
elevation: widget.elevation,
|
elevation: widget.elevation,
|
||||||
theme: Theme.of(context, shadowThemeOnly: true),
|
theme: Theme.of(context, shadowThemeOnly: true),
|
||||||
style: _textStyle!,
|
style: _textStyle!,
|
||||||
barrierLabel: MaterialLocalizations.of(context)!.modalBarrierDismissLabel,
|
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
|
||||||
itemHeight: widget.itemHeight,
|
itemHeight: widget.itemHeight,
|
||||||
dropdownColor: widget.dropdownColor,
|
dropdownColor: widget.dropdownColor,
|
||||||
);
|
);
|
||||||
|
@ -167,7 +167,7 @@ class _ExpandIconState extends State<ExpandIcon> with SingleTickerProviderStateM
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
assert(debugCheckHasMaterial(context));
|
assert(debugCheckHasMaterial(context));
|
||||||
assert(debugCheckHasMaterialLocalizations(context));
|
assert(debugCheckHasMaterialLocalizations(context));
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final String onTapHint = widget.isExpanded ? localizations.expandedIconTapHint : localizations.collapsedIconTapHint;
|
final String onTapHint = widget.isExpanded ? localizations.expandedIconTapHint : localizations.collapsedIconTapHint;
|
||||||
|
|
||||||
return Semantics(
|
return Semantics(
|
||||||
|
@ -496,7 +496,7 @@ class _ExpansionPanelListState extends State<ExpansionPanelList> {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
if (!child.canTapOnHeader) {
|
if (!child.canTapOnHeader) {
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
expandIconContainer = Semantics(
|
expandIconContainer = Semantics(
|
||||||
label: _isChildExpanded(index)? localizations.expandedIconTapHint : localizations.collapsedIconTapHint,
|
label: _isChildExpanded(index)? localizations.expandedIconTapHint : localizations.collapsedIconTapHint,
|
||||||
container: true,
|
container: true,
|
||||||
|
@ -5,8 +5,7 @@
|
|||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
import 'reorderable_list.dart';
|
import 'debug.dart';
|
||||||
import 'text_theme.dart';
|
|
||||||
import 'time.dart';
|
import 'time.dart';
|
||||||
import 'typography.dart';
|
import 'typography.dart';
|
||||||
|
|
||||||
@ -494,8 +493,11 @@ abstract class MaterialLocalizations {
|
|||||||
/// The `MaterialLocalizations` from the closest [Localizations] instance
|
/// The `MaterialLocalizations` from the closest [Localizations] instance
|
||||||
/// that encloses the given context.
|
/// that encloses the given context.
|
||||||
///
|
///
|
||||||
|
/// If no [MaterialLocalizations] are available in the given `context`, this
|
||||||
|
/// method throws an exception.
|
||||||
|
///
|
||||||
/// This method is just a convenient shorthand for:
|
/// This method is just a convenient shorthand for:
|
||||||
/// `Localizations.of<MaterialLocalizations>(context, MaterialLocalizations)`.
|
/// `Localizations.of<MaterialLocalizations>(context, MaterialLocalizations)!`.
|
||||||
///
|
///
|
||||||
/// References to the localized resources defined by this class are typically
|
/// References to the localized resources defined by this class are typically
|
||||||
/// written in terms of this method. For example:
|
/// written in terms of this method. For example:
|
||||||
@ -503,8 +505,9 @@ abstract class MaterialLocalizations {
|
|||||||
/// ```dart
|
/// ```dart
|
||||||
/// tooltip: MaterialLocalizations.of(context).backButtonTooltip,
|
/// tooltip: MaterialLocalizations.of(context).backButtonTooltip,
|
||||||
/// ```
|
/// ```
|
||||||
static MaterialLocalizations? of(BuildContext context) {
|
static MaterialLocalizations of(BuildContext context) {
|
||||||
return Localizations.of<MaterialLocalizations>(context, MaterialLocalizations);
|
debugCheckHasMaterialLocalizations(context);
|
||||||
|
return Localizations.of<MaterialLocalizations>(context, MaterialLocalizations)!;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -433,7 +433,7 @@ class _NavigationRailState extends State<NavigationRail> with TickerProviderStat
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final ThemeData theme = Theme.of(context)!;
|
final ThemeData theme = Theme.of(context)!;
|
||||||
final NavigationRailThemeData navigationRailTheme = NavigationRailTheme.of(context);
|
final NavigationRailThemeData navigationRailTheme = NavigationRailTheme.of(context);
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
|
|
||||||
final Color backgroundColor = widget.backgroundColor ?? navigationRailTheme.backgroundColor ?? theme.colorScheme.surface;
|
final Color backgroundColor = widget.backgroundColor ?? navigationRailTheme.backgroundColor ?? theme.colorScheme.surface;
|
||||||
final double elevation = widget.elevation ?? navigationRailTheme.elevation ?? 0;
|
final double elevation = widget.elevation ?? navigationRailTheme.elevation ?? 0;
|
||||||
|
@ -333,7 +333,7 @@ class PaginatedDataTableState extends State<PaginatedDataTable> {
|
|||||||
// TODO(ianh): This whole build function doesn't handle RTL yet.
|
// TODO(ianh): This whole build function doesn't handle RTL yet.
|
||||||
assert(debugCheckHasMaterialLocalizations(context));
|
assert(debugCheckHasMaterialLocalizations(context));
|
||||||
final ThemeData themeData = Theme.of(context)!;
|
final ThemeData themeData = Theme.of(context)!;
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
// HEADER
|
// HEADER
|
||||||
final List<Widget> headerWidgets = <Widget>[];
|
final List<Widget> headerWidgets = <Widget>[];
|
||||||
double startPadding = 24.0;
|
double startPadding = 24.0;
|
||||||
|
@ -179,7 +179,7 @@ class _CalendarDatePickerState extends State<CalendarDatePicker> {
|
|||||||
assert(debugCheckHasMaterial(context));
|
assert(debugCheckHasMaterial(context));
|
||||||
assert(debugCheckHasMaterialLocalizations(context));
|
assert(debugCheckHasMaterialLocalizations(context));
|
||||||
assert(debugCheckHasDirectionality(context));
|
assert(debugCheckHasDirectionality(context));
|
||||||
_localizations = MaterialLocalizations.of(context)!;
|
_localizations = MaterialLocalizations.of(context);
|
||||||
_textDirection = Directionality.of(context)!;
|
_textDirection = Directionality.of(context)!;
|
||||||
if (!_announcedInitialDate) {
|
if (!_announcedInitialDate) {
|
||||||
_announcedInitialDate = true;
|
_announcedInitialDate = true;
|
||||||
@ -380,7 +380,7 @@ class _DatePickerModeToggleButtonState extends State<_DatePickerModeToggleButton
|
|||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Flexible(
|
Flexible(
|
||||||
child: Semantics(
|
child: Semantics(
|
||||||
label: MaterialLocalizations.of(context)!.selectYearSemanticsLabel,
|
label: MaterialLocalizations.of(context).selectYearSemanticsLabel,
|
||||||
excludeSemantics: true,
|
excludeSemantics: true,
|
||||||
button: true,
|
button: true,
|
||||||
child: Container(
|
child: Container(
|
||||||
@ -524,7 +524,7 @@ class _MonthPickerState extends State<_MonthPicker> {
|
|||||||
@override
|
@override
|
||||||
void didChangeDependencies() {
|
void didChangeDependencies() {
|
||||||
super.didChangeDependencies();
|
super.didChangeDependencies();
|
||||||
_localizations = MaterialLocalizations.of(context)!;
|
_localizations = MaterialLocalizations.of(context);
|
||||||
_textDirection = Directionality.of(context);
|
_textDirection = Directionality.of(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -941,7 +941,7 @@ class _DayPickerState extends State<_DayPicker> {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final ColorScheme colorScheme = Theme.of(context)!.colorScheme;
|
final ColorScheme colorScheme = Theme.of(context)!.colorScheme;
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final TextTheme textTheme = Theme.of(context)!.textTheme;
|
final TextTheme textTheme = Theme.of(context)!.textTheme;
|
||||||
final TextStyle? headerStyle = textTheme.caption?.apply(
|
final TextStyle? headerStyle = textTheme.caption?.apply(
|
||||||
color: colorScheme.onSurface.withOpacity(0.60),
|
color: colorScheme.onSurface.withOpacity(0.60),
|
||||||
|
@ -427,7 +427,7 @@ class _DayHeaders extends StatelessWidget {
|
|||||||
final ThemeData themeData = Theme.of(context)!;
|
final ThemeData themeData = Theme.of(context)!;
|
||||||
final ColorScheme colorScheme = themeData.colorScheme;
|
final ColorScheme colorScheme = themeData.colorScheme;
|
||||||
final TextStyle textStyle = themeData.textTheme.subtitle2!.apply(color: colorScheme.onSurface);
|
final TextStyle textStyle = themeData.textTheme.subtitle2!.apply(color: colorScheme.onSurface);
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final List<Widget> labels = _getDayHeaders(textStyle, localizations);
|
final List<Widget> labels = _getDayHeaders(textStyle, localizations);
|
||||||
|
|
||||||
// Add leading and trailing containers for edges of the custom grid layout.
|
// Add leading and trailing containers for edges of the custom grid layout.
|
||||||
@ -706,7 +706,7 @@ class _MonthItemState extends State<_MonthItem> {
|
|||||||
final ThemeData theme = Theme.of(context)!;
|
final ThemeData theme = Theme.of(context)!;
|
||||||
final ColorScheme colorScheme = theme.colorScheme;
|
final ColorScheme colorScheme = theme.colorScheme;
|
||||||
final TextTheme textTheme = theme.textTheme;
|
final TextTheme textTheme = theme.textTheme;
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final TextDirection? textDirection = Directionality.of(context);
|
final TextDirection? textDirection = Directionality.of(context);
|
||||||
final Color highlightColor = _highlightColor(context);
|
final Color highlightColor = _highlightColor(context);
|
||||||
final int day = dayToBuild.day;
|
final int day = dayToBuild.day;
|
||||||
@ -818,7 +818,7 @@ class _MonthItemState extends State<_MonthItem> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final ThemeData themeData = Theme.of(context)!;
|
final ThemeData themeData = Theme.of(context)!;
|
||||||
final TextTheme textTheme = themeData.textTheme;
|
final TextTheme textTheme = themeData.textTheme;
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final int year = widget.displayedMonth.year;
|
final int year = widget.displayedMonth.year;
|
||||||
final int month = widget.displayedMonth.month;
|
final int month = widget.displayedMonth.month;
|
||||||
final int daysInMonth = utils.getDaysInMonth(year, month);
|
final int daysInMonth = utils.getDaysInMonth(year, month);
|
||||||
|
@ -239,7 +239,7 @@ class DayPicker extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final ThemeData themeData = Theme.of(context)!;
|
final ThemeData themeData = Theme.of(context)!;
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final int year = displayedMonth.year;
|
final int year = displayedMonth.year;
|
||||||
final int month = displayedMonth.month;
|
final int month = displayedMonth.month;
|
||||||
final int daysInMonth = getDaysInMonth(year, month);
|
final int daysInMonth = getDaysInMonth(year, month);
|
||||||
|
@ -359,7 +359,7 @@ class _DatePickerDialogState extends State<_DatePickerDialog> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final ThemeData theme = Theme.of(context)!;
|
final ThemeData theme = Theme.of(context)!;
|
||||||
final ColorScheme colorScheme = theme.colorScheme;
|
final ColorScheme colorScheme = theme.colorScheme;
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final Orientation orientation = MediaQuery.of(context)!.orientation;
|
final Orientation orientation = MediaQuery.of(context)!.orientation;
|
||||||
final TextTheme textTheme = theme.textTheme;
|
final TextTheme textTheme = theme.textTheme;
|
||||||
// Constrain the textScaleFactor to the largest supported value to prevent
|
// Constrain the textScaleFactor to the largest supported value to prevent
|
||||||
|
@ -338,7 +338,7 @@ class _DateRangePickerDialogState extends State<_DateRangePickerDialog> {
|
|||||||
final MediaQueryData mediaQuery = MediaQuery.of(context)!;
|
final MediaQueryData mediaQuery = MediaQuery.of(context)!;
|
||||||
final Orientation orientation = mediaQuery.orientation;
|
final Orientation orientation = mediaQuery.orientation;
|
||||||
final double textScaleFactor = math.min(mediaQuery.textScaleFactor, 1.3);
|
final double textScaleFactor = math.min(mediaQuery.textScaleFactor, 1.3);
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
|
|
||||||
final Widget contents;
|
final Widget contents;
|
||||||
final Size size;
|
final Size size;
|
||||||
@ -478,7 +478,7 @@ class _CalendarRangePickerDialog extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final ThemeData theme = Theme.of(context)!;
|
final ThemeData theme = Theme.of(context)!;
|
||||||
final ColorScheme colorScheme = theme.colorScheme;
|
final ColorScheme colorScheme = theme.colorScheme;
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final Orientation orientation = MediaQuery.of(context)!.orientation;
|
final Orientation orientation = MediaQuery.of(context)!.orientation;
|
||||||
final TextTheme textTheme = theme.textTheme;
|
final TextTheme textTheme = theme.textTheme;
|
||||||
final Color headerForeground = colorScheme.brightness == Brightness.light
|
final Color headerForeground = colorScheme.brightness == Brightness.light
|
||||||
@ -615,7 +615,7 @@ class _InputDateRangePickerDialog extends StatelessWidget {
|
|||||||
final String? helpText;
|
final String? helpText;
|
||||||
|
|
||||||
String _formatDateRange(BuildContext context, DateTime? start, DateTime? end, DateTime now) {
|
String _formatDateRange(BuildContext context, DateTime? start, DateTime? end, DateTime now) {
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final String startText = utils.formatRangeStartDate(localizations, start, end);
|
final String startText = utils.formatRangeStartDate(localizations, start, end);
|
||||||
final String endText = utils.formatRangeEndDate(localizations, start, end, now);
|
final String endText = utils.formatRangeEndDate(localizations, start, end, now);
|
||||||
if (start == null || end == null) {
|
if (start == null || end == null) {
|
||||||
@ -632,7 +632,7 @@ class _InputDateRangePickerDialog extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final ThemeData theme = Theme.of(context)!;
|
final ThemeData theme = Theme.of(context)!;
|
||||||
final ColorScheme colorScheme = theme.colorScheme;
|
final ColorScheme colorScheme = theme.colorScheme;
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final Orientation orientation = MediaQuery.of(context)!.orientation;
|
final Orientation orientation = MediaQuery.of(context)!.orientation;
|
||||||
final TextTheme textTheme = theme.textTheme;
|
final TextTheme textTheme = theme.textTheme;
|
||||||
|
|
||||||
|
@ -157,7 +157,7 @@ class _InputDatePickerFormFieldState extends State<InputDatePickerFormField> {
|
|||||||
void didChangeDependencies() {
|
void didChangeDependencies() {
|
||||||
super.didChangeDependencies();
|
super.didChangeDependencies();
|
||||||
if (_selectedDate != null) {
|
if (_selectedDate != null) {
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
_inputText = localizations.formatCompactDate(_selectedDate!);
|
_inputText = localizations.formatCompactDate(_selectedDate!);
|
||||||
TextEditingValue textEditingValue = _controller.value.copyWith(text: _inputText);
|
TextEditingValue textEditingValue = _controller.value.copyWith(text: _inputText);
|
||||||
// Select the new text if we are auto focused and haven't selected the text before.
|
// Select the new text if we are auto focused and haven't selected the text before.
|
||||||
@ -173,7 +173,7 @@ class _InputDatePickerFormFieldState extends State<InputDatePickerFormField> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DateTime? _parseDate(String? text) {
|
DateTime? _parseDate(String? text) {
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
return localizations.parseCompactDate(text);
|
return localizations.parseCompactDate(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,9 +188,9 @@ class _InputDatePickerFormFieldState extends State<InputDatePickerFormField> {
|
|||||||
String? _validateDate(String? text) {
|
String? _validateDate(String? text) {
|
||||||
final DateTime? date = _parseDate(text);
|
final DateTime? date = _parseDate(text);
|
||||||
if (date == null) {
|
if (date == null) {
|
||||||
return widget.errorFormatText ?? MaterialLocalizations.of(context)!.invalidDateFormatLabel;
|
return widget.errorFormatText ?? MaterialLocalizations.of(context).invalidDateFormatLabel;
|
||||||
} else if (!_isValidAcceptableDate(date)) {
|
} else if (!_isValidAcceptableDate(date)) {
|
||||||
return widget.errorInvalidText ?? MaterialLocalizations.of(context)!.dateOutOfRangeLabel;
|
return widget.errorInvalidText ?? MaterialLocalizations.of(context).dateOutOfRangeLabel;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -219,7 +219,7 @@ class _InputDatePickerFormFieldState extends State<InputDatePickerFormField> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final InputDecorationTheme inputTheme = Theme.of(context)!.inputDecorationTheme;
|
final InputDecorationTheme inputTheme = Theme.of(context)!.inputDecorationTheme;
|
||||||
return TextFormField(
|
return TextFormField(
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
|
@ -141,7 +141,7 @@ class InputDateRangePickerState extends State<InputDateRangePicker> {
|
|||||||
@override
|
@override
|
||||||
void didChangeDependencies() {
|
void didChangeDependencies() {
|
||||||
super.didChangeDependencies();
|
super.didChangeDependencies();
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
if (_startDate != null) {
|
if (_startDate != null) {
|
||||||
_startInputText = localizations.formatCompactDate(_startDate!);
|
_startInputText = localizations.formatCompactDate(_startDate!);
|
||||||
final bool selectText = widget.autofocus && !_autoSelected;
|
final bool selectText = widget.autofocus && !_autoSelected;
|
||||||
@ -166,7 +166,7 @@ class InputDateRangePickerState extends State<InputDateRangePicker> {
|
|||||||
final String? endError = _validateDate(_endDate);
|
final String? endError = _validateDate(_endDate);
|
||||||
if (startError == null && endError == null) {
|
if (startError == null && endError == null) {
|
||||||
if (_startDate!.isAfter(_endDate!)) {
|
if (_startDate!.isAfter(_endDate!)) {
|
||||||
startError = widget.errorInvalidRangeText ?? MaterialLocalizations.of(context)!.invalidDateRangeLabel;
|
startError = widget.errorInvalidRangeText ?? MaterialLocalizations.of(context).invalidDateRangeLabel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setState(() {
|
setState(() {
|
||||||
@ -177,15 +177,15 @@ class InputDateRangePickerState extends State<InputDateRangePicker> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DateTime? _parseDate(String? text) {
|
DateTime? _parseDate(String? text) {
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
return localizations.parseCompactDate(text);
|
return localizations.parseCompactDate(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
String? _validateDate(DateTime? date) {
|
String? _validateDate(DateTime? date) {
|
||||||
if (date == null) {
|
if (date == null) {
|
||||||
return widget.errorFormatText ?? MaterialLocalizations.of(context)!.invalidDateFormatLabel;
|
return widget.errorFormatText ?? MaterialLocalizations.of(context).invalidDateFormatLabel;
|
||||||
} else if (date.isBefore(widget.firstDate) || date.isAfter(widget.lastDate)) {
|
} else if (date.isBefore(widget.firstDate) || date.isAfter(widget.lastDate)) {
|
||||||
return widget.errorInvalidText ?? MaterialLocalizations.of(context)!.dateOutOfRangeLabel;
|
return widget.errorInvalidText ?? MaterialLocalizations.of(context).dateOutOfRangeLabel;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -225,7 +225,7 @@ class InputDateRangePickerState extends State<InputDateRangePicker> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final InputDecorationTheme inputTheme = Theme.of(context)!.inputDecorationTheme;
|
final InputDecorationTheme inputTheme = Theme.of(context)!.inputDecorationTheme;
|
||||||
return Row(
|
return Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
@ -848,17 +848,15 @@ Future<T?> showMenu<T>({
|
|||||||
assert(captureInheritedThemes != null);
|
assert(captureInheritedThemes != null);
|
||||||
assert(debugCheckHasMaterialLocalizations(context));
|
assert(debugCheckHasMaterialLocalizations(context));
|
||||||
|
|
||||||
String? label;
|
|
||||||
switch (Theme.of(context)!.platform) {
|
switch (Theme.of(context)!.platform) {
|
||||||
case TargetPlatform.iOS:
|
case TargetPlatform.iOS:
|
||||||
case TargetPlatform.macOS:
|
case TargetPlatform.macOS:
|
||||||
label = semanticLabel;
|
|
||||||
break;
|
break;
|
||||||
case TargetPlatform.android:
|
case TargetPlatform.android:
|
||||||
case TargetPlatform.fuchsia:
|
case TargetPlatform.fuchsia:
|
||||||
case TargetPlatform.linux:
|
case TargetPlatform.linux:
|
||||||
case TargetPlatform.windows:
|
case TargetPlatform.windows:
|
||||||
label = semanticLabel ?? MaterialLocalizations.of(context)?.popupMenuLabel;
|
semanticLabel ??= MaterialLocalizations.of(context).popupMenuLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Navigator.of(context, rootNavigator: useRootNavigator)!.push(_PopupMenuRoute<T>(
|
return Navigator.of(context, rootNavigator: useRootNavigator)!.push(_PopupMenuRoute<T>(
|
||||||
@ -866,10 +864,10 @@ Future<T?> showMenu<T>({
|
|||||||
items: items,
|
items: items,
|
||||||
initialValue: initialValue,
|
initialValue: initialValue,
|
||||||
elevation: elevation,
|
elevation: elevation,
|
||||||
semanticLabel: label,
|
semanticLabel: semanticLabel,
|
||||||
theme: Theme.of(context, shadowThemeOnly: true),
|
theme: Theme.of(context, shadowThemeOnly: true),
|
||||||
popupMenuTheme: PopupMenuTheme.of(context),
|
popupMenuTheme: PopupMenuTheme.of(context),
|
||||||
barrierLabel: MaterialLocalizations.of(context)!.modalBarrierDismissLabel,
|
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
|
||||||
shape: shape,
|
shape: shape,
|
||||||
color: color,
|
color: color,
|
||||||
showMenuContext: context,
|
showMenuContext: context,
|
||||||
@ -1142,7 +1140,7 @@ class PopupMenuButtonState<T> extends State<PopupMenuButton<T>> {
|
|||||||
|
|
||||||
if (widget.child != null)
|
if (widget.child != null)
|
||||||
return Tooltip(
|
return Tooltip(
|
||||||
message: widget.tooltip ?? MaterialLocalizations.of(context)!.showMenuTooltip,
|
message: widget.tooltip ?? MaterialLocalizations.of(context).showMenuTooltip,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: widget.enabled ? showButtonMenu : null,
|
onTap: widget.enabled ? showButtonMenu : null,
|
||||||
canRequestFocus: _canRequestFocus,
|
canRequestFocus: _canRequestFocus,
|
||||||
@ -1153,7 +1151,7 @@ class PopupMenuButtonState<T> extends State<PopupMenuButton<T>> {
|
|||||||
return IconButton(
|
return IconButton(
|
||||||
icon: widget.icon ?? _getIcon(Theme.of(context)!.platform),
|
icon: widget.icon ?? _getIcon(Theme.of(context)!.platform),
|
||||||
padding: widget.padding,
|
padding: widget.padding,
|
||||||
tooltip: widget.tooltip ?? MaterialLocalizations.of(context)!.showMenuTooltip,
|
tooltip: widget.tooltip ?? MaterialLocalizations.of(context).showMenuTooltip,
|
||||||
onPressed: widget.enabled ? showButtonMenu : null,
|
onPressed: widget.enabled ? showButtonMenu : null,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -467,7 +467,7 @@ class RefreshIndicatorState extends State<RefreshIndicator> with TickerProviderS
|
|||||||
animation: _positionController,
|
animation: _positionController,
|
||||||
builder: (BuildContext context, Widget? child) {
|
builder: (BuildContext context, Widget? child) {
|
||||||
return RefreshProgressIndicator(
|
return RefreshProgressIndicator(
|
||||||
semanticsLabel: widget.semanticsLabel ?? MaterialLocalizations.of(context)!.refreshIndicatorSemanticLabel,
|
semanticsLabel: widget.semanticsLabel ?? MaterialLocalizations.of(context).refreshIndicatorSemanticLabel,
|
||||||
semanticsValue: widget.semanticsValue,
|
semanticsValue: widget.semanticsValue,
|
||||||
value: showIndeterminateIndicator ? null : _value.value,
|
value: showIndeterminateIndicator ? null : _value.value,
|
||||||
valueColor: _valueColor,
|
valueColor: _valueColor,
|
||||||
|
@ -402,7 +402,7 @@ class _ReorderableListContentState extends State<_ReorderableListContent> with T
|
|||||||
// before index+2, which is after the space at index+1.
|
// before index+2, which is after the space at index+1.
|
||||||
void moveAfter() => reorder(index, index + 2);
|
void moveAfter() => reorder(index, index + 2);
|
||||||
|
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
|
|
||||||
// If the item can move to before its current position in the list.
|
// If the item can move to before its current position in the list.
|
||||||
if (index > 0) {
|
if (index > 0) {
|
||||||
|
@ -479,7 +479,7 @@ class _SearchPageState<T> extends State<_SearchPage<T>> {
|
|||||||
assert(debugCheckHasMaterialLocalizations(context));
|
assert(debugCheckHasMaterialLocalizations(context));
|
||||||
final ThemeData theme = widget.delegate.appBarTheme(context);
|
final ThemeData theme = widget.delegate.appBarTheme(context);
|
||||||
final String searchFieldLabel = widget.delegate.searchFieldLabel
|
final String searchFieldLabel = widget.delegate.searchFieldLabel
|
||||||
?? MaterialLocalizations.of(context)!.searchFieldLabel;
|
?? MaterialLocalizations.of(context).searchFieldLabel;
|
||||||
final TextStyle? searchFieldStyle = widget.delegate.searchFieldStyle
|
final TextStyle? searchFieldStyle = widget.delegate.searchFieldStyle
|
||||||
?? theme.inputDecorationTheme.hintStyle;
|
?? theme.inputDecorationTheme.hintStyle;
|
||||||
Widget? body;
|
Widget? body;
|
||||||
|
@ -406,7 +406,7 @@ class _StepperState extends State<Stepper> with TickerProviderStateMixin {
|
|||||||
|
|
||||||
final ThemeData themeData = Theme.of(context)!;
|
final ThemeData themeData = Theme.of(context)!;
|
||||||
final ColorScheme colorScheme = themeData.colorScheme;
|
final ColorScheme colorScheme = themeData.colorScheme;
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
|
|
||||||
const OutlinedBorder buttonShape = RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(2)));
|
const OutlinedBorder buttonShape = RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(2)));
|
||||||
const EdgeInsets buttonPadding = EdgeInsets.symmetric(horizontal: 16.0);
|
const EdgeInsets buttonPadding = EdgeInsets.symmetric(horizontal: 16.0);
|
||||||
|
@ -1030,7 +1030,7 @@ class _TabBarState extends State<TabBar> {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}());
|
}());
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
if (_controller!.length == 0) {
|
if (_controller!.length == 0) {
|
||||||
return Container(
|
return Container(
|
||||||
height: _kTabHeight + widget.indicatorWeight,
|
height: _kTabHeight + widget.indicatorWeight,
|
||||||
|
@ -865,7 +865,7 @@ class _TextFieldState extends State<TextField> with RestorationMixin implements
|
|||||||
bool get _hasError => widget.decoration?.errorText != null || _hasIntrinsicError;
|
bool get _hasError => widget.decoration?.errorText != null || _hasIntrinsicError;
|
||||||
|
|
||||||
InputDecoration _getEffectiveDecoration() {
|
InputDecoration _getEffectiveDecoration() {
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final ThemeData themeData = Theme.of(context)!;
|
final ThemeData themeData = Theme.of(context)!;
|
||||||
final InputDecoration effectiveDecoration = (widget.decoration ?? const InputDecoration())
|
final InputDecoration effectiveDecoration = (widget.decoration ?? const InputDecoration())
|
||||||
.applyDefaults(themeData.inputDecorationTheme)
|
.applyDefaults(themeData.inputDecorationTheme)
|
||||||
|
@ -183,7 +183,7 @@ class _TextSelectionToolbarState extends State<_TextSelectionToolbar> with Ticke
|
|||||||
return const SizedBox(width: 0.0, height: 0.0);
|
return const SizedBox(width: 0.0, height: 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final List<_ItemData> itemDatas = <_ItemData>[
|
final List<_ItemData> itemDatas = <_ItemData>[
|
||||||
if (widget.handleCut != null)
|
if (widget.handleCut != null)
|
||||||
_ItemData(widget.handleCut!, localizations.cutButtonLabel),
|
_ItemData(widget.handleCut!, localizations.cutButtonLabel),
|
||||||
|
@ -132,7 +132,7 @@ class Theme extends StatelessWidget {
|
|||||||
return inheritedTheme.theme.data;
|
return inheritedTheme.theme.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
final MaterialLocalizations? localizations = MaterialLocalizations.of(context);
|
final MaterialLocalizations? localizations = Localizations.of<MaterialLocalizations>(context, MaterialLocalizations);
|
||||||
final ScriptCategory category = localizations?.scriptCategory ?? ScriptCategory.englishLike;
|
final ScriptCategory category = localizations?.scriptCategory ?? ScriptCategory.englishLike;
|
||||||
final ThemeData theme = inheritedTheme?.theme.data ?? _kFallbackTheme;
|
final ThemeData theme = inheritedTheme?.theme.data ?? _kFallbackTheme;
|
||||||
return ThemeData.localize(theme, theme.typography.geometryThemeFor(category));
|
return ThemeData.localize(theme, theme.typography.geometryThemeFor(category));
|
||||||
|
@ -104,7 +104,7 @@ class TimeOfDay {
|
|||||||
String format(BuildContext context) {
|
String format(BuildContext context) {
|
||||||
assert(debugCheckHasMediaQuery(context));
|
assert(debugCheckHasMediaQuery(context));
|
||||||
assert(debugCheckHasMaterialLocalizations(context));
|
assert(debugCheckHasMaterialLocalizations(context));
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
return localizations.formatTimeOfDay(
|
return localizations.formatTimeOfDay(
|
||||||
this,
|
this,
|
||||||
alwaysUse24HourFormat: MediaQuery.of(context)!.alwaysUse24HourFormat,
|
alwaysUse24HourFormat: MediaQuery.of(context)!.alwaysUse24HourFormat,
|
||||||
|
@ -134,7 +134,7 @@ class _TimePickerHeader extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
assert(debugCheckHasMediaQuery(context));
|
assert(debugCheckHasMediaQuery(context));
|
||||||
final ThemeData themeData = Theme.of(context)!;
|
final ThemeData themeData = Theme.of(context)!;
|
||||||
final TimeOfDayFormat timeOfDayFormat = MaterialLocalizations.of(context)!.timeOfDayFormat(
|
final TimeOfDayFormat timeOfDayFormat = MaterialLocalizations.of(context).timeOfDayFormat(
|
||||||
alwaysUse24HourFormat: MediaQuery.of(context)!.alwaysUse24HourFormat,
|
alwaysUse24HourFormat: MediaQuery.of(context)!.alwaysUse24HourFormat,
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -241,7 +241,7 @@ class _TimePickerHeader extends StatelessWidget {
|
|||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
const SizedBox(height: 16.0),
|
const SizedBox(height: 16.0),
|
||||||
Text(
|
Text(
|
||||||
helpText ?? MaterialLocalizations.of(context)!.timePickerDialHelpText,
|
helpText ?? MaterialLocalizations.of(context).timePickerDialHelpText,
|
||||||
style: TimePickerTheme.of(context).helpTextStyle ?? themeData.textTheme.overline,
|
style: TimePickerTheme.of(context).helpTextStyle ?? themeData.textTheme.overline,
|
||||||
),
|
),
|
||||||
controls,
|
controls,
|
||||||
@ -322,7 +322,7 @@ class _HourControl extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
assert(debugCheckHasMediaQuery(context));
|
assert(debugCheckHasMediaQuery(context));
|
||||||
final bool alwaysUse24HourFormat = MediaQuery.of(context)!.alwaysUse24HourFormat;
|
final bool alwaysUse24HourFormat = MediaQuery.of(context)!.alwaysUse24HourFormat;
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final String formattedHour = localizations.formatHour(
|
final String formattedHour = localizations.formatHour(
|
||||||
fragmentContext.selectedTime,
|
fragmentContext.selectedTime,
|
||||||
alwaysUse24HourFormat: alwaysUse24HourFormat,
|
alwaysUse24HourFormat: alwaysUse24HourFormat,
|
||||||
@ -432,7 +432,7 @@ class _MinuteControl extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
final String formattedMinute = localizations.formatMinute(fragmentContext.selectedTime);
|
final String formattedMinute = localizations.formatMinute(fragmentContext.selectedTime);
|
||||||
final TimeOfDay nextMinute = fragmentContext.selectedTime.replacing(
|
final TimeOfDay nextMinute = fragmentContext.selectedTime.replacing(
|
||||||
minute: (fragmentContext.selectedTime.minute + 1) % TimeOfDay.minutesPerHour,
|
minute: (fragmentContext.selectedTime.minute + 1) % TimeOfDay.minutesPerHour,
|
||||||
@ -493,7 +493,7 @@ class _DayPeriodControl extends StatelessWidget {
|
|||||||
case TargetPlatform.fuchsia:
|
case TargetPlatform.fuchsia:
|
||||||
case TargetPlatform.linux:
|
case TargetPlatform.linux:
|
||||||
case TargetPlatform.windows:
|
case TargetPlatform.windows:
|
||||||
_announceToAccessibility(context, MaterialLocalizations.of(context)!.anteMeridiemAbbreviation);
|
_announceToAccessibility(context, MaterialLocalizations.of(context).anteMeridiemAbbreviation);
|
||||||
break;
|
break;
|
||||||
case TargetPlatform.iOS:
|
case TargetPlatform.iOS:
|
||||||
case TargetPlatform.macOS:
|
case TargetPlatform.macOS:
|
||||||
@ -511,7 +511,7 @@ class _DayPeriodControl extends StatelessWidget {
|
|||||||
case TargetPlatform.fuchsia:
|
case TargetPlatform.fuchsia:
|
||||||
case TargetPlatform.linux:
|
case TargetPlatform.linux:
|
||||||
case TargetPlatform.windows:
|
case TargetPlatform.windows:
|
||||||
_announceToAccessibility(context, MaterialLocalizations.of(context)!.postMeridiemAbbreviation);
|
_announceToAccessibility(context, MaterialLocalizations.of(context).postMeridiemAbbreviation);
|
||||||
break;
|
break;
|
||||||
case TargetPlatform.iOS:
|
case TargetPlatform.iOS:
|
||||||
case TargetPlatform.macOS:
|
case TargetPlatform.macOS:
|
||||||
@ -522,7 +522,7 @@ class _DayPeriodControl extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final MaterialLocalizations materialLocalizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations materialLocalizations = MaterialLocalizations.of(context);
|
||||||
final ColorScheme colorScheme = Theme.of(context)!.colorScheme;
|
final ColorScheme colorScheme = Theme.of(context)!.colorScheme;
|
||||||
final TimePickerThemeData timePickerTheme = TimePickerTheme.of(context);
|
final TimePickerThemeData timePickerTheme = TimePickerTheme.of(context);
|
||||||
final bool isDark = colorScheme.brightness == Brightness.dark;
|
final bool isDark = colorScheme.brightness == Brightness.dark;
|
||||||
@ -941,7 +941,7 @@ class _DialState extends State<_Dial> with SingleTickerProviderStateMixin {
|
|||||||
super.didChangeDependencies();
|
super.didChangeDependencies();
|
||||||
assert(debugCheckHasMediaQuery(context));
|
assert(debugCheckHasMediaQuery(context));
|
||||||
themeData = Theme.of(context)!;
|
themeData = Theme.of(context)!;
|
||||||
localizations = MaterialLocalizations.of(context)!;
|
localizations = MaterialLocalizations.of(context);
|
||||||
media = MediaQuery.of(context)!;
|
media = MediaQuery.of(context)!;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1409,7 +1409,7 @@ class _TimePickerInputState extends State<_TimePickerInput> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
assert(debugCheckHasMediaQuery(context));
|
assert(debugCheckHasMediaQuery(context));
|
||||||
final MediaQueryData media = MediaQuery.of(context)!;
|
final MediaQueryData media = MediaQuery.of(context)!;
|
||||||
final TimeOfDayFormat timeOfDayFormat = MaterialLocalizations.of(context)!.timeOfDayFormat(alwaysUse24HourFormat: media.alwaysUse24HourFormat);
|
final TimeOfDayFormat timeOfDayFormat = MaterialLocalizations.of(context).timeOfDayFormat(alwaysUse24HourFormat: media.alwaysUse24HourFormat);
|
||||||
final bool use24HourDials = hourFormat(of: timeOfDayFormat) != HourFormat.h;
|
final bool use24HourDials = hourFormat(of: timeOfDayFormat) != HourFormat.h;
|
||||||
final ThemeData theme = Theme.of(context)!;
|
final ThemeData theme = Theme.of(context)!;
|
||||||
final TextStyle hourMinuteStyle = TimePickerTheme.of(context).hourMinuteTextStyle ?? theme.textTheme.headline2!;
|
final TextStyle hourMinuteStyle = TimePickerTheme.of(context).hourMinuteTextStyle ?? theme.textTheme.headline2!;
|
||||||
@ -1420,7 +1420,7 @@ class _TimePickerInputState extends State<_TimePickerInput> {
|
|||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Text(
|
Text(
|
||||||
widget.helpText ?? MaterialLocalizations.of(context)!.timePickerInputHelpText,
|
widget.helpText ?? MaterialLocalizations.of(context).timePickerInputHelpText,
|
||||||
style: TimePickerTheme.of(context).helpTextStyle ?? theme.textTheme.overline,
|
style: TimePickerTheme.of(context).helpTextStyle ?? theme.textTheme.overline,
|
||||||
),
|
),
|
||||||
const SizedBox(height: 16.0),
|
const SizedBox(height: 16.0),
|
||||||
@ -1458,7 +1458,7 @@ class _TimePickerInputState extends State<_TimePickerInput> {
|
|||||||
if (!hourHasError && !minuteHasError)
|
if (!hourHasError && !minuteHasError)
|
||||||
ExcludeSemantics(
|
ExcludeSemantics(
|
||||||
child: Text(
|
child: Text(
|
||||||
MaterialLocalizations.of(context)!.timePickerHourLabel,
|
MaterialLocalizations.of(context).timePickerHourLabel,
|
||||||
style: theme.textTheme.caption,
|
style: theme.textTheme.caption,
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
@ -1488,7 +1488,7 @@ class _TimePickerInputState extends State<_TimePickerInput> {
|
|||||||
if (!hourHasError && !minuteHasError)
|
if (!hourHasError && !minuteHasError)
|
||||||
ExcludeSemantics(
|
ExcludeSemantics(
|
||||||
child: Text(
|
child: Text(
|
||||||
MaterialLocalizations.of(context)!.timePickerMinuteLabel,
|
MaterialLocalizations.of(context).timePickerMinuteLabel,
|
||||||
style: theme.textTheme.caption,
|
style: theme.textTheme.caption,
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
@ -1512,7 +1512,7 @@ class _TimePickerInputState extends State<_TimePickerInput> {
|
|||||||
),
|
),
|
||||||
if (hourHasError || minuteHasError)
|
if (hourHasError || minuteHasError)
|
||||||
Text(
|
Text(
|
||||||
MaterialLocalizations.of(context)!.invalidTimeLabel,
|
MaterialLocalizations.of(context).invalidTimeLabel,
|
||||||
style: theme.textTheme.bodyText2!.copyWith(color: theme.colorScheme.error),
|
style: theme.textTheme.bodyText2!.copyWith(color: theme.colorScheme.error),
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
@ -1548,7 +1548,7 @@ class _HourTextField extends StatelessWidget {
|
|||||||
isHour: true,
|
isHour: true,
|
||||||
autofocus: autofocus,
|
autofocus: autofocus,
|
||||||
style: style,
|
style: style,
|
||||||
semanticHintText: MaterialLocalizations.of(context)!.timePickerHourLabel,
|
semanticHintText: MaterialLocalizations.of(context).timePickerHourLabel,
|
||||||
validator: validator,
|
validator: validator,
|
||||||
onSavedSubmitted: onSavedSubmitted,
|
onSavedSubmitted: onSavedSubmitted,
|
||||||
onChanged: onChanged,
|
onChanged: onChanged,
|
||||||
@ -1579,7 +1579,7 @@ class _MinuteTextField extends StatelessWidget {
|
|||||||
isHour: false,
|
isHour: false,
|
||||||
autofocus: autofocus,
|
autofocus: autofocus,
|
||||||
style: style,
|
style: style,
|
||||||
semanticHintText: MaterialLocalizations.of(context)!.timePickerMinuteLabel,
|
semanticHintText: MaterialLocalizations.of(context).timePickerMinuteLabel,
|
||||||
validator: validator,
|
validator: validator,
|
||||||
onSavedSubmitted: onSavedSubmitted,
|
onSavedSubmitted: onSavedSubmitted,
|
||||||
);
|
);
|
||||||
@ -1632,7 +1632,7 @@ class _HourMinuteTextFieldState extends State<_HourMinuteTextField> {
|
|||||||
|
|
||||||
String get _formattedValue {
|
String get _formattedValue {
|
||||||
final bool alwaysUse24HourFormat = MediaQuery.of(context)!.alwaysUse24HourFormat;
|
final bool alwaysUse24HourFormat = MediaQuery.of(context)!.alwaysUse24HourFormat;
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
return !widget.isHour ? localizations.formatMinute(widget.selectedTime) : localizations.formatHour(
|
return !widget.isHour ? localizations.formatMinute(widget.selectedTime) : localizations.formatHour(
|
||||||
widget.selectedTime,
|
widget.selectedTime,
|
||||||
alwaysUse24HourFormat: alwaysUse24HourFormat,
|
alwaysUse24HourFormat: alwaysUse24HourFormat,
|
||||||
@ -1770,7 +1770,7 @@ class _TimePickerDialogState extends State<_TimePickerDialog> {
|
|||||||
@override
|
@override
|
||||||
void didChangeDependencies() {
|
void didChangeDependencies() {
|
||||||
super.didChangeDependencies();
|
super.didChangeDependencies();
|
||||||
localizations = MaterialLocalizations.of(context)!;
|
localizations = MaterialLocalizations.of(context);
|
||||||
_announceInitialTimeOnce();
|
_announceInitialTimeOnce();
|
||||||
_announceModeOnce();
|
_announceModeOnce();
|
||||||
}
|
}
|
||||||
@ -1855,7 +1855,7 @@ class _TimePickerDialogState extends State<_TimePickerDialog> {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
final MediaQueryData media = MediaQuery.of(context)!;
|
final MediaQueryData media = MediaQuery.of(context)!;
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
_announceToAccessibility(
|
_announceToAccessibility(
|
||||||
context,
|
context,
|
||||||
localizations.formatTimeOfDay(widget.initialTime, alwaysUse24HourFormat: media.alwaysUse24HourFormat),
|
localizations.formatTimeOfDay(widget.initialTime, alwaysUse24HourFormat: media.alwaysUse24HourFormat),
|
||||||
@ -1957,8 +1957,8 @@ class _TimePickerDialogState extends State<_TimePickerDialog> {
|
|||||||
onPressed: _handleEntryModeToggle,
|
onPressed: _handleEntryModeToggle,
|
||||||
icon: Icon(_entryMode == TimePickerEntryMode.dial ? Icons.keyboard : Icons.access_time),
|
icon: Icon(_entryMode == TimePickerEntryMode.dial ? Icons.keyboard : Icons.access_time),
|
||||||
tooltip: _entryMode == TimePickerEntryMode.dial
|
tooltip: _entryMode == TimePickerEntryMode.dial
|
||||||
? MaterialLocalizations.of(context)!.inputTimeModeButtonLabel
|
? MaterialLocalizations.of(context).inputTimeModeButtonLabel
|
||||||
: MaterialLocalizations.of(context)!.dialModeButtonLabel,
|
: MaterialLocalizations.of(context).dialModeButtonLabel,
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Container(
|
child: Container(
|
||||||
|
@ -134,7 +134,7 @@ class _AccountDetailsState extends State<_AccountDetails> with SingleTickerProvi
|
|||||||
assert(debugCheckHasMaterialLocalizations(context));
|
assert(debugCheckHasMaterialLocalizations(context));
|
||||||
|
|
||||||
final ThemeData theme = Theme.of(context)!;
|
final ThemeData theme = Theme.of(context)!;
|
||||||
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
|
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
||||||
|
|
||||||
Widget accountDetails = CustomMultiChildLayout(
|
Widget accountDetails = CustomMultiChildLayout(
|
||||||
delegate: _AccountDetailsLayout(
|
delegate: _AccountDetailsLayout(
|
||||||
@ -356,7 +356,7 @@ class _UserAccountsDrawerHeaderState extends State<UserAccountsDrawerHeader> {
|
|||||||
assert(debugCheckHasMaterialLocalizations(context));
|
assert(debugCheckHasMaterialLocalizations(context));
|
||||||
return Semantics(
|
return Semantics(
|
||||||
container: true,
|
container: true,
|
||||||
label: MaterialLocalizations.of(context)!.signedInLabel,
|
label: MaterialLocalizations.of(context).signedInLabel,
|
||||||
child: DrawerHeader(
|
child: DrawerHeader(
|
||||||
decoration: widget.decoration ?? BoxDecoration(
|
decoration: widget.decoration ?? BoxDecoration(
|
||||||
color: Theme.of(context)!.primaryColor,
|
color: Theme.of(context)!.primaryColor,
|
||||||
|
@ -50,8 +50,8 @@ void main() {
|
|||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
return Column(
|
return Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Text(CupertinoLocalizations.of(context)!.selectAllButtonLabel),
|
Text(CupertinoLocalizations.of(context).selectAllButtonLabel),
|
||||||
Text(CupertinoLocalizations.of(context)!.datePickerMediumDate(
|
Text(CupertinoLocalizations.of(context).datePickerMediumDate(
|
||||||
DateTime(2018, 10, 4),
|
DateTime(2018, 10, 4),
|
||||||
)),
|
)),
|
||||||
],
|
],
|
||||||
|
33
packages/flutter/test/cupertino/debug_test.dart
Normal file
33
packages/flutter/test/cupertino/debug_test.dart
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
// Copyright 2014 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.
|
||||||
|
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/src/cupertino/debug.dart';
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
testWidgets('debugCheckHasCupertinoLocalizations throws', (WidgetTester tester) async {
|
||||||
|
final GlobalKey noLocalizationsAvailable = GlobalKey();
|
||||||
|
final GlobalKey localizationsAvailable = GlobalKey();
|
||||||
|
|
||||||
|
await tester.pumpWidget(
|
||||||
|
Container(
|
||||||
|
key: noLocalizationsAvailable,
|
||||||
|
child: CupertinoApp(
|
||||||
|
home: Container(
|
||||||
|
key: localizationsAvailable,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(() => debugCheckHasCupertinoLocalizations(noLocalizationsAvailable.currentContext!), throwsA(isAssertionError.having(
|
||||||
|
(AssertionError e) => e.message,
|
||||||
|
'message',
|
||||||
|
contains('No CupertinoLocalizations found'),
|
||||||
|
)));
|
||||||
|
|
||||||
|
expect(debugCheckHasCupertinoLocalizations(localizationsAvailable.currentContext!), isTrue);
|
||||||
|
});
|
||||||
|
}
|
@ -32,4 +32,28 @@ void main() {
|
|||||||
|
|
||||||
expect(localizations.modalBarrierDismissLabel, isNotNull);
|
expect(localizations.modalBarrierDismissLabel, isNotNull);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testWidgets('CupertinoLocalizations.of throws', (WidgetTester tester) async {
|
||||||
|
final GlobalKey noLocalizationsAvailable = GlobalKey();
|
||||||
|
final GlobalKey localizationsAvailable = GlobalKey();
|
||||||
|
|
||||||
|
await tester.pumpWidget(
|
||||||
|
Container(
|
||||||
|
key: noLocalizationsAvailable,
|
||||||
|
child: CupertinoApp(
|
||||||
|
home: Container(
|
||||||
|
key: localizationsAvailable,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(() => CupertinoLocalizations.of(noLocalizationsAvailable.currentContext!), throwsA(isAssertionError.having(
|
||||||
|
(AssertionError e) => e.message,
|
||||||
|
'message',
|
||||||
|
contains('No CupertinoLocalizations found'),
|
||||||
|
)));
|
||||||
|
|
||||||
|
expect(CupertinoLocalizations.of(localizationsAvailable.currentContext!), isA<CupertinoLocalizations>());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
@ -500,8 +500,8 @@ void main() {
|
|||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
return Column(
|
return Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Text(MaterialLocalizations.of(context)!.selectAllButtonLabel),
|
Text(MaterialLocalizations.of(context).selectAllButtonLabel),
|
||||||
Text(CupertinoLocalizations.of(context)!.selectAllButtonLabel),
|
Text(CupertinoLocalizations.of(context).selectAllButtonLabel),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
@ -102,4 +102,28 @@ void main() {
|
|||||||
expect(localizations.licensesPackageDetailText(2).contains(r'$licensesCount'), isFalse);
|
expect(localizations.licensesPackageDetailText(2).contains(r'$licensesCount'), isFalse);
|
||||||
expect(localizations.licensesPackageDetailText(100).contains(r'$licensesCount'), isFalse);
|
expect(localizations.licensesPackageDetailText(100).contains(r'$licensesCount'), isFalse);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testWidgets('MaterialLocalizations.of throws', (WidgetTester tester) async {
|
||||||
|
final GlobalKey noLocalizationsAvailable = GlobalKey();
|
||||||
|
final GlobalKey localizationsAvailable = GlobalKey();
|
||||||
|
|
||||||
|
await tester.pumpWidget(
|
||||||
|
Container(
|
||||||
|
key: noLocalizationsAvailable,
|
||||||
|
child: MaterialApp(
|
||||||
|
home: Container(
|
||||||
|
key: localizationsAvailable,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(() => MaterialLocalizations.of(noLocalizationsAvailable.currentContext!), throwsA(isAssertionError.having(
|
||||||
|
(AssertionError e) => e.message,
|
||||||
|
'message',
|
||||||
|
contains('No MaterialLocalizations found'),
|
||||||
|
)));
|
||||||
|
|
||||||
|
expect(MaterialLocalizations.of(localizationsAvailable.currentContext!), isA<MaterialLocalizations>());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,7 @@ Future<Offset?> startPicker(
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> finishPicker(WidgetTester tester) async {
|
Future<void> finishPicker(WidgetTester tester) async {
|
||||||
final MaterialLocalizations materialLocalizations = MaterialLocalizations.of(tester.element(find.byType(ElevatedButton)))!;
|
final MaterialLocalizations materialLocalizations = MaterialLocalizations.of(tester.element(find.byType(ElevatedButton)));
|
||||||
await tester.tap(find.text(materialLocalizations.okButtonLabel));
|
await tester.tap(find.text(materialLocalizations.okButtonLabel));
|
||||||
await tester.pumpAndSettle(const Duration(seconds: 1));
|
await tester.pumpAndSettle(const Duration(seconds: 1));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user