Unverified Commit 6cb6eef6 authored by Michael Goderbauer's avatar Michael Goderbauer Committed by GitHub

Make Material/CupertinoLocalizations non-nullable (#68807)

parent ce3ce20b
......@@ -209,14 +209,7 @@ class CupertinoTabBar extends StatelessWidget implements PreferredSizeWidget {
List<Widget> _buildTabItems(BuildContext context) {
final List<Widget> result = <Widget>[];
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.'
);
final CupertinoLocalizations localizations = CupertinoLocalizations.of(context);
for (int index = 0; index < items.length; index += 1) {
final bool active = index == currentIndex;
......@@ -226,7 +219,7 @@ class CupertinoTabBar extends StatelessWidget implements PreferredSizeWidget {
Expanded(
child: Semantics(
selected: active,
hint: localizations!.tabSemanticsLabel(
hint: localizations.tabSemanticsLabel(
tabIndex: index + 1,
tabCount: items.length,
),
......
......@@ -623,7 +623,7 @@ class _CupertinoDatePickerDateTimeState extends State<CupertinoDatePicker> {
super.didChangeDependencies();
textDirectionFactor = Directionality.of(context) == TextDirection.ltr ? 1 : -1;
localizations = CupertinoLocalizations.of(context)!;
localizations = CupertinoLocalizations.of(context);
alignCenterLeft = textDirectionFactor == 1 ? Alignment.centerLeft : Alignment.centerRight;
alignCenterRight = textDirectionFactor == 1 ? Alignment.centerRight : Alignment.centerLeft;
......@@ -1113,7 +1113,7 @@ class _CupertinoDatePickerDateState extends State<CupertinoDatePicker> {
super.didChangeDependencies();
textDirectionFactor = Directionality.of(context) == TextDirection.ltr ? 1 : -1;
localizations = CupertinoLocalizations.of(context)!;
localizations = CupertinoLocalizations.of(context);
alignCenterLeft = textDirectionFactor == 1 ? Alignment.centerLeft : Alignment.centerRight;
alignCenterRight = textDirectionFactor == 1 ? Alignment.centerRight : Alignment.centerLeft;
......@@ -1621,7 +1621,7 @@ class _CupertinoTimerPickerState extends State<CupertinoTimerPicker> {
super.didChangeDependencies();
textDirection = Directionality.of(context)!;
localizations = CupertinoLocalizations.of(context)!;
localizations = CupertinoLocalizations.of(context);
_measureLabelMetrics();
}
......
// 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
Widget build(BuildContext context) {
final CupertinoLocalizations localizations = CupertinoLocalizations.of(context)!;
final CupertinoLocalizations localizations = CupertinoLocalizations.of(context);
final bool isInAccessibilityMode = _isInAccessibilityMode(context);
final double textScaleFactor = MediaQuery.of(context)!.textScaleFactor;
return CupertinoUserInterfaceLevel(
......
......@@ -5,7 +5,7 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'date_picker.dart';
import 'debug.dart';
/// Determines the order of the columns inside [CupertinoDatePicker] in
/// time and date time mode.
......@@ -242,8 +242,11 @@ abstract class CupertinoLocalizations {
/// The `CupertinoLocalizations` from the closest [Localizations] instance
/// 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:
/// `Localizations.of<CupertinoLocalizations>(context, CupertinoLocalizations)`.
/// `Localizations.of<CupertinoLocalizations>(context, CupertinoLocalizations)!`.
///
/// References to the localized resources defined by this class are typically
/// written in terms of this method. For example:
......@@ -251,8 +254,9 @@ abstract class CupertinoLocalizations {
/// ```dart
/// CupertinoLocalizations.of(context).anteMeridiemAbbreviation;
/// ```
static CupertinoLocalizations? of(BuildContext context) {
return Localizations.of<CupertinoLocalizations>(context, CupertinoLocalizations);
static CupertinoLocalizations of(BuildContext context) {
debugCheckHasCupertinoLocalizations(context);
return Localizations.of<CupertinoLocalizations>(context, CupertinoLocalizations)!;
}
}
......
......@@ -1146,7 +1146,7 @@ Future<T?> showCupertinoDialog<T>({
return showGeneralDialog(
context: context,
barrierDismissible: barrierDismissible,
barrierLabel: CupertinoLocalizations.of(context)!.modalBarrierDismissLabel,
barrierLabel: CupertinoLocalizations.of(context).modalBarrierDismissLabel,
barrierColor: CupertinoDynamicColor.resolve(_kModalBarrierColor, context)!,
// This transition duration was eyeballed comparing with iOS
transitionDuration: const Duration(milliseconds: 250),
......
......@@ -152,7 +152,7 @@ class _CupertinoTextSelectionToolbarWrapperState extends State<_CupertinoTextSel
}
final List<Widget> items = <Widget>[];
final CupertinoLocalizations? localizations = CupertinoLocalizations.of(context);
final CupertinoLocalizations localizations = CupertinoLocalizations.of(context);
final EdgeInsets arrowPadding = widget.isArrowPointingDown
? EdgeInsets.only(bottom: _kToolbarArrowSize.height)
: EdgeInsets.only(top: _kToolbarArrowSize.height);
......@@ -183,17 +183,17 @@ class _CupertinoTextSelectionToolbarWrapperState extends State<_CupertinoTextSel
}
if (widget.handleCut != null) {
addToolbarButton(localizations!.cutButtonLabel, widget.handleCut!);
addToolbarButton(localizations.cutButtonLabel, widget.handleCut!);
}
if (widget.handleCopy != null) {
addToolbarButton(localizations!.copyButtonLabel, widget.handleCopy!);
addToolbarButton(localizations.copyButtonLabel, widget.handleCopy!);
}
if (widget.handlePaste != null
&& _clipboardStatus.value == ClipboardStatus.pasteable) {
addToolbarButton(localizations!.pasteButtonLabel, widget.handlePaste!);
addToolbarButton(localizations.pasteButtonLabel, widget.handlePaste!);
}
if (widget.handleSelectAll != null) {
addToolbarButton(localizations!.selectAllButtonLabel, widget.handleSelectAll!);
addToolbarButton(localizations.selectAllButtonLabel, widget.handleSelectAll!);
}
return CupertinoTextSelectionToolbar._(
......
......@@ -201,7 +201,7 @@ class AboutListTile extends StatelessWidget {
assert(debugCheckHasMaterialLocalizations(context));
return ListTile(
leading: icon,
title: child ?? Text(MaterialLocalizations.of(context)!.aboutListTileTitle(
title: child ?? Text(MaterialLocalizations.of(context).aboutListTileTitle(
applicationName ?? _defaultApplicationName(context),
)),
dense: dense,
......@@ -405,7 +405,7 @@ class AboutDialog extends StatelessWidget {
),
actions: <Widget>[
TextButton(
child: Text(MaterialLocalizations.of(context)!.viewLicensesButtonLabel),
child: Text(MaterialLocalizations.of(context).viewLicensesButtonLabel),
onPressed: () {
showLicensePage(
context: context,
......@@ -417,7 +417,7 @@ class AboutDialog extends StatelessWidget {
},
),
TextButton(
child: Text(MaterialLocalizations.of(context)!.closeButtonLabel),
child: Text(MaterialLocalizations.of(context).closeButtonLabel),
onPressed: () {
Navigator.pop(context);
},
......@@ -493,7 +493,7 @@ class _LicensePageState extends State<LicensePage> {
Widget build(BuildContext context) {
return _MasterDetailFlow(
detailPageFABlessGutterWidth: _getGutterSize(context),
title: Text(MaterialLocalizations.of(context)!.licensesPageTitle),
title: Text(MaterialLocalizations.of(context).licensesPageTitle),
detailPageBuilder: _packageLicensePage,
masterViewBuilder: _packagesView,
);
......@@ -720,7 +720,7 @@ class _PackageListTile extends StatelessWidget {
color: isSelected ? Theme.of(context)!.highlightColor : Theme.of(context)!.cardColor,
child: ListTile(
title: Text(packageName),
subtitle: Text(MaterialLocalizations.of(context)!.licensesPackageDetailText(numberLicenses)),
subtitle: Text(MaterialLocalizations.of(context).licensesPackageDetailText(numberLicenses)),
selected: isSelected,
onTap: onTap,
),
......@@ -890,7 +890,7 @@ class _PackageLicensePageState extends State<_PackageLicensePage> {
@override
Widget build(BuildContext context) {
assert(debugCheckHasMaterialLocalizations(context));
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
final ThemeData? theme = Theme.of(context);
final String title = widget.packageName;
final String subtitle = localizations.licensesPackageDetailText(widget.licenseEntries.length);
......
......@@ -543,7 +543,7 @@ class _AppBarState extends State<AppBar> {
leading = IconButton(
icon: const Icon(Icons.menu),
onPressed: _handleDrawerButton,
tooltip: MaterialLocalizations.of(context)!.openAppDrawerTooltip,
tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip,
);
} else {
if (!hasEndDrawer && canPop)
......@@ -616,7 +616,7 @@ class _AppBarState extends State<AppBar> {
actions = IconButton(
icon: const Icon(Icons.menu),
onPressed: _handleDrawerButtonEnd,
tooltip: MaterialLocalizations.of(context)!.openAppDrawerTooltip,
tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip,
);
}
......
......@@ -98,7 +98,7 @@ class BackButton extends StatelessWidget {
return IconButton(
icon: const BackButtonIcon(),
color: color,
tooltip: MaterialLocalizations.of(context)!.backButtonTooltip,
tooltip: MaterialLocalizations.of(context).backButtonTooltip,
onPressed: () {
if (onPressed != null) {
onPressed!();
......@@ -152,7 +152,7 @@ class CloseButton extends StatelessWidget {
return IconButton(
icon: const Icon(Icons.close),
color: color,
tooltip: MaterialLocalizations.of(context)!.closeButtonTooltip,
tooltip: MaterialLocalizations.of(context).closeButtonTooltip,
onPressed: () {
if (onPressed != null) {
onPressed!();
......
......@@ -823,7 +823,7 @@ class _BottomNavigationBarState extends State<BottomNavigationBar> with TickerPr
}
List<Widget> _createTiles() {
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
assert(localizations != null);
final ThemeData themeData = Theme.of(context)!;
......
......@@ -370,7 +370,7 @@ class _ModalBottomSheetState<T> extends State<_ModalBottomSheet<T>> {
assert(debugCheckHasMediaQuery(context));
assert(debugCheckHasMaterialLocalizations(context));
final MediaQueryData? mediaQuery = MediaQuery.of(context);
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
final String routeLabel = _getRouteLabel(localizations);
return AnimatedBuilder(
......@@ -671,7 +671,7 @@ Future<T?> showModalBottomSheet<T>({
builder: builder,
theme: Theme.of(context, shadowThemeOnly: true),
isScrollControlled: isScrollControlled,
barrierLabel: MaterialLocalizations.of(context)!.modalBarrierDismissLabel,
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
backgroundColor: backgroundColor,
elevation: elevation,
shape: shape,
......
......@@ -1789,7 +1789,7 @@ class _RawChipState extends State<RawChip> with TickerProviderStateMixin<RawChip
container: true,
button: true,
child: _wrapWithTooltip(
widget.deleteButtonTooltipMessage ?? MaterialLocalizations.of(context)?.deleteButtonTooltip,
widget.deleteButtonTooltipMessage ?? MaterialLocalizations.of(context).deleteButtonTooltip,
widget.onDeleted,
GestureDetector(
key: deleteIconKey,
......
......@@ -463,7 +463,7 @@ class AlertDialog extends StatelessWidget {
case TargetPlatform.fuchsia:
case TargetPlatform.linux:
case TargetPlatform.windows:
label ??= MaterialLocalizations.of(context)?.alertDialogLabel;
label ??= MaterialLocalizations.of(context).alertDialogLabel;
}
// The paddingScaleFactor is used to adjust the padding of Dialog's
......@@ -814,13 +814,12 @@ class SimpleDialog extends StatelessWidget {
switch (theme.platform) {
case TargetPlatform.macOS:
case TargetPlatform.iOS:
label = semanticLabel;
break;
case TargetPlatform.android:
case TargetPlatform.fuchsia:
case TargetPlatform.linux:
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;
},
barrierDismissible: barrierDismissible,
barrierLabel: MaterialLocalizations.of(context)!.modalBarrierDismissLabel,
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
barrierColor: barrierColor ?? Colors.black54,
transitionDuration: const Duration(milliseconds: 150),
transitionBuilder: _buildMaterialDialogTransitions,
......
......@@ -180,13 +180,12 @@ class Drawer extends StatelessWidget {
switch (Theme.of(context)!.platform) {
case TargetPlatform.iOS:
case TargetPlatform.macOS:
label = semanticLabel;
break;
case TargetPlatform.android:
case TargetPlatform.fuchsia:
case TargetPlatform.linux:
case TargetPlatform.windows:
label = semanticLabel ?? MaterialLocalizations.of(context)?.drawerLabel;
label = semanticLabel ?? MaterialLocalizations.of(context).drawerLabel;
}
return Semantics(
scopesRoute: true,
......@@ -566,7 +565,7 @@ class DrawerControllerState extends State<DrawerController> with SingleTickerPro
child: GestureDetector(
onTap: close,
child: Semantics(
label: MaterialLocalizations.of(context)?.modalBarrierDismissLabel,
label: MaterialLocalizations.of(context).modalBarrierDismissLabel,
child: MouseRegion(
opaque: true,
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
// in the first 0.25s.
assert(debugCheckHasMaterialLocalizations(context));
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
final _DropdownRoute<T> route = widget.route;
final List<Widget> children = <Widget>[
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,
theme: Theme.of(context, shadowThemeOnly: true),
style: _textStyle!,
barrierLabel: MaterialLocalizations.of(context)!.modalBarrierDismissLabel,
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
itemHeight: widget.itemHeight,
dropdownColor: widget.dropdownColor,
);
......
......@@ -167,7 +167,7 @@ class _ExpandIconState extends State<ExpandIcon> with SingleTickerProviderStateM
Widget build(BuildContext context) {
assert(debugCheckHasMaterial(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;
return Semantics(
......
......@@ -496,7 +496,7 @@ class _ExpansionPanelListState extends State<ExpansionPanelList> {
),
);
if (!child.canTapOnHeader) {
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
expandIconContainer = Semantics(
label: _isChildExpanded(index)? localizations.expandedIconTapHint : localizations.collapsedIconTapHint,
container: true,
......
......@@ -5,8 +5,7 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'reorderable_list.dart';
import 'text_theme.dart';
import 'debug.dart';
import 'time.dart';
import 'typography.dart';
......@@ -494,8 +493,11 @@ abstract class MaterialLocalizations {
/// The `MaterialLocalizations` from the closest [Localizations] instance
/// 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:
/// `Localizations.of<MaterialLocalizations>(context, MaterialLocalizations)`.
/// `Localizations.of<MaterialLocalizations>(context, MaterialLocalizations)!`.
///
/// References to the localized resources defined by this class are typically
/// written in terms of this method. For example:
......@@ -503,8 +505,9 @@ abstract class MaterialLocalizations {
/// ```dart
/// tooltip: MaterialLocalizations.of(context).backButtonTooltip,
/// ```
static MaterialLocalizations? of(BuildContext context) {
return Localizations.of<MaterialLocalizations>(context, MaterialLocalizations);
static MaterialLocalizations of(BuildContext context) {
debugCheckHasMaterialLocalizations(context);
return Localizations.of<MaterialLocalizations>(context, MaterialLocalizations)!;
}
}
......
......@@ -433,7 +433,7 @@ class _NavigationRailState extends State<NavigationRail> with TickerProviderStat
Widget build(BuildContext context) {
final ThemeData theme = Theme.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 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.
assert(debugCheckHasMaterialLocalizations(context));
final ThemeData themeData = Theme.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
// HEADER
final List<Widget> headerWidgets = <Widget>[];
double startPadding = 24.0;
......
......@@ -179,7 +179,7 @@ class _CalendarDatePickerState extends State<CalendarDatePicker> {
assert(debugCheckHasMaterial(context));
assert(debugCheckHasMaterialLocalizations(context));
assert(debugCheckHasDirectionality(context));
_localizations = MaterialLocalizations.of(context)!;
_localizations = MaterialLocalizations.of(context);
_textDirection = Directionality.of(context)!;
if (!_announcedInitialDate) {
_announcedInitialDate = true;
......@@ -380,7 +380,7 @@ class _DatePickerModeToggleButtonState extends State<_DatePickerModeToggleButton
children: <Widget>[
Flexible(
child: Semantics(
label: MaterialLocalizations.of(context)!.selectYearSemanticsLabel,
label: MaterialLocalizations.of(context).selectYearSemanticsLabel,
excludeSemantics: true,
button: true,
child: Container(
......@@ -524,7 +524,7 @@ class _MonthPickerState extends State<_MonthPicker> {
@override
void didChangeDependencies() {
super.didChangeDependencies();
_localizations = MaterialLocalizations.of(context)!;
_localizations = MaterialLocalizations.of(context);
_textDirection = Directionality.of(context);
}
......@@ -941,7 +941,7 @@ class _DayPickerState extends State<_DayPicker> {
@override
Widget build(BuildContext context) {
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 TextStyle? headerStyle = textTheme.caption?.apply(
color: colorScheme.onSurface.withOpacity(0.60),
......
......@@ -427,7 +427,7 @@ class _DayHeaders extends StatelessWidget {
final ThemeData themeData = Theme.of(context)!;
final ColorScheme colorScheme = themeData.colorScheme;
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);
// 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 ColorScheme colorScheme = theme.colorScheme;
final TextTheme textTheme = theme.textTheme;
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
final TextDirection? textDirection = Directionality.of(context);
final Color highlightColor = _highlightColor(context);
final int day = dayToBuild.day;
......@@ -818,7 +818,7 @@ class _MonthItemState extends State<_MonthItem> {
Widget build(BuildContext context) {
final ThemeData themeData = Theme.of(context)!;
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 month = widget.displayedMonth.month;
final int daysInMonth = utils.getDaysInMonth(year, month);
......
......@@ -239,7 +239,7 @@ class DayPicker extends StatelessWidget {
@override
Widget build(BuildContext 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 month = displayedMonth.month;
final int daysInMonth = getDaysInMonth(year, month);
......
......@@ -359,7 +359,7 @@ class _DatePickerDialogState extends State<_DatePickerDialog> {
Widget build(BuildContext context) {
final ThemeData theme = Theme.of(context)!;
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 TextTheme textTheme = theme.textTheme;
// 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 Orientation orientation = mediaQuery.orientation;
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 Size size;
......@@ -478,7 +478,7 @@ class _CalendarRangePickerDialog extends StatelessWidget {
Widget build(BuildContext context) {
final ThemeData theme = Theme.of(context)!;
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 TextTheme textTheme = theme.textTheme;
final Color headerForeground = colorScheme.brightness == Brightness.light
......@@ -615,7 +615,7 @@ class _InputDateRangePickerDialog extends StatelessWidget {
final String? helpText;
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 endText = utils.formatRangeEndDate(localizations, start, end, now);
if (start == null || end == null) {
......@@ -632,7 +632,7 @@ class _InputDateRangePickerDialog extends StatelessWidget {
Widget build(BuildContext context) {
final ThemeData theme = Theme.of(context)!;
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 TextTheme textTheme = theme.textTheme;
......
......@@ -157,7 +157,7 @@ class _InputDatePickerFormFieldState extends State<InputDatePickerFormField> {
void didChangeDependencies() {
super.didChangeDependencies();
if (_selectedDate != null) {
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
_inputText = localizations.formatCompactDate(_selectedDate!);
TextEditingValue textEditingValue = _controller.value.copyWith(text: _inputText);
// 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) {
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
return localizations.parseCompactDate(text);
}
......@@ -188,9 +188,9 @@ class _InputDatePickerFormFieldState extends State<InputDatePickerFormField> {
String? _validateDate(String? text) {
final DateTime? date = _parseDate(text);
if (date == null) {
return widget.errorFormatText ?? MaterialLocalizations.of(context)!.invalidDateFormatLabel;
return widget.errorFormatText ?? MaterialLocalizations.of(context).invalidDateFormatLabel;
} else if (!_isValidAcceptableDate(date)) {
return widget.errorInvalidText ?? MaterialLocalizations.of(context)!.dateOutOfRangeLabel;
return widget.errorInvalidText ?? MaterialLocalizations.of(context).dateOutOfRangeLabel;
}
return null;
}
......@@ -219,7 +219,7 @@ class _InputDatePickerFormFieldState extends State<InputDatePickerFormField> {
@override
Widget build(BuildContext context) {
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
final InputDecorationTheme inputTheme = Theme.of(context)!.inputDecorationTheme;
return TextFormField(
decoration: InputDecoration(
......
......@@ -141,7 +141,7 @@ class InputDateRangePickerState extends State<InputDateRangePicker> {
@override
void didChangeDependencies() {
super.didChangeDependencies();
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
if (_startDate != null) {
_startInputText = localizations.formatCompactDate(_startDate!);
final bool selectText = widget.autofocus && !_autoSelected;
......@@ -166,7 +166,7 @@ class InputDateRangePickerState extends State<InputDateRangePicker> {
final String? endError = _validateDate(_endDate);
if (startError == null && endError == null) {
if (_startDate!.isAfter(_endDate!)) {
startError = widget.errorInvalidRangeText ?? MaterialLocalizations.of(context)!.invalidDateRangeLabel;
startError = widget.errorInvalidRangeText ?? MaterialLocalizations.of(context).invalidDateRangeLabel;
}
}
setState(() {
......@@ -177,15 +177,15 @@ class InputDateRangePickerState extends State<InputDateRangePicker> {
}
DateTime? _parseDate(String? text) {
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
return localizations.parseCompactDate(text);
}
String? _validateDate(DateTime? date) {
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)) {
return widget.errorInvalidText ?? MaterialLocalizations.of(context)!.dateOutOfRangeLabel;
return widget.errorInvalidText ?? MaterialLocalizations.of(context).dateOutOfRangeLabel;
}
return null;
}
......@@ -225,7 +225,7 @@ class InputDateRangePickerState extends State<InputDateRangePicker> {
@override
Widget build(BuildContext context) {
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
final InputDecorationTheme inputTheme = Theme.of(context)!.inputDecorationTheme;
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
......
......@@ -848,17 +848,15 @@ Future<T?> showMenu<T>({
assert(captureInheritedThemes != null);
assert(debugCheckHasMaterialLocalizations(context));
String? label;
switch (Theme.of(context)!.platform) {
case TargetPlatform.iOS:
case TargetPlatform.macOS:
label = semanticLabel;
break;
case TargetPlatform.android:
case TargetPlatform.fuchsia:
case TargetPlatform.linux:
case TargetPlatform.windows:
label = semanticLabel ?? MaterialLocalizations.of(context)?.popupMenuLabel;
semanticLabel ??= MaterialLocalizations.of(context).popupMenuLabel;
}
return Navigator.of(context, rootNavigator: useRootNavigator)!.push(_PopupMenuRoute<T>(
......@@ -866,10 +864,10 @@ Future<T?> showMenu<T>({
items: items,
initialValue: initialValue,
elevation: elevation,
semanticLabel: label,
semanticLabel: semanticLabel,
theme: Theme.of(context, shadowThemeOnly: true),
popupMenuTheme: PopupMenuTheme.of(context),
barrierLabel: MaterialLocalizations.of(context)!.modalBarrierDismissLabel,
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
shape: shape,
color: color,
showMenuContext: context,
......@@ -1142,7 +1140,7 @@ class PopupMenuButtonState<T> extends State<PopupMenuButton<T>> {
if (widget.child != null)
return Tooltip(
message: widget.tooltip ?? MaterialLocalizations.of(context)!.showMenuTooltip,
message: widget.tooltip ?? MaterialLocalizations.of(context).showMenuTooltip,
child: InkWell(
onTap: widget.enabled ? showButtonMenu : null,
canRequestFocus: _canRequestFocus,
......@@ -1153,7 +1151,7 @@ class PopupMenuButtonState<T> extends State<PopupMenuButton<T>> {
return IconButton(
icon: widget.icon ?? _getIcon(Theme.of(context)!.platform),
padding: widget.padding,
tooltip: widget.tooltip ?? MaterialLocalizations.of(context)!.showMenuTooltip,
tooltip: widget.tooltip ?? MaterialLocalizations.of(context).showMenuTooltip,
onPressed: widget.enabled ? showButtonMenu : null,
);
}
......
......@@ -467,7 +467,7 @@ class RefreshIndicatorState extends State<RefreshIndicator> with TickerProviderS
animation: _positionController,
builder: (BuildContext context, Widget? child) {
return RefreshProgressIndicator(
semanticsLabel: widget.semanticsLabel ?? MaterialLocalizations.of(context)!.refreshIndicatorSemanticLabel,
semanticsLabel: widget.semanticsLabel ?? MaterialLocalizations.of(context).refreshIndicatorSemanticLabel,
semanticsValue: widget.semanticsValue,
value: showIndeterminateIndicator ? null : _value.value,
valueColor: _valueColor,
......
......@@ -402,7 +402,7 @@ class _ReorderableListContentState extends State<_ReorderableListContent> with T
// before index+2, which is after the space at index+1.
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 (index > 0) {
......
......@@ -479,7 +479,7 @@ class _SearchPageState<T> extends State<_SearchPage<T>> {
assert(debugCheckHasMaterialLocalizations(context));
final ThemeData theme = widget.delegate.appBarTheme(context);
final String searchFieldLabel = widget.delegate.searchFieldLabel
?? MaterialLocalizations.of(context)!.searchFieldLabel;
?? MaterialLocalizations.of(context).searchFieldLabel;
final TextStyle? searchFieldStyle = widget.delegate.searchFieldStyle
?? theme.inputDecorationTheme.hintStyle;
Widget? body;
......
......@@ -406,7 +406,7 @@ class _StepperState extends State<Stepper> with TickerProviderStateMixin {
final ThemeData themeData = Theme.of(context)!;
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 EdgeInsets buttonPadding = EdgeInsets.symmetric(horizontal: 16.0);
......
......@@ -1030,7 +1030,7 @@ class _TabBarState extends State<TabBar> {
}
return true;
}());
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
if (_controller!.length == 0) {
return Container(
height: _kTabHeight + widget.indicatorWeight,
......
......@@ -865,7 +865,7 @@ class _TextFieldState extends State<TextField> with RestorationMixin implements
bool get _hasError => widget.decoration?.errorText != null || _hasIntrinsicError;
InputDecoration _getEffectiveDecoration() {
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
final ThemeData themeData = Theme.of(context)!;
final InputDecoration effectiveDecoration = (widget.decoration ?? const InputDecoration())
.applyDefaults(themeData.inputDecorationTheme)
......
......@@ -183,7 +183,7 @@ class _TextSelectionToolbarState extends State<_TextSelectionToolbar> with Ticke
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>[
if (widget.handleCut != null)
_ItemData(widget.handleCut!, localizations.cutButtonLabel),
......
......@@ -132,7 +132,7 @@ class Theme extends StatelessWidget {
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 ThemeData theme = inheritedTheme?.theme.data ?? _kFallbackTheme;
return ThemeData.localize(theme, theme.typography.geometryThemeFor(category));
......
......@@ -104,7 +104,7 @@ class TimeOfDay {
String format(BuildContext context) {
assert(debugCheckHasMediaQuery(context));
assert(debugCheckHasMaterialLocalizations(context));
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
return localizations.formatTimeOfDay(
this,
alwaysUse24HourFormat: MediaQuery.of(context)!.alwaysUse24HourFormat,
......
......@@ -134,7 +134,7 @@ class _TimePickerHeader extends StatelessWidget {
Widget build(BuildContext context) {
assert(debugCheckHasMediaQuery(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,
);
......@@ -241,7 +241,7 @@ class _TimePickerHeader extends StatelessWidget {
children: <Widget>[
const SizedBox(height: 16.0),
Text(
helpText ?? MaterialLocalizations.of(context)!.timePickerDialHelpText,
helpText ?? MaterialLocalizations.of(context).timePickerDialHelpText,
style: TimePickerTheme.of(context).helpTextStyle ?? themeData.textTheme.overline,
),
controls,
......@@ -322,7 +322,7 @@ class _HourControl extends StatelessWidget {
Widget build(BuildContext context) {
assert(debugCheckHasMediaQuery(context));
final bool alwaysUse24HourFormat = MediaQuery.of(context)!.alwaysUse24HourFormat;
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
final String formattedHour = localizations.formatHour(
fragmentContext.selectedTime,
alwaysUse24HourFormat: alwaysUse24HourFormat,
......@@ -432,7 +432,7 @@ class _MinuteControl extends StatelessWidget {
@override
Widget build(BuildContext context) {
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
final String formattedMinute = localizations.formatMinute(fragmentContext.selectedTime);
final TimeOfDay nextMinute = fragmentContext.selectedTime.replacing(
minute: (fragmentContext.selectedTime.minute + 1) % TimeOfDay.minutesPerHour,
......@@ -493,7 +493,7 @@ class _DayPeriodControl extends StatelessWidget {
case TargetPlatform.fuchsia:
case TargetPlatform.linux:
case TargetPlatform.windows:
_announceToAccessibility(context, MaterialLocalizations.of(context)!.anteMeridiemAbbreviation);
_announceToAccessibility(context, MaterialLocalizations.of(context).anteMeridiemAbbreviation);
break;
case TargetPlatform.iOS:
case TargetPlatform.macOS:
......@@ -511,7 +511,7 @@ class _DayPeriodControl extends StatelessWidget {
case TargetPlatform.fuchsia:
case TargetPlatform.linux:
case TargetPlatform.windows:
_announceToAccessibility(context, MaterialLocalizations.of(context)!.postMeridiemAbbreviation);
_announceToAccessibility(context, MaterialLocalizations.of(context).postMeridiemAbbreviation);
break;
case TargetPlatform.iOS:
case TargetPlatform.macOS:
......@@ -522,7 +522,7 @@ class _DayPeriodControl extends StatelessWidget {
@override
Widget build(BuildContext context) {
final MaterialLocalizations materialLocalizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations materialLocalizations = MaterialLocalizations.of(context);
final ColorScheme colorScheme = Theme.of(context)!.colorScheme;
final TimePickerThemeData timePickerTheme = TimePickerTheme.of(context);
final bool isDark = colorScheme.brightness == Brightness.dark;
......@@ -941,7 +941,7 @@ class _DialState extends State<_Dial> with SingleTickerProviderStateMixin {
super.didChangeDependencies();
assert(debugCheckHasMediaQuery(context));
themeData = Theme.of(context)!;
localizations = MaterialLocalizations.of(context)!;
localizations = MaterialLocalizations.of(context);
media = MediaQuery.of(context)!;
}
......@@ -1409,7 +1409,7 @@ class _TimePickerInputState extends State<_TimePickerInput> {
Widget build(BuildContext context) {
assert(debugCheckHasMediaQuery(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 ThemeData theme = Theme.of(context)!;
final TextStyle hourMinuteStyle = TimePickerTheme.of(context).hourMinuteTextStyle ?? theme.textTheme.headline2!;
......@@ -1420,7 +1420,7 @@ class _TimePickerInputState extends State<_TimePickerInput> {
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
widget.helpText ?? MaterialLocalizations.of(context)!.timePickerInputHelpText,
widget.helpText ?? MaterialLocalizations.of(context).timePickerInputHelpText,
style: TimePickerTheme.of(context).helpTextStyle ?? theme.textTheme.overline,
),
const SizedBox(height: 16.0),
......@@ -1458,7 +1458,7 @@ class _TimePickerInputState extends State<_TimePickerInput> {
if (!hourHasError && !minuteHasError)
ExcludeSemantics(
child: Text(
MaterialLocalizations.of(context)!.timePickerHourLabel,
MaterialLocalizations.of(context).timePickerHourLabel,
style: theme.textTheme.caption,
maxLines: 1,
overflow: TextOverflow.ellipsis,
......@@ -1488,7 +1488,7 @@ class _TimePickerInputState extends State<_TimePickerInput> {
if (!hourHasError && !minuteHasError)
ExcludeSemantics(
child: Text(
MaterialLocalizations.of(context)!.timePickerMinuteLabel,
MaterialLocalizations.of(context).timePickerMinuteLabel,
style: theme.textTheme.caption,
maxLines: 1,
overflow: TextOverflow.ellipsis,
......@@ -1512,7 +1512,7 @@ class _TimePickerInputState extends State<_TimePickerInput> {
),
if (hourHasError || minuteHasError)
Text(
MaterialLocalizations.of(context)!.invalidTimeLabel,
MaterialLocalizations.of(context).invalidTimeLabel,
style: theme.textTheme.bodyText2!.copyWith(color: theme.colorScheme.error),
)
else
......@@ -1548,7 +1548,7 @@ class _HourTextField extends StatelessWidget {
isHour: true,
autofocus: autofocus,
style: style,
semanticHintText: MaterialLocalizations.of(context)!.timePickerHourLabel,
semanticHintText: MaterialLocalizations.of(context).timePickerHourLabel,
validator: validator,
onSavedSubmitted: onSavedSubmitted,
onChanged: onChanged,
......@@ -1579,7 +1579,7 @@ class _MinuteTextField extends StatelessWidget {
isHour: false,
autofocus: autofocus,
style: style,
semanticHintText: MaterialLocalizations.of(context)!.timePickerMinuteLabel,
semanticHintText: MaterialLocalizations.of(context).timePickerMinuteLabel,
validator: validator,
onSavedSubmitted: onSavedSubmitted,
);
......@@ -1632,7 +1632,7 @@ class _HourMinuteTextFieldState extends State<_HourMinuteTextField> {
String get _formattedValue {
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(
widget.selectedTime,
alwaysUse24HourFormat: alwaysUse24HourFormat,
......@@ -1770,7 +1770,7 @@ class _TimePickerDialogState extends State<_TimePickerDialog> {
@override
void didChangeDependencies() {
super.didChangeDependencies();
localizations = MaterialLocalizations.of(context)!;
localizations = MaterialLocalizations.of(context);
_announceInitialTimeOnce();
_announceModeOnce();
}
......@@ -1855,7 +1855,7 @@ class _TimePickerDialogState extends State<_TimePickerDialog> {
return;
final MediaQueryData media = MediaQuery.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
_announceToAccessibility(
context,
localizations.formatTimeOfDay(widget.initialTime, alwaysUse24HourFormat: media.alwaysUse24HourFormat),
......@@ -1957,8 +1957,8 @@ class _TimePickerDialogState extends State<_TimePickerDialog> {
onPressed: _handleEntryModeToggle,
icon: Icon(_entryMode == TimePickerEntryMode.dial ? Icons.keyboard : Icons.access_time),
tooltip: _entryMode == TimePickerEntryMode.dial
? MaterialLocalizations.of(context)!.inputTimeModeButtonLabel
: MaterialLocalizations.of(context)!.dialModeButtonLabel,
? MaterialLocalizations.of(context).inputTimeModeButtonLabel
: MaterialLocalizations.of(context).dialModeButtonLabel,
),
Expanded(
child: Container(
......
......@@ -134,7 +134,7 @@ class _AccountDetailsState extends State<_AccountDetails> with SingleTickerProvi
assert(debugCheckHasMaterialLocalizations(context));
final ThemeData theme = Theme.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
Widget accountDetails = CustomMultiChildLayout(
delegate: _AccountDetailsLayout(
......@@ -356,7 +356,7 @@ class _UserAccountsDrawerHeaderState extends State<UserAccountsDrawerHeader> {
assert(debugCheckHasMaterialLocalizations(context));
return Semantics(
container: true,
label: MaterialLocalizations.of(context)!.signedInLabel,
label: MaterialLocalizations.of(context).signedInLabel,
child: DrawerHeader(
decoration: widget.decoration ?? BoxDecoration(
color: Theme.of(context)!.primaryColor,
......
......@@ -50,8 +50,8 @@ void main() {
builder: (BuildContext context) {
return Column(
children: <Widget>[
Text(CupertinoLocalizations.of(context)!.selectAllButtonLabel),
Text(CupertinoLocalizations.of(context)!.datePickerMediumDate(
Text(CupertinoLocalizations.of(context).selectAllButtonLabel),
Text(CupertinoLocalizations.of(context).datePickerMediumDate(
DateTime(2018, 10, 4),
)),
],
......
// 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);
});
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) {
return Column(
children: <Widget>[
Text(MaterialLocalizations.of(context)!.selectAllButtonLabel),
Text(CupertinoLocalizations.of(context)!.selectAllButtonLabel),
Text(MaterialLocalizations.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(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 {
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.pumpAndSettle(const Duration(seconds: 1));
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment