diff --git a/examples/layers/widgets/media_query.dart b/examples/layers/widgets/media_query.dart index c62e97b056c..2c36aa37fb0 100644 --- a/examples/layers/widgets/media_query.dart +++ b/examples/layers/widgets/media_query.dart @@ -71,7 +71,7 @@ class AdaptiveContainer extends StatelessWidget { @override Widget build(BuildContext context) { - if (MediaQuery.of(context)!.size.width < _kGridViewBreakpoint) { + if (MediaQuery.of(context).size.width < _kGridViewBreakpoint) { return ListView( itemExtent: _kListItemExtent, children: names.map((String name) => AdaptedListItem(name: name)).toList(), diff --git a/packages/flutter/lib/src/cupertino/action_sheet.dart b/packages/flutter/lib/src/cupertino/action_sheet.dart index 13754dead1d..f9b54c413a1 100644 --- a/packages/flutter/lib/src/cupertino/action_sheet.dart +++ b/packages/flutter/lib/src/cupertino/action_sheet.dart @@ -274,12 +274,12 @@ class CupertinoActionSheet extends StatelessWidget { if (cancelButton != null) _buildCancelButton(), ]; - final Orientation orientation = MediaQuery.of(context)!.orientation; + final Orientation orientation = MediaQuery.of(context).orientation; final double actionSheetWidth; if (orientation == Orientation.portrait) { - actionSheetWidth = MediaQuery.of(context)!.size.width - (_kEdgeHorizontalPadding * 2); + actionSheetWidth = MediaQuery.of(context).size.width - (_kEdgeHorizontalPadding * 2); } else { - actionSheetWidth = MediaQuery.of(context)!.size.height - (_kEdgeHorizontalPadding * 2); + actionSheetWidth = MediaQuery.of(context).size.height - (_kEdgeHorizontalPadding * 2); } return SafeArea( @@ -449,7 +449,7 @@ class _CupertinoAlertRenderWidget extends RenderObjectWidget { RenderObject createRenderObject(BuildContext context) { assert(debugCheckHasMediaQuery(context)); return _RenderCupertinoAlert( - dividerThickness: _kDividerThickness / MediaQuery.of(context)!.devicePixelRatio, + dividerThickness: _kDividerThickness / MediaQuery.of(context).devicePixelRatio, dividerColor: CupertinoDynamicColor.resolve(_kButtonDividerColor, context)!, ); } @@ -944,7 +944,7 @@ class _CupertinoAlertActionSection extends StatefulWidget { class _CupertinoAlertActionSectionState extends State<_CupertinoAlertActionSection> { @override Widget build(BuildContext context) { - final double devicePixelRatio = MediaQuery.of(context)!.devicePixelRatio; + final double devicePixelRatio = MediaQuery.of(context).devicePixelRatio; final List interactiveButtons = []; for (int i = 0; i < widget.children.length; i += 1) { diff --git a/packages/flutter/lib/src/cupertino/bottom_tab_bar.dart b/packages/flutter/lib/src/cupertino/bottom_tab_bar.dart index 862eb5b57eb..be026dce572 100644 --- a/packages/flutter/lib/src/cupertino/bottom_tab_bar.dart +++ b/packages/flutter/lib/src/cupertino/bottom_tab_bar.dart @@ -143,7 +143,7 @@ class CupertinoTabBar extends StatelessWidget implements PreferredSizeWidget { @override Widget build(BuildContext context) { assert(debugCheckHasMediaQuery(context)); - final double bottomPadding = MediaQuery.of(context)!.padding.bottom; + final double bottomPadding = MediaQuery.of(context).padding.bottom; final Color? backgroundColor = CupertinoDynamicColor.resolve( this.backgroundColor ?? CupertinoTheme.of(context).barBackgroundColor, diff --git a/packages/flutter/lib/src/cupertino/colors.dart b/packages/flutter/lib/src/cupertino/colors.dart index a2c1f35caba..ea08c505a36 100644 --- a/packages/flutter/lib/src/cupertino/colors.dart +++ b/packages/flutter/lib/src/cupertino/colors.dart @@ -944,13 +944,18 @@ class CupertinoDynamicColor extends Color with Diagnosticable { /// level), unless [nullOk] is set to false, in which case an exception will be /// thrown. CupertinoDynamicColor resolveFrom(BuildContext context, { bool nullOk = true }) { - final Brightness brightness = _isPlatformBrightnessDependent - ? CupertinoTheme.brightnessOf(context, nullOk: nullOk) ?? Brightness.light - : Brightness.light; - - final bool isHighContrastEnabled = _isHighContrastDependent - && (MediaQuery.of(context, nullOk: nullOk)?.highContrast ?? false); - + Brightness brightness = Brightness.light; + if (_isPlatformBrightnessDependent) { + brightness = nullOk + ? CupertinoTheme.maybeBrightnessOf(context) ?? Brightness.light + : CupertinoTheme.brightnessOf(context); + } + bool isHighContrastEnabled = false; + if (_isHighContrastDependent) { + isHighContrastEnabled = nullOk + ? MediaQuery.maybeOf(context)?.highContrast ?? false + : MediaQuery.of(context).highContrast; + } final CupertinoUserInterfaceLevelData level = _isInterfaceElevationDependent ? CupertinoUserInterfaceLevel.of(context, nullOk: nullOk) ?? CupertinoUserInterfaceLevelData.base diff --git a/packages/flutter/lib/src/cupertino/context_menu.dart b/packages/flutter/lib/src/cupertino/context_menu.dart index eaeb4e52f9d..f6b509a9d67 100644 --- a/packages/flutter/lib/src/cupertino/context_menu.dart +++ b/packages/flutter/lib/src/cupertino/context_menu.dart @@ -253,7 +253,7 @@ class _CupertinoContextMenuState extends State with Ticker // it. _ContextMenuLocation get _contextMenuLocation { final Rect childRect = _getRect(_childGlobalKey); - final double screenWidth = MediaQuery.of(context)!.size.width; + final double screenWidth = MediaQuery.of(context).size.width; final double center = screenWidth / 2; final bool centerDividesChild = childRect.left < center @@ -1081,7 +1081,7 @@ class _ContextMenuRouteStaticState extends State<_ContextMenuRouteStatic> with T Widget _buildChildAnimation(BuildContext context, Widget? child) { _lastScale = _getScale( widget.orientation, - MediaQuery.of(context)!.size.height, + MediaQuery.of(context).size.height, _moveAnimation.value.dy, ); return Transform.scale( diff --git a/packages/flutter/lib/src/cupertino/date_picker.dart b/packages/flutter/lib/src/cupertino/date_picker.dart index e7e40f581fc..1b361c4ba25 100644 --- a/packages/flutter/lib/src/cupertino/date_picker.dart +++ b/packages/flutter/lib/src/cupertino/date_picker.dart @@ -1032,7 +1032,7 @@ class _CupertinoDatePickerDateTimeState extends State { } return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: 1.0), + data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0), child: DefaultTextStyle.merge( style: _kDefaultPickerTextStyle, child: CustomMultiChildLayout( @@ -1403,7 +1403,7 @@ class _CupertinoDatePickerDateState extends State { } return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: 1.0), + data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0), child: DefaultTextStyle.merge( style: _kDefaultPickerTextStyle, child: CustomMultiChildLayout( @@ -2077,7 +2077,7 @@ class _CupertinoTimerPickerState extends State { return MediaQuery( // The native iOS picker's text scaling is fixed, so we will also fix it // as well in our picker. - data: MediaQuery.of(context)!.copyWith(textScaleFactor: 1.0), + data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0), child: CupertinoTheme( data: themeData.copyWith( textTheme: themeData.textTheme.copyWith( diff --git a/packages/flutter/lib/src/cupertino/dialog.dart b/packages/flutter/lib/src/cupertino/dialog.dart index cac46fe10a7..5cb7200c489 100644 --- a/packages/flutter/lib/src/cupertino/dialog.dart +++ b/packages/flutter/lib/src/cupertino/dialog.dart @@ -95,7 +95,7 @@ const double _kMaxRegularTextScaleFactor = 1.4; // Accessibility mode on iOS is determined by the text scale factor that the // user has selected. bool _isInAccessibilityMode(BuildContext context) { - final MediaQueryData? data = MediaQuery.of(context, nullOk: true); + final MediaQueryData? data = MediaQuery.maybeOf(context); return data != null && data.textScaleFactor > _kMaxRegularTextScaleFactor; } @@ -228,18 +228,18 @@ class CupertinoAlertDialog extends StatelessWidget { Widget build(BuildContext context) { final CupertinoLocalizations localizations = CupertinoLocalizations.of(context); final bool isInAccessibilityMode = _isInAccessibilityMode(context); - final double textScaleFactor = MediaQuery.of(context)!.textScaleFactor; + final double textScaleFactor = MediaQuery.of(context).textScaleFactor; return CupertinoUserInterfaceLevel( data: CupertinoUserInterfaceLevelData.elevated, child: MediaQuery( - data: MediaQuery.of(context)!.copyWith( + data: MediaQuery.of(context).copyWith( // iOS does not shrink dialog content below a 1.0 scale factor textScaleFactor: math.max(textScaleFactor, 1.0), ), child: LayoutBuilder( builder: (BuildContext context, BoxConstraints constraints) { return AnimatedPadding( - padding: MediaQuery.of(context)!.viewInsets + + padding: MediaQuery.of(context).viewInsets + const EdgeInsets.symmetric(horizontal: 40.0, vertical: 24.0), duration: insetAnimationDuration, curve: insetAnimationCurve, @@ -388,7 +388,7 @@ class _CupertinoDialogRenderWidget extends RenderObjectWidget { @override RenderObject createRenderObject(BuildContext context) { return _RenderCupertinoDialog( - dividerThickness: _kDividerThickness / MediaQuery.of(context)!.devicePixelRatio, + dividerThickness: _kDividerThickness / MediaQuery.of(context).devicePixelRatio, isInAccessibilityMode: _isInAccessibilityMode(context), dividerColor: CupertinoDynamicColor.resolve(CupertinoColors.separator, context)!, ); @@ -877,7 +877,7 @@ class _CupertinoAlertContentSection extends StatelessWidget { ); } - final double textScaleFactor = MediaQuery.of(context)!.textScaleFactor; + final double textScaleFactor = MediaQuery.of(context).textScaleFactor; final List titleContentGroup = [ if (title != null) Padding( @@ -954,7 +954,7 @@ class _CupertinoAlertActionSection extends StatefulWidget { class _CupertinoAlertActionSectionState extends State<_CupertinoAlertActionSection> { @override Widget build(BuildContext context) { - final double devicePixelRatio = MediaQuery.of(context)!.devicePixelRatio; + final double devicePixelRatio = MediaQuery.of(context).devicePixelRatio; final List interactiveButtons = []; for (int i = 0; i < widget.children.length; i += 1) { diff --git a/packages/flutter/lib/src/cupertino/nav_bar.dart b/packages/flutter/lib/src/cupertino/nav_bar.dart index 0ae25905c4e..11e39678cf6 100644 --- a/packages/flutter/lib/src/cupertino/nav_bar.dart +++ b/packages/flutter/lib/src/cupertino/nav_bar.dart @@ -713,7 +713,7 @@ class _CupertinoSliverNavigationBarState extends State { Widget build(BuildContext context) { Widget paddedContent = widget.child; - final MediaQueryData existingMediaQuery = MediaQuery.of(context)!; + final MediaQueryData existingMediaQuery = MediaQuery.of(context); if (widget.navigationBar != null) { // TODO(xster): Use real size after partial layout instead of preferred size. // https://github.com/flutter/flutter/issues/12912 diff --git a/packages/flutter/lib/src/cupertino/route.dart b/packages/flutter/lib/src/cupertino/route.dart index d32f7d4e667..40e7fea836a 100644 --- a/packages/flutter/lib/src/cupertino/route.dart +++ b/packages/flutter/lib/src/cupertino/route.dart @@ -691,8 +691,8 @@ class _CupertinoBackGestureDetectorState extends State<_CupertinoBackGestureD // For devices with notches, the drag area needs to be larger on the side // that has the notch. double dragAreaWidth = Directionality.of(context) == TextDirection.ltr ? - MediaQuery.of(context)!.padding.left : - MediaQuery.of(context)!.padding.right; + MediaQuery.of(context).padding.left : + MediaQuery.of(context).padding.right; dragAreaWidth = max(dragAreaWidth, _kBackGestureWidth); return Stack( fit: StackFit.passthrough, diff --git a/packages/flutter/lib/src/cupertino/scrollbar.dart b/packages/flutter/lib/src/cupertino/scrollbar.dart index 5b4b7384692..0588345b465 100644 --- a/packages/flutter/lib/src/cupertino/scrollbar.dart +++ b/packages/flutter/lib/src/cupertino/scrollbar.dart @@ -285,7 +285,7 @@ class _CupertinoScrollbarState extends State with TickerProv _painter! ..textDirection = Directionality.of(context)! ..color = CupertinoDynamicColor.resolve(_kScrollbarColor, context)! - ..padding = MediaQuery.of(context)!.padding; + ..padding = MediaQuery.of(context).padding; } _triggerScrollbar(); } @@ -315,7 +315,7 @@ class _CupertinoScrollbarState extends State with TickerProv mainAxisMargin: _kScrollbarMainAxisMargin, crossAxisMargin: _kScrollbarCrossAxisMargin, radius: _radius, - padding: MediaQuery.of(context)!.padding, + padding: MediaQuery.of(context).padding, minLength: _kScrollbarMinLength, minOverscrollLength: _kScrollbarMinOverscrollLength, ); diff --git a/packages/flutter/lib/src/cupertino/tab_scaffold.dart b/packages/flutter/lib/src/cupertino/tab_scaffold.dart index 306a6ecb7aa..49503aaefac 100644 --- a/packages/flutter/lib/src/cupertino/tab_scaffold.dart +++ b/packages/flutter/lib/src/cupertino/tab_scaffold.dart @@ -388,8 +388,8 @@ class _CupertinoTabScaffoldState extends State with Restor @override Widget build(BuildContext context) { - final MediaQueryData existingMediaQuery = MediaQuery.of(context)!; - MediaQueryData newMediaQuery = MediaQuery.of(context)!; + final MediaQueryData existingMediaQuery = MediaQuery.of(context); + MediaQueryData newMediaQuery = MediaQuery.of(context); Widget content = _TabSwitchingView( currentTabIndex: _controller.index, diff --git a/packages/flutter/lib/src/cupertino/text_field.dart b/packages/flutter/lib/src/cupertino/text_field.dart index aee197b982c..d2eadf20ba5 100644 --- a/packages/flutter/lib/src/cupertino/text_field.dart +++ b/packages/flutter/lib/src/cupertino/text_field.dart @@ -881,7 +881,7 @@ class _CupertinoTextFieldState extends State with Restoratio final List formatters = widget.inputFormatters ?? []; final TextSelectionControls textSelectionControls = widget.selectionControls ?? cupertinoTextSelectionControls; final bool enabled = widget.enabled ?? true; - final Offset cursorOffset = Offset(_iOSHorizontalCursorOffsetPixels / MediaQuery.of(context)!.devicePixelRatio, 0); + final Offset cursorOffset = Offset(_iOSHorizontalCursorOffsetPixels / MediaQuery.of(context).devicePixelRatio, 0); if (widget.maxLength != null && widget.maxLengthEnforced) { formatters.add(LengthLimitingTextInputFormatter(widget.maxLength)); } @@ -901,7 +901,7 @@ class _CupertinoTextFieldState extends State with Restoratio final TextStyle placeholderStyle = textStyle.merge(resolvedPlaceholderStyle); - final Brightness keyboardAppearance = widget.keyboardAppearance ?? CupertinoTheme.brightnessOf(context)!; + final Brightness keyboardAppearance = widget.keyboardAppearance ?? CupertinoTheme.brightnessOf(context); final Color cursorColor = CupertinoDynamicColor.resolve(widget.cursorColor, context) ?? themeData.primaryColor; final Color? disabledColor = CupertinoDynamicColor.resolve(_kDisabledBackground, context); diff --git a/packages/flutter/lib/src/cupertino/text_selection.dart b/packages/flutter/lib/src/cupertino/text_selection.dart index 8e93c90d1fc..17c9a3ab0ce 100644 --- a/packages/flutter/lib/src/cupertino/text_selection.dart +++ b/packages/flutter/lib/src/cupertino/text_selection.dart @@ -157,7 +157,7 @@ class _CupertinoTextSelectionToolbarWrapperState extends State<_CupertinoTextSel ? EdgeInsets.only(bottom: _kToolbarArrowSize.height) : EdgeInsets.only(top: _kToolbarArrowSize.height); final Widget onePhysicalPixelVerticalDivider = - SizedBox(width: 1.0 / MediaQuery.of(context)!.devicePixelRatio); + SizedBox(width: 1.0 / MediaQuery.of(context).devicePixelRatio); void addToolbarButton( String text, @@ -463,7 +463,7 @@ class _CupertinoTextSelectionControls extends TextSelectionControls { ClipboardStatusNotifier clipboardStatus, ) { assert(debugCheckHasMediaQuery(context)); - final MediaQueryData mediaQuery = MediaQuery.of(context)!; + final MediaQueryData mediaQuery = MediaQuery.of(context); // The toolbar should appear below the TextField when there is not enough // space above the TextField to show it, assuming there's always enough space @@ -664,7 +664,7 @@ class _CupertinoTextSelectionToolbarContentState extends State<_CupertinoTextSel pressedOpacity: 0.7, child: const Text('◀', style: _kToolbarButtonFontStyle), ), - dividerWidth: 1.0 / MediaQuery.of(context)!.devicePixelRatio, + dividerWidth: 1.0 / MediaQuery.of(context).devicePixelRatio, nextButton: CupertinoButton( borderRadius: null, color: _kToolbarBackgroundColor, diff --git a/packages/flutter/lib/src/cupertino/theme.dart b/packages/flutter/lib/src/cupertino/theme.dart index 461c77470ad..7a92981f08d 100644 --- a/packages/flutter/lib/src/cupertino/theme.dart +++ b/packages/flutter/lib/src/cupertino/theme.dart @@ -78,15 +78,37 @@ class CupertinoTheme extends StatelessWidget { /// is null, it will fall back to [MediaQueryData.platformBrightness]. /// /// Throws an exception if no valid [CupertinoTheme] or [MediaQuery] widgets - /// exist in the ancestry tree, unless [nullOk] is set to true. + /// exist in the ancestry tree. + /// + /// See also: + /// + /// * [maybeBrightnessOf], which returns null if no valid [CupertinoTheme] or + /// [MediaQuery] exists, instead of throwing. + /// * [CupertinoThemeData.brightness], the property takes precedence over + /// [MediaQueryData.platformBrightness] for descendant Cupertino widgets. + static Brightness brightnessOf(BuildContext context) { + final _InheritedCupertinoTheme? inheritedTheme = context.dependOnInheritedWidgetOfExactType<_InheritedCupertinoTheme>(); + return inheritedTheme?.theme.data.brightness ?? MediaQuery.of(context).platformBrightness; + } + + /// Retrieves the [Brightness] to use for descendant Cupertino widgets, based + /// on the value of [CupertinoThemeData.brightness] in the given [context]. + /// + /// If no [CupertinoTheme] can be found in the given [context], it will fall + /// back to [MediaQueryData.platformBrightness]. + /// + /// Returns null if no valid [CupertinoTheme] or [MediaQuery] widgets exist in + /// the ancestry tree. /// /// See also: /// /// * [CupertinoThemeData.brightness], the property takes precedence over /// [MediaQueryData.platformBrightness] for descendant Cupertino widgets. - static Brightness? brightnessOf(BuildContext context, { bool nullOk = false }) { + /// * [brightnessOf], which throws if no valid [CupertinoTheme] or + /// [MediaQuery] exists, instead of returning null. + static Brightness? maybeBrightnessOf(BuildContext context) { final _InheritedCupertinoTheme? inheritedTheme = context.dependOnInheritedWidgetOfExactType<_InheritedCupertinoTheme>(); - return inheritedTheme?.theme.data.brightness ?? MediaQuery.of(context, nullOk: nullOk)?.platformBrightness; + return inheritedTheme?.theme.data.brightness ?? MediaQuery.maybeOf(context)?.platformBrightness; } /// The widget below this widget in the tree. diff --git a/packages/flutter/lib/src/material/about.dart b/packages/flutter/lib/src/material/about.dart index b09ccf20bc5..3a705d4c217 100644 --- a/packages/flutter/lib/src/material/about.dart +++ b/packages/flutter/lib/src/material/about.dart @@ -1018,7 +1018,7 @@ const double _wideGutterSize = 24.0; const double _narrowGutterSize = 12.0; double _getGutterSize(BuildContext context) => - MediaQuery.of(context)!.size.width >= _materialGutterThreshold ? _wideGutterSize : _narrowGutterSize; + MediaQuery.of(context).size.width >= _materialGutterThreshold ? _wideGutterSize : _narrowGutterSize; /// Signature for the builder callback used by [_MasterDetailFlow]. typedef _MasterViewBuilder = Widget Function(BuildContext context, bool isLateralUI); @@ -1627,7 +1627,7 @@ class _DetailView extends StatelessWidget { if (_arguments == null) { return Container(); } - final double screenHeight = MediaQuery.of(context)!.size.height; + final double screenHeight = MediaQuery.of(context).size.height; final double minHeight = (screenHeight - kToolbarHeight) / screenHeight; return DraggableScrollableSheet( diff --git a/packages/flutter/lib/src/material/app_bar.dart b/packages/flutter/lib/src/material/app_bar.dart index 4abd2f8a303..a2ef079f64c 100644 --- a/packages/flutter/lib/src/material/app_bar.dart +++ b/packages/flutter/lib/src/material/app_bar.dart @@ -593,7 +593,7 @@ class _AppBarState extends State { // sizes. To opt out, wrap the [title] widget in a [MediaQuery] widget // with [MediaQueryData.textScaleFactor] set to // `MediaQuery.textScaleFactorOf(context)`. - final MediaQueryData mediaQueryData = MediaQuery.of(context)!; + final MediaQueryData mediaQueryData = MediaQuery.of(context); title = MediaQuery( data: mediaQueryData.copyWith( textScaleFactor: math.min( @@ -1447,7 +1447,7 @@ class _SliverAppBarState extends State with TickerProviderStateMix Widget build(BuildContext context) { assert(!widget.primary || debugCheckHasMediaQuery(context)); final double bottomHeight = widget.bottom?.preferredSize.height ?? 0.0; - final double topPadding = widget.primary ? MediaQuery.of(context)!.padding.top : 0.0; + final double topPadding = widget.primary ? MediaQuery.of(context).padding.top : 0.0; final double collapsedHeight = (widget.pinned && widget.floating && widget.bottom != null) ? (widget.collapsedHeight ?? 0.0) + bottomHeight + topPadding : (widget.collapsedHeight ?? widget.toolbarHeight) + bottomHeight + topPadding; diff --git a/packages/flutter/lib/src/material/bottom_navigation_bar.dart b/packages/flutter/lib/src/material/bottom_navigation_bar.dart index f726d804a9f..a7742936519 100644 --- a/packages/flutter/lib/src/material/bottom_navigation_bar.dart +++ b/packages/flutter/lib/src/material/bottom_navigation_bar.dart @@ -657,7 +657,7 @@ class _Label extends StatelessWidget { if (item.label != null) { // Do not grow text in bottom navigation bar when we can show a tooltip // instead. - final MediaQueryData mediaQueryData = MediaQuery.of(context)!; + final MediaQueryData mediaQueryData = MediaQuery.of(context); text = MediaQuery( data: mediaQueryData.copyWith( textScaleFactor: math.min(1.0, mediaQueryData.textScaleFactor), @@ -920,7 +920,7 @@ class _BottomNavigationBarState extends State with TickerPr final BottomNavigationBarThemeData bottomTheme = BottomNavigationBarTheme.of(context); // Labels apply up to _bottomMargin padding. Remainder is media padding. - final double additionalBottomPadding = math.max(MediaQuery.of(context)!.padding.bottom - widget.selectedFontSize / 2.0, 0.0); + final double additionalBottomPadding = math.max(MediaQuery.of(context).padding.bottom - widget.selectedFontSize / 2.0, 0.0); Color? backgroundColor; switch (_effectiveType) { case BottomNavigationBarType.fixed: diff --git a/packages/flutter/lib/src/material/bottom_sheet.dart b/packages/flutter/lib/src/material/bottom_sheet.dart index 627a2f43dbd..90c413e8dac 100644 --- a/packages/flutter/lib/src/material/bottom_sheet.dart +++ b/packages/flutter/lib/src/material/bottom_sheet.dart @@ -369,7 +369,7 @@ class _ModalBottomSheetState extends State<_ModalBottomSheet> { Widget build(BuildContext context) { assert(debugCheckHasMediaQuery(context)); assert(debugCheckHasMaterialLocalizations(context)); - final MediaQueryData? mediaQuery = MediaQuery.of(context); + final MediaQueryData mediaQuery = MediaQuery.of(context); final MaterialLocalizations localizations = MaterialLocalizations.of(context); final String routeLabel = _getRouteLabel(localizations); @@ -395,7 +395,7 @@ class _ModalBottomSheetState extends State<_ModalBottomSheet> { // Disable the initial animation when accessible navigation is on so // that the semantics are added to the tree at the correct time. final double animationValue = animationCurve.transform( - mediaQuery!.accessibleNavigation ? 1.0 : widget.route!.animation!.value + mediaQuery.accessibleNavigation ? 1.0 : widget.route!.animation!.value ); return Semantics( scopesRoute: true, diff --git a/packages/flutter/lib/src/material/chip.dart b/packages/flutter/lib/src/material/chip.dart index d43226627bc..d2741153431 100644 --- a/packages/flutter/lib/src/material/chip.dart +++ b/packages/flutter/lib/src/material/chip.dart @@ -1829,7 +1829,7 @@ class _RawChipState extends State with TickerProviderStateMixin with SingleTickerPro Widget _buildDrawer(BuildContext context) { final bool drawerIsStart = widget.alignment == DrawerAlignment.start; - final EdgeInsets padding = MediaQuery.of(context)!.padding; + final EdgeInsets padding = MediaQuery.of(context).padding; final TextDirection textDirection = Directionality.of(context)!; double? dragAreaWidth = widget.edgeDragWidth; diff --git a/packages/flutter/lib/src/material/drawer_header.dart b/packages/flutter/lib/src/material/drawer_header.dart index 3d9900b9c70..4d06b0b800a 100644 --- a/packages/flutter/lib/src/material/drawer_header.dart +++ b/packages/flutter/lib/src/material/drawer_header.dart @@ -76,7 +76,7 @@ class DrawerHeader extends StatelessWidget { assert(debugCheckHasMaterial(context)); assert(debugCheckHasMediaQuery(context)); final ThemeData? theme = Theme.of(context); - final double statusBarHeight = MediaQuery.of(context)!.padding.top; + final double statusBarHeight = MediaQuery.of(context).padding.top; return Container( height: statusBarHeight + _kDrawerHeaderHeight, margin: margin, diff --git a/packages/flutter/lib/src/material/dropdown.dart b/packages/flutter/lib/src/material/dropdown.dart index 59a2fa98a19..877ab8972ff 100644 --- a/packages/flutter/lib/src/material/dropdown.dart +++ b/packages/flutter/lib/src/material/dropdown.dart @@ -1269,7 +1269,7 @@ class _DropdownButtonState extends State> with WidgetsBindi bool get _enabled => widget.items != null && widget.items!.isNotEmpty && widget.onChanged != null; Orientation _getOrientation(BuildContext context) { - Orientation? result = MediaQuery.of(context, nullOk: true)?.orientation; + Orientation? result = MediaQuery.maybeOf(context)?.orientation; if (result == null) { // If there's no MediaQuery, then use the window aspect to determine // orientation. diff --git a/packages/flutter/lib/src/material/elevated_button.dart b/packages/flutter/lib/src/material/elevated_button.dart index df16d692d9d..2e59e07ac44 100644 --- a/packages/flutter/lib/src/material/elevated_button.dart +++ b/packages/flutter/lib/src/material/elevated_button.dart @@ -255,7 +255,7 @@ class ElevatedButton extends ButtonStyleButton { const EdgeInsets.symmetric(horizontal: 16), const EdgeInsets.symmetric(horizontal: 8), const EdgeInsets.symmetric(horizontal: 4), - MediaQuery.of(context, nullOk: true)?.textScaleFactor ?? 1, + MediaQuery.maybeOf(context)?.textScaleFactor ?? 1, ); return styleFrom( @@ -397,7 +397,7 @@ class _ElevatedButtonWithIcon extends ElevatedButton { const EdgeInsetsDirectional.fromSTEB(12, 0, 16, 0), const EdgeInsets.symmetric(horizontal: 8), const EdgeInsetsDirectional.fromSTEB(8, 0, 4, 0), - MediaQuery.of(context, nullOk: true)?.textScaleFactor ?? 1, + MediaQuery.maybeOf(context)?.textScaleFactor ?? 1, ); return super.defaultStyleOf(context).copyWith( padding: MaterialStateProperty.all(scaledPadding) @@ -413,7 +413,7 @@ class _ElevatedButtonWithIconChild extends StatelessWidget { @override Widget build(BuildContext context) { - final double scale = MediaQuery.of(context, nullOk: true)?.textScaleFactor ?? 1; + final double scale = MediaQuery.maybeOf(context)?.textScaleFactor ?? 1; final double gap = scale <= 1 ? 8 : lerpDouble(8, 4, math.min(scale - 1, 1))!; return Row( mainAxisSize: MainAxisSize.min, diff --git a/packages/flutter/lib/src/material/ink_well.dart b/packages/flutter/lib/src/material/ink_well.dart index d64ce0e4d6d..ff267591c5e 100644 --- a/packages/flutter/lib/src/material/ink_well.dart +++ b/packages/flutter/lib/src/material/ink_well.dart @@ -916,7 +916,7 @@ class _InkResponseState extends State<_InkResponseStateWidget> } bool get _shouldShowFocus { - final NavigationMode mode = MediaQuery.of(context, nullOk: true)?.navigationMode ?? NavigationMode.traditional; + final NavigationMode mode = MediaQuery.maybeOf(context)?.navigationMode ?? NavigationMode.traditional; switch (mode) { case NavigationMode.traditional: return enabled && _hasFocus; @@ -1055,7 +1055,7 @@ class _InkResponseState extends State<_InkResponseStateWidget> } bool get _canRequestFocus { - final NavigationMode mode = MediaQuery.of(context, nullOk: true)?.navigationMode ?? NavigationMode.traditional; + final NavigationMode mode = MediaQuery.maybeOf(context)?.navigationMode ?? NavigationMode.traditional; switch (mode) { case NavigationMode.traditional: return enabled && widget.canRequestFocus; diff --git a/packages/flutter/lib/src/material/outlined_button.dart b/packages/flutter/lib/src/material/outlined_button.dart index 497db00ae23..7ddc29fb91f 100644 --- a/packages/flutter/lib/src/material/outlined_button.dart +++ b/packages/flutter/lib/src/material/outlined_button.dart @@ -226,7 +226,7 @@ class OutlinedButton extends ButtonStyleButton { const EdgeInsets.symmetric(horizontal: 16), const EdgeInsets.symmetric(horizontal: 8), const EdgeInsets.symmetric(horizontal: 4), - MediaQuery.of(context, nullOk: true)?.textScaleFactor ?? 1, + MediaQuery.maybeOf(context)?.textScaleFactor ?? 1, ); return styleFrom( @@ -341,7 +341,7 @@ class _OutlinedButtonWithIconChild extends StatelessWidget { @override Widget build(BuildContext context) { - final double scale = MediaQuery.of(context, nullOk: true)?.textScaleFactor ?? 1; + final double scale = MediaQuery.maybeOf(context)?.textScaleFactor ?? 1; final double gap = scale <= 1 ? 8 : lerpDouble(8, 4, math.min(scale - 1, 1))!; return Row( mainAxisSize: MainAxisSize.min, diff --git a/packages/flutter/lib/src/material/pickers/calendar_date_range_picker.dart b/packages/flutter/lib/src/material/pickers/calendar_date_range_picker.dart index b9b00117b88..8ce4ad978aa 100644 --- a/packages/flutter/lib/src/material/pickers/calendar_date_range_picker.dart +++ b/packages/flutter/lib/src/material/pickers/calendar_date_range_picker.dart @@ -436,7 +436,7 @@ class _DayHeaders extends StatelessWidget { return Container( constraints: BoxConstraints( - maxWidth: MediaQuery.of(context)!.orientation == Orientation.landscape + maxWidth: MediaQuery.of(context).orientation == Orientation.landscape ? _maxCalendarWidthLandscape : _maxCalendarWidthPortrait, maxHeight: _monthItemRowHeight, @@ -888,7 +888,7 @@ class _MonthItemState extends State<_MonthItem> { paddedDayItems.addAll(weekList); } - final double maxWidth = MediaQuery.of(context)!.orientation == Orientation.landscape + final double maxWidth = MediaQuery.of(context).orientation == Orientation.landscape ? _maxCalendarWidthLandscape : _maxCalendarWidthPortrait; return Column( diff --git a/packages/flutter/lib/src/material/pickers/date_picker_dialog.dart b/packages/flutter/lib/src/material/pickers/date_picker_dialog.dart index 831c5f86621..0564ac2ffd0 100644 --- a/packages/flutter/lib/src/material/pickers/date_picker_dialog.dart +++ b/packages/flutter/lib/src/material/pickers/date_picker_dialog.dart @@ -331,7 +331,7 @@ class _DatePickerDialogState extends State<_DatePickerDialog> { } Size _dialogSize(BuildContext context) { - final Orientation orientation = MediaQuery.of(context)!.orientation; + final Orientation orientation = MediaQuery.of(context).orientation; switch (_entryMode) { case DatePickerEntryMode.calendar: switch (orientation) { @@ -360,11 +360,11 @@ class _DatePickerDialogState extends State<_DatePickerDialog> { final ThemeData theme = Theme.of(context)!; final ColorScheme colorScheme = theme.colorScheme; 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; // Constrain the textScaleFactor to the largest supported value to prevent // layout issues. - final double textScaleFactor = math.min(MediaQuery.of(context)!.textScaleFactor, 1.3); + final double textScaleFactor = math.min(MediaQuery.of(context).textScaleFactor, 1.3); final String dateText = localizations.formatMediumDate(_selectedDate); final Color dateColor = colorScheme.brightness == Brightness.light @@ -467,7 +467,7 @@ class _DatePickerDialogState extends State<_DatePickerDialog> { duration: _dialogSizeAnimationDuration, curve: Curves.easeIn, child: MediaQuery( - data: MediaQuery.of(context)!.copyWith( + data: MediaQuery.of(context).copyWith( textScaleFactor: textScaleFactor, ), child: Builder(builder: (BuildContext context) { diff --git a/packages/flutter/lib/src/material/pickers/date_range_picker_dialog.dart b/packages/flutter/lib/src/material/pickers/date_range_picker_dialog.dart index b20000ced75..09b765ad6fa 100644 --- a/packages/flutter/lib/src/material/pickers/date_range_picker_dialog.dart +++ b/packages/flutter/lib/src/material/pickers/date_range_picker_dialog.dart @@ -335,7 +335,7 @@ class _DateRangePickerDialogState extends State<_DateRangePickerDialog> { @override Widget build(BuildContext context) { - final MediaQueryData mediaQuery = MediaQuery.of(context)!; + 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); @@ -428,7 +428,7 @@ class _DateRangePickerDialogState extends State<_DateRangePickerDialog> { duration: _dialogSizeAnimationDuration, curve: Curves.easeIn, child: MediaQuery( - data: MediaQuery.of(context)!.copyWith( + data: MediaQuery.of(context).copyWith( textScaleFactor: textScaleFactor, ), child: Builder(builder: (BuildContext context) { @@ -479,7 +479,7 @@ class _CalendarRangePickerDialog extends StatelessWidget { final ThemeData theme = Theme.of(context)!; final ColorScheme colorScheme = theme.colorScheme; 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 Color headerForeground = colorScheme.brightness == Brightness.light ? colorScheme.onPrimary @@ -525,7 +525,7 @@ class _CalendarRangePickerDialog extends StatelessWidget { ], bottom: PreferredSize( child: Row(children: [ - SizedBox(width: MediaQuery.of(context)!.size.width < 360 ? 42 : 72), + SizedBox(width: MediaQuery.of(context).size.width < 360 ? 42 : 72), Expanded( child: Semantics( label: '$helpText $startDateText to $endDateText', @@ -633,7 +633,7 @@ class _InputDateRangePickerDialog extends StatelessWidget { final ThemeData theme = Theme.of(context)!; final ColorScheme colorScheme = theme.colorScheme; 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 Color dateColor = colorScheme.brightness == Brightness.light diff --git a/packages/flutter/lib/src/material/popup_menu.dart b/packages/flutter/lib/src/material/popup_menu.dart index 42e9b1f8014..3ab6e3b159c 100644 --- a/packages/flutter/lib/src/material/popup_menu.dart +++ b/packages/flutter/lib/src/material/popup_menu.dart @@ -1098,7 +1098,7 @@ class PopupMenuButtonState extends State> { } bool get _canRequestFocus { - final NavigationMode mode = MediaQuery.of(context, nullOk: true)?.navigationMode ?? NavigationMode.traditional; + final NavigationMode mode = MediaQuery.maybeOf(context)?.navigationMode ?? NavigationMode.traditional; switch (mode) { case NavigationMode.traditional: return widget.enabled; diff --git a/packages/flutter/lib/src/material/range_slider.dart b/packages/flutter/lib/src/material/range_slider.dart index 35495f64eb2..042835f04b1 100644 --- a/packages/flutter/lib/src/material/range_slider.dart +++ b/packages/flutter/lib/src/material/range_slider.dart @@ -637,7 +637,7 @@ class _RangeSliderState extends State with TickerProviderStateMixin // This size is used as the max bounds for the painting of the value // indicators. It must be kept in sync with the function with the same name // in slider.dart. - Size _screenSize() => MediaQuery.of(context)!.size; + Size _screenSize() => MediaQuery.of(context).size; return CompositedTransformTarget( link: _layerLink, @@ -646,7 +646,7 @@ class _RangeSliderState extends State with TickerProviderStateMixin divisions: widget.divisions, labels: widget.labels, sliderTheme: sliderTheme, - textScaleFactor: MediaQuery.of(context)!.textScaleFactor, + textScaleFactor: MediaQuery.of(context).textScaleFactor, screenSize: _screenSize(), onChanged: (widget.onChanged != null) && (widget.max > widget.min) ? _handleChanged : null, onChangeStart: widget.onChangeStart != null ? _handleDragStart : null, diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart index 5092e5b16ab..217b7309151 100644 --- a/packages/flutter/lib/src/material/scaffold.dart +++ b/packages/flutter/lib/src/material/scaffold.dart @@ -240,7 +240,7 @@ class ScaffoldMessengerState extends State with TickerProvide @override void didChangeDependencies() { - final MediaQueryData mediaQuery = MediaQuery.of(context)!; + final MediaQueryData mediaQuery = MediaQuery.of(context); // If we transition from accessible navigation to non-accessible navigation // and there is a SnackBar that would have timed out that has already // completed its timer, dismiss that SnackBar. If the timer hasn't finished @@ -406,7 +406,7 @@ class ScaffoldMessengerState extends State with TickerProvide @override Widget build(BuildContext context) { assert(debugCheckHasMediaQuery(context)); - final MediaQueryData mediaQuery = MediaQuery.of(context)!; + final MediaQueryData mediaQuery = MediaQuery.of(context); _accessibleNavigation = mediaQuery.accessibleNavigation; if (_snackBars.isNotEmpty) { @@ -418,7 +418,7 @@ class ScaffoldMessengerState extends State with TickerProvide assert(_snackBarController!.status == AnimationStatus.forward || _snackBarController!.status == AnimationStatus.completed); // Look up MediaQuery again in case the setting changed. - final MediaQueryData mediaQuery = MediaQuery.of(context)!; + final MediaQueryData mediaQuery = MediaQuery.of(context); if (mediaQuery.accessibleNavigation && snackBar.action != null) return; hideCurrentSnackBar(reason: SnackBarClosedReason.timeout); @@ -769,7 +769,7 @@ class _BodyBuilder extends StatelessWidget { return LayoutBuilder( builder: (BuildContext context, BoxConstraints constraints) { final _BodyBoxConstraints bodyConstraints = constraints as _BodyBoxConstraints; - final MediaQueryData metrics = MediaQuery.of(context)!; + final MediaQueryData metrics = MediaQuery.of(context); final double bottom = extendBody ? math.max(metrics.padding.bottom, bodyConstraints.bottomWidgetsHeight) @@ -2281,7 +2281,7 @@ class ScaffoldState extends State with TickerProviderStateMixin { if (_snackBars.isEmpty || _snackBarController!.status == AnimationStatus.dismissed) return; - final MediaQueryData mediaQuery = MediaQuery.of(context)!; + final MediaQueryData mediaQuery = MediaQuery.of(context); final Completer completer = _snackBars.first._completer; if (mediaQuery.accessibleNavigation) { _snackBarController!.value = 0.0; @@ -2725,7 +2725,7 @@ class ScaffoldState extends State with TickerProviderStateMixin { _scaffoldMessenger?._register(this); // TODO(Piinks): Remove old SnackBar API after migrating ScaffoldMessenger - final MediaQueryData mediaQuery = MediaQuery.of(context)!; + final MediaQueryData mediaQuery = MediaQuery.of(context); // If we transition from accessible navigation to non-accessible navigation // and there is a SnackBar that would have timed out that has already // completed its timer, dismiss that SnackBar. If the timer hasn't finished @@ -2773,7 +2773,7 @@ class ScaffoldState extends State with TickerProviderStateMixin { bool removeBottomInset = false, bool maintainBottomViewPadding = false, }) { - MediaQueryData data = MediaQuery.of(context)!.removePadding( + MediaQueryData data = MediaQuery.of(context).removePadding( removeLeft: removeLeftPadding, removeTop: removeTopPadding, removeRight: removeRightPadding, @@ -2869,7 +2869,7 @@ class ScaffoldState extends State with TickerProviderStateMixin { Widget build(BuildContext context) { assert(debugCheckHasMediaQuery(context)); assert(debugCheckHasDirectionality(context)); - final MediaQueryData mediaQuery = MediaQuery.of(context)!; + final MediaQueryData mediaQuery = MediaQuery.of(context); final ThemeData themeData = Theme.of(context)!; final TextDirection textDirection = Directionality.of(context)!; @@ -2884,7 +2884,7 @@ class ScaffoldState extends State with TickerProviderStateMixin { assert(_snackBarController!.status == AnimationStatus.forward || _snackBarController!.status == AnimationStatus.completed); // Look up MediaQuery again in case the setting changed. - final MediaQueryData mediaQuery = MediaQuery.of(context)!; + final MediaQueryData mediaQuery = MediaQuery.of(context); if (mediaQuery.accessibleNavigation && snackBar.action != null) return; hideCurrentSnackBar(reason: SnackBarClosedReason.timeout); diff --git a/packages/flutter/lib/src/material/scrollbar.dart b/packages/flutter/lib/src/material/scrollbar.dart index b026dee783a..3d446a89948 100644 --- a/packages/flutter/lib/src/material/scrollbar.dart +++ b/packages/flutter/lib/src/material/scrollbar.dart @@ -167,7 +167,7 @@ class _ScrollbarState extends State with SingleTickerProviderStateMix thickness: widget.thickness ?? _kScrollbarThickness, radius: widget.radius, fadeoutOpacityAnimation: _fadeoutOpacityAnimation, - padding: MediaQuery.of(context)!.padding, + padding: MediaQuery.of(context).padding, ); } diff --git a/packages/flutter/lib/src/material/selectable_text.dart b/packages/flutter/lib/src/material/selectable_text.dart index 360e31fb07e..40cad5629a7 100644 --- a/packages/flutter/lib/src/material/selectable_text.dart +++ b/packages/flutter/lib/src/material/selectable_text.dart @@ -590,7 +590,7 @@ class _SelectableTextState extends State with AutomaticKeepAlive cursorColor ??= selectionTheme.cursorColor ?? cupertinoTheme.primaryColor; selectionColor = selectionTheme.selectionColor ?? cupertinoTheme.primaryColor.withOpacity(0.40); cursorRadius ??= const Radius.circular(2.0); - cursorOffset = Offset(iOSHorizontalOffset / MediaQuery.of(context)!.devicePixelRatio, 0); + cursorOffset = Offset(iOSHorizontalOffset / MediaQuery.of(context).devicePixelRatio, 0); break; case TargetPlatform.android: diff --git a/packages/flutter/lib/src/material/slider.dart b/packages/flutter/lib/src/material/slider.dart index e77af4767e7..b00a17b4fb3 100644 --- a/packages/flutter/lib/src/material/slider.dart +++ b/packages/flutter/lib/src/material/slider.dart @@ -703,7 +703,7 @@ class _SliderState extends State with TickerProviderStateMixin { // This size is used as the max bounds for the painting of the value // indicators It must be kept in sync with the function with the same name // in range_slider.dart. - Size _screenSize() => MediaQuery.of(context)!.size; + Size _screenSize() => MediaQuery.of(context).size; return Semantics( container: true, @@ -725,7 +725,7 @@ class _SliderState extends State with TickerProviderStateMixin { divisions: widget.divisions, label: widget.label, sliderTheme: sliderTheme, - textScaleFactor: MediaQuery.of(context)!.textScaleFactor, + textScaleFactor: MediaQuery.of(context).textScaleFactor, screenSize: _screenSize(), onChanged: (widget.onChanged != null) && (widget.max > widget.min) ? _handleChanged : null, onChangeStart: widget.onChangeStart != null ? _handleDragStart : null, diff --git a/packages/flutter/lib/src/material/snack_bar.dart b/packages/flutter/lib/src/material/snack_bar.dart index f9afe083ab1..d364be8045a 100644 --- a/packages/flutter/lib/src/material/snack_bar.dart +++ b/packages/flutter/lib/src/material/snack_bar.dart @@ -383,7 +383,7 @@ class _SnackBarState extends State { @override Widget build(BuildContext context) { assert(debugCheckHasMediaQuery(context)); - final MediaQueryData mediaQueryData = MediaQuery.of(context)!; + final MediaQueryData mediaQueryData = MediaQuery.of(context); assert(widget.animation != null); final ThemeData theme = Theme.of(context)!; final ColorScheme colorScheme = theme.colorScheme; diff --git a/packages/flutter/lib/src/material/text_button.dart b/packages/flutter/lib/src/material/text_button.dart index fd07377442e..933dd67c475 100644 --- a/packages/flutter/lib/src/material/text_button.dart +++ b/packages/flutter/lib/src/material/text_button.dart @@ -242,7 +242,7 @@ class TextButton extends ButtonStyleButton { const EdgeInsets.all(8), const EdgeInsets.symmetric(horizontal: 8), const EdgeInsets.symmetric(horizontal: 4), - MediaQuery.of(context, nullOk: true)?.textScaleFactor ?? 1, + MediaQuery.maybeOf(context)?.textScaleFactor ?? 1, ); return styleFrom( @@ -359,7 +359,7 @@ class _TextButtonWithIcon extends TextButton { const EdgeInsets.all(8), const EdgeInsets.symmetric(horizontal: 4), const EdgeInsets.symmetric(horizontal: 4), - MediaQuery.of(context, nullOk: true)?.textScaleFactor ?? 1, + MediaQuery.maybeOf(context)?.textScaleFactor ?? 1, ); return super.defaultStyleOf(context).copyWith( padding: MaterialStateProperty.all(scaledPadding) @@ -379,7 +379,7 @@ class _TextButtonWithIconChild extends StatelessWidget { @override Widget build(BuildContext context) { - final double scale = MediaQuery.of(context, nullOk: true)?.textScaleFactor ?? 1; + final double scale = MediaQuery.maybeOf(context)?.textScaleFactor ?? 1; final double gap = scale <= 1 ? 8 : lerpDouble(8, 4, math.min(scale - 1, 1))!; return Row( mainAxisSize: MainAxisSize.min, diff --git a/packages/flutter/lib/src/material/text_field.dart b/packages/flutter/lib/src/material/text_field.dart index 615e2c3ce58..dcd73258319 100644 --- a/packages/flutter/lib/src/material/text_field.dart +++ b/packages/flutter/lib/src/material/text_field.dart @@ -1059,7 +1059,7 @@ class _TextFieldState extends State with RestorationMixin implements } bool get _canRequestFocus { - final NavigationMode mode = MediaQuery.of(context, nullOk: true)?.navigationMode ?? NavigationMode.traditional; + final NavigationMode mode = MediaQuery.maybeOf(context)?.navigationMode ?? NavigationMode.traditional; switch (mode) { case NavigationMode.traditional: return _isEnabled; @@ -1285,7 +1285,7 @@ class _TextFieldState extends State with RestorationMixin implements cursorColor ??= selectionTheme.cursorColor ?? cupertinoTheme.primaryColor; selectionColor = selectionTheme.selectionColor ?? cupertinoTheme.primaryColor.withOpacity(0.40); cursorRadius ??= const Radius.circular(2.0); - cursorOffset = Offset(iOSHorizontalOffset / MediaQuery.of(context)!.devicePixelRatio, 0); + cursorOffset = Offset(iOSHorizontalOffset / MediaQuery.of(context).devicePixelRatio, 0); autocorrectionTextRectColor = selectionColor; break; diff --git a/packages/flutter/lib/src/material/text_selection.dart b/packages/flutter/lib/src/material/text_selection.dart index 620d26e1b4b..f37740f8495 100644 --- a/packages/flutter/lib/src/material/text_selection.dart +++ b/packages/flutter/lib/src/material/text_selection.dart @@ -760,7 +760,7 @@ class _MaterialTextSelectionControls extends TextSelectionControls { const double closedToolbarHeightNeeded = _kToolbarScreenPadding + _kToolbarHeight + _kToolbarContentDistance; - final double paddingTop = MediaQuery.of(context)!.padding.top; + final double paddingTop = MediaQuery.of(context).padding.top; final double availableHeight = globalEditableRegion.top + startTextSelectionPoint.point.dy - textLineHeight diff --git a/packages/flutter/lib/src/material/time.dart b/packages/flutter/lib/src/material/time.dart index 91953f29146..dc4b93f8460 100644 --- a/packages/flutter/lib/src/material/time.dart +++ b/packages/flutter/lib/src/material/time.dart @@ -107,7 +107,7 @@ class TimeOfDay { final MaterialLocalizations localizations = MaterialLocalizations.of(context); return localizations.formatTimeOfDay( this, - alwaysUse24HourFormat: MediaQuery.of(context)!.alwaysUse24HourFormat, + alwaysUse24HourFormat: MediaQuery.of(context).alwaysUse24HourFormat, ); } diff --git a/packages/flutter/lib/src/material/time_picker.dart b/packages/flutter/lib/src/material/time_picker.dart index dd2bfc29e46..ef85ab77a65 100644 --- a/packages/flutter/lib/src/material/time_picker.dart +++ b/packages/flutter/lib/src/material/time_picker.dart @@ -135,7 +135,7 @@ class _TimePickerHeader extends StatelessWidget { assert(debugCheckHasMediaQuery(context)); final ThemeData themeData = Theme.of(context)!; final TimeOfDayFormat timeOfDayFormat = MaterialLocalizations.of(context).timeOfDayFormat( - alwaysUse24HourFormat: MediaQuery.of(context)!.alwaysUse24HourFormat, + alwaysUse24HourFormat: MediaQuery.of(context).alwaysUse24HourFormat, ); final _TimePickerFragmentContext fragmentContext = _TimePickerFragmentContext( @@ -321,7 +321,7 @@ class _HourControl extends StatelessWidget { @override Widget build(BuildContext 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 String formattedHour = localizations.formatHour( fragmentContext.selectedTime, @@ -563,7 +563,7 @@ class _DayPeriodControl extends StatelessWidget { side: borderSide, ); - final double buttonTextScaleFactor = math.min(MediaQuery.of(context)!.textScaleFactor, 2.0); + final double buttonTextScaleFactor = math.min(MediaQuery.of(context).textScaleFactor, 2.0); final Widget amButton = Material( color: MaterialStateProperty.resolveAs(backgroundColor, amStates), @@ -942,7 +942,7 @@ class _DialState extends State<_Dial> with SingleTickerProviderStateMixin { assert(debugCheckHasMediaQuery(context)); themeData = Theme.of(context)!; localizations = MaterialLocalizations.of(context); - media = MediaQuery.of(context)!; + media = MediaQuery.of(context); } @override @@ -1152,7 +1152,7 @@ class _DialState extends State<_Dial> with SingleTickerProviderStateMixin { _TappableLabel _buildTappableLabel(TextTheme textTheme, Color color, int value, String label, VoidCallback onTap) { final TextStyle style = textTheme.bodyText1!.copyWith(color: color); - final double labelScaleFactor = math.min(MediaQuery.of(context)!.textScaleFactor, 2.0); + final double labelScaleFactor = math.min(MediaQuery.of(context).textScaleFactor, 2.0); return _TappableLabel( value: value, painter: TextPainter( @@ -1322,7 +1322,7 @@ class _TimePickerInputState extends State<_TimePickerInput> { return null; } - if (MediaQuery.of(context)!.alwaysUse24HourFormat) { + if (MediaQuery.of(context).alwaysUse24HourFormat) { if (newHour >= 0 && newHour < 24) { return newHour; } @@ -1408,7 +1408,7 @@ class _TimePickerInputState extends State<_TimePickerInput> { @override Widget build(BuildContext 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 bool use24HourDials = hourFormat(of: timeOfDayFormat) != HourFormat.h; final ThemeData theme = Theme.of(context)!; @@ -1631,7 +1631,7 @@ class _HourMinuteTextFieldState extends State<_HourMinuteTextField> { } String get _formattedValue { - final bool alwaysUse24HourFormat = MediaQuery.of(context)!.alwaysUse24HourFormat; + final bool alwaysUse24HourFormat = MediaQuery.of(context).alwaysUse24HourFormat; final MaterialLocalizations localizations = MaterialLocalizations.of(context); return !widget.isHour ? localizations.formatMinute(widget.selectedTime) : localizations.formatHour( widget.selectedTime, @@ -1677,7 +1677,7 @@ class _HourMinuteTextFieldState extends State<_HourMinuteTextField> { // // TODO(rami-a): Once https://github.com/flutter/flutter/issues/67571 is // resolved, remove the window check for semantics being enabled on web. - final String? hintText = MediaQuery.of(context)!.accessibleNavigation || ui.window.semanticsEnabled + final String? hintText = MediaQuery.of(context).accessibleNavigation || ui.window.semanticsEnabled ? widget.semanticHintText : (focusNode.hasFocus ? null : _formattedValue); inputDecoration = inputDecoration.copyWith( @@ -1688,7 +1688,7 @@ class _HourMinuteTextFieldState extends State<_HourMinuteTextField> { return SizedBox( height: _kTimePickerHeaderControlHeight, child: MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: 1.0), + data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0), child: TextFormField( autofocus: widget.autofocus ?? false, expands: true, @@ -1854,7 +1854,7 @@ class _TimePickerDialogState extends State<_TimePickerDialog> { if (_announcedInitialTime) return; - final MediaQueryData media = MediaQuery.of(context)!; + final MediaQueryData media = MediaQuery.of(context); final MaterialLocalizations localizations = MaterialLocalizations.of(context); _announceToAccessibility( context, @@ -1903,12 +1903,12 @@ class _TimePickerDialogState extends State<_TimePickerDialog> { } Size _dialogSize(BuildContext context) { - final Orientation orientation = MediaQuery.of(context)!.orientation; + final Orientation orientation = MediaQuery.of(context).orientation; final ThemeData theme = Theme.of(context)!; // Constrain the textScaleFactor to prevent layout issues. Since only some // parts of the time picker scale up with textScaleFactor, we cap the factor // to 1.1 as that provides enough space to reasonably fit all the content. - final double textScaleFactor = math.min(MediaQuery.of(context)!.textScaleFactor, 1.1); + final double textScaleFactor = math.min(MediaQuery.of(context).textScaleFactor, 1.1); final double timePickerWidth; final double timePickerHeight; @@ -1940,7 +1940,7 @@ class _TimePickerDialogState extends State<_TimePickerDialog> { @override Widget build(BuildContext context) { assert(debugCheckHasMediaQuery(context)); - final MediaQueryData media = MediaQuery.of(context)!; + final MediaQueryData media = MediaQuery.of(context); final TimeOfDayFormat timeOfDayFormat = localizations.timeOfDayFormat(alwaysUse24HourFormat: media.alwaysUse24HourFormat); final bool use24HourDials = hourFormat(of: timeOfDayFormat) != HourFormat.h; final ThemeData theme = Theme.of(context)!; diff --git a/packages/flutter/lib/src/widgets/actions.dart b/packages/flutter/lib/src/widgets/actions.dart index aefdbf69597..670c61f1e14 100644 --- a/packages/flutter/lib/src/widgets/actions.dart +++ b/packages/flutter/lib/src/widgets/actions.dart @@ -1057,7 +1057,7 @@ class _FocusableActionDetectorState extends State { } bool canRequestFocus(FocusableActionDetector target) { - final NavigationMode mode = MediaQuery.of(context, nullOk: true)?.navigationMode ?? NavigationMode.traditional; + final NavigationMode mode = MediaQuery.maybeOf(context)?.navigationMode ?? NavigationMode.traditional; switch (mode) { case NavigationMode.traditional: return target.enabled; @@ -1098,7 +1098,7 @@ class _FocusableActionDetectorState extends State { } bool get _canRequestFocus { - final NavigationMode mode = MediaQuery.of(context, nullOk: true)?.navigationMode ?? NavigationMode.traditional; + final NavigationMode mode = MediaQuery.maybeOf(context)?.navigationMode ?? NavigationMode.traditional; switch (mode) { case NavigationMode.traditional: return widget.enabled; diff --git a/packages/flutter/lib/src/widgets/debug.dart b/packages/flutter/lib/src/widgets/debug.dart index 083a12b6dd8..b27c3995111 100644 --- a/packages/flutter/lib/src/widgets/debug.dart +++ b/packages/flutter/lib/src/widgets/debug.dart @@ -216,13 +216,16 @@ bool debugCheckHasMediaQuery(BuildContext context) { assert(() { if (context.widget is! MediaQuery && context.findAncestorWidgetOfExactType() == null) { throw FlutterError.fromParts([ - ErrorSummary('No MediaQuery widget found.'), + ErrorSummary('No MediaQuery widget ancestor found.'), ErrorDescription('${context.widget.runtimeType} widgets require a MediaQuery widget ancestor.'), context.describeWidget('The specific widget that could not find a MediaQuery ancestor was'), context.describeOwnershipChain('The ownership chain for the affected widget is'), ErrorHint( - 'Typically, the MediaQuery widget is introduced by the MaterialApp or ' - 'WidgetsApp widget at the top of your application widget tree.' + 'No MediaQuery ancestor could be found starting from the context ' + 'that was passed to MediaQuery.of(). This can happen because you ' + 'have not added a WidgetsApp, CupertinoApp, or MaterialApp widget ' + '(those widgets introduce a MediaQuery), or it can happen if the ' + 'context you use comes from a widget above those widgets.' ), ]); } diff --git a/packages/flutter/lib/src/widgets/editable_text.dart b/packages/flutter/lib/src/widgets/editable_text.dart index d6d81dedc21..7959bd5c13f 100644 --- a/packages/flutter/lib/src/widgets/editable_text.dart +++ b/packages/flutter/lib/src/widgets/editable_text.dart @@ -2443,7 +2443,7 @@ class EditableTextState extends State with AutomaticKeepAliveClien @override TextEditingValue get textEditingValue => _value; - double get _devicePixelRatio => MediaQuery.of(context)?.devicePixelRatio ?? 1.0; + double get _devicePixelRatio => MediaQuery.of(context).devicePixelRatio; @override set textEditingValue(TextEditingValue value) { diff --git a/packages/flutter/lib/src/widgets/image.dart b/packages/flutter/lib/src/widgets/image.dart index b36f174164b..21035e4c411 100644 --- a/packages/flutter/lib/src/widgets/image.dart +++ b/packages/flutter/lib/src/widgets/image.dart @@ -50,7 +50,7 @@ export 'package:flutter/painting.dart' show ImageConfiguration createLocalImageConfiguration(BuildContext context, { Size? size }) { return ImageConfiguration( bundle: DefaultAssetBundle.of(context), - devicePixelRatio: MediaQuery.of(context, nullOk: true)?.devicePixelRatio ?? 1.0, + devicePixelRatio: MediaQuery.maybeOf(context)?.devicePixelRatio ?? 1.0, locale: Localizations.localeOf(context, nullOk: true), textDirection: Directionality.maybeOf(context), size: size, @@ -1145,7 +1145,7 @@ class _ImageState extends State with WidgetsBindingObserver { } void _updateInvertColors() { - _invertColors = MediaQuery.of(context, nullOk: true)?.invertColors + _invertColors = MediaQuery.maybeOf(context)?.invertColors ?? SemanticsBinding.instance!.accessibilityFeatures.invertColors; } diff --git a/packages/flutter/lib/src/widgets/media_query.dart b/packages/flutter/lib/src/widgets/media_query.dart index 32b6258cb49..cf1cbb901bf 100644 --- a/packages/flutter/lib/src/widgets/media_query.dart +++ b/packages/flutter/lib/src/widgets/media_query.dart @@ -9,6 +9,7 @@ import 'dart:ui' show Brightness; import 'package:flutter/foundation.dart'; import 'basic.dart'; +import 'debug.dart'; import 'framework.dart'; /// Whether in portrait or landscape. @@ -683,7 +684,7 @@ class MediaQuery extends InheritedWidget { }) { return MediaQuery( key: key, - data: MediaQuery.of(context)!.removePadding( + data: MediaQuery.of(context).removePadding( removeLeft: removeLeft, removeTop: removeTop, removeRight: removeRight, @@ -728,7 +729,7 @@ class MediaQuery extends InheritedWidget { }) { return MediaQuery( key: key, - data: MediaQuery.of(context)!.removeViewInsets( + data: MediaQuery.of(context).removeViewInsets( removeLeft: removeLeft, removeTop: removeTop, removeRight: removeRight, @@ -772,7 +773,7 @@ class MediaQuery extends InheritedWidget { }) { return MediaQuery( key: key, - data: MediaQuery.of(context)!.removeViewPadding( + data: MediaQuery.of(context).removeViewPadding( removeLeft: removeLeft, removeTop: removeTop, removeRight: removeRight, @@ -791,9 +792,10 @@ class MediaQuery extends InheritedWidget { /// The data from the closest instance of this class that encloses the given /// context. /// - /// You can use this function to query the size an orientation of the screen. - /// When that information changes, your widget will be scheduled to be - /// rebuilt, keeping your widget up-to-date. + /// You can use this function to query the size and orientation of the screen, + /// as well as other media parameters (see [MediaQueryData] for more + /// examples). When that information changes, your widget will be scheduled to + /// be rebuilt, keeping your widget up-to-date. /// /// Typical usage is as follows: /// @@ -801,35 +803,56 @@ class MediaQuery extends InheritedWidget { /// MediaQueryData media = MediaQuery.of(context); /// ``` /// - /// If there is no [MediaQuery] in scope, then this will throw an exception. - /// To return null if there is no [MediaQuery], then pass `nullOk: true`. + /// If there is no [MediaQuery] in scope, this will throw a [TypeError] + /// exception in release builds, and throw a descriptive [FlutterError] in + /// debug builds. /// - /// If you use this from a widget (e.g. in its build function), consider - /// calling [debugCheckHasMediaQuery]. - static MediaQueryData? of(BuildContext context, { bool nullOk = false }) { + /// See also: + /// + /// * [maybeOf], which doesn't throw or assert if it doesn't find a + /// [MediaQuery] ancestor, it returns null instead. + static MediaQueryData of(BuildContext context) { assert(context != null); - assert(nullOk != null); - final MediaQuery? query = context.dependOnInheritedWidgetOfExactType(); - if (query != null) - return query.data; - if (nullOk) - return null; - throw FlutterError.fromParts([ - ErrorSummary('MediaQuery.of() called with a context that does not contain a MediaQuery.'), - ErrorDescription( - 'No MediaQuery ancestor could be found starting from the context that was passed ' - 'to MediaQuery.of(). This can happen because you do not have a WidgetsApp or ' - 'MaterialApp widget (those widgets introduce a MediaQuery), or it can happen ' - 'if the context you use comes from a widget above those widgets.' - ), - context.describeElement('The context used was') - ]); + assert(debugCheckHasMediaQuery(context)); + return context.dependOnInheritedWidgetOfExactType()!.data; + } + + /// The data from the closest instance of this class that encloses the given + /// context, if any. + /// + /// Use this function if you want to allow situations where no [MediaQuery] is + /// in scope. Prefer using [MediaQuery.of] in situations where a media query + /// is always expected to exist. + /// + /// If there is no [MediaQuery] in scope, then this function will return null. + /// + /// You can use this function to query the size and orientation of the screen, + /// as well as other media parameters (see [MediaQueryData] for more + /// examples). When that information changes, your widget will be scheduled to + /// be rebuilt, keeping your widget up-to-date. + /// + /// Typical usage is as follows: + /// + /// ```dart + /// MediaQueryData? mediaQuery = MediaQuery.maybeOf(context); + /// if (mediaQuery == null) { + /// // Do something else instead. + /// } + /// ``` + /// + /// See also: + /// + /// * [of], which will throw if it doesn't find a [MediaQuery] ancestor, + /// instead of returning null. + static MediaQueryData? maybeOf(BuildContext context) { + assert(context != null); + return context.dependOnInheritedWidgetOfExactType()?.data; } /// Returns textScaleFactor for the nearest MediaQuery ancestor or 1.0, if /// no such ancestor exists. static double textScaleFactorOf(BuildContext context) { - return MediaQuery.of(context, nullOk: true)?.textScaleFactor ?? 1.0; + return MediaQuery.maybeOf(context)?.textScaleFactor ?? 1.0; } /// Returns platformBrightness for the nearest MediaQuery ancestor or @@ -838,7 +861,7 @@ class MediaQuery extends InheritedWidget { /// Use of this method will cause the given [context] to rebuild any time that /// any property of the ancestor [MediaQuery] changes. static Brightness platformBrightnessOf(BuildContext context) { - return MediaQuery.of(context, nullOk: true)?.platformBrightness ?? Brightness.light; + return MediaQuery.maybeOf(context)?.platformBrightness ?? Brightness.light; } /// Returns highContrast for the nearest MediaQuery ancestor or false, if no @@ -849,13 +872,13 @@ class MediaQuery extends InheritedWidget { /// * [MediaQueryData.highContrast], which indicates the platform's /// desire to increase contrast. static bool highContrastOf(BuildContext context) { - return MediaQuery.of(context, nullOk: true)?.highContrast ?? false; + return MediaQuery.maybeOf(context)?.highContrast ?? false; } /// Returns the boldText accessibility setting for the nearest MediaQuery /// ancestor, or false if no such ancestor exists. static bool boldTextOverride(BuildContext context) { - return MediaQuery.of(context, nullOk: true)?.boldText ?? false; + return MediaQuery.maybeOf(context)?.boldText ?? false; } @override diff --git a/packages/flutter/lib/src/widgets/safe_area.dart b/packages/flutter/lib/src/widgets/safe_area.dart index 30f4016b632..46e644403c1 100644 --- a/packages/flutter/lib/src/widgets/safe_area.dart +++ b/packages/flutter/lib/src/widgets/safe_area.dart @@ -95,7 +95,7 @@ class SafeArea extends StatelessWidget { @override Widget build(BuildContext context) { assert(debugCheckHasMediaQuery(context)); - final MediaQueryData data = MediaQuery.of(context)!; + final MediaQueryData data = MediaQuery.of(context); EdgeInsets padding = data.padding; // Bottom padding has been consumed - i.e. by the keyboard if (data.padding.bottom == 0.0 && data.viewInsets.bottom != 0.0 && maintainBottomViewPadding) @@ -194,7 +194,7 @@ class SliverSafeArea extends StatelessWidget { @override Widget build(BuildContext context) { assert(debugCheckHasMediaQuery(context)); - final EdgeInsets padding = MediaQuery.of(context)!.padding; + final EdgeInsets padding = MediaQuery.of(context).padding; return SliverPadding( padding: EdgeInsets.only( left: math.max(left ? padding.left : 0.0, minimum.left), diff --git a/packages/flutter/lib/src/widgets/scroll_view.dart b/packages/flutter/lib/src/widgets/scroll_view.dart index 796947145fd..0e5007a1560 100644 --- a/packages/flutter/lib/src/widgets/scroll_view.dart +++ b/packages/flutter/lib/src/widgets/scroll_view.dart @@ -675,7 +675,7 @@ abstract class BoxScrollView extends ScrollView { Widget sliver = buildChildLayout(context); EdgeInsetsGeometry? effectivePadding = padding; if (padding == null) { - final MediaQueryData? mediaQuery = MediaQuery.of(context, nullOk: true); + final MediaQueryData? mediaQuery = MediaQuery.maybeOf(context); if (mediaQuery != null) { // Automatically pad sliver with padding from MediaQuery. final EdgeInsets mediaQueryHorizontalPadding = diff --git a/packages/flutter/test/cupertino/action_sheet_test.dart b/packages/flutter/test/cupertino/action_sheet_test.dart index d603815d386..327408c5587 100644 --- a/packages/flutter/test/cupertino/action_sheet_test.dart +++ b/packages/flutter/test/cupertino/action_sheet_test.dart @@ -283,7 +283,7 @@ void main() { createAppWithButtonThatLaunchesActionSheet( Builder(builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: 3.0), + data: MediaQuery.of(context).copyWith(textScaleFactor: 3.0), child: CupertinoActionSheet( title: const Text('The title'), message: const Text('The message.'), @@ -348,9 +348,9 @@ void main() { await tester.pumpWidget( createAppWithButtonThatLaunchesActionSheet( Builder(builder: (BuildContext context) { - screenHeight = MediaQuery.of(context)!.size.height; + screenHeight = MediaQuery.of(context).size.height; return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: 3.0), + data: MediaQuery.of(context).copyWith(textScaleFactor: 3.0), child: CupertinoActionSheet( title: const Text('The title'), message: Text('Very long content' * 200), diff --git a/packages/flutter/test/cupertino/colors_test.dart b/packages/flutter/test/cupertino/colors_test.dart index cf3d73eba96..95196363dc5 100644 --- a/packages/flutter/test/cupertino/colors_test.dart +++ b/packages/flutter/test/cupertino/colors_test.dart @@ -283,7 +283,7 @@ void main() { // Asserts when the required dependency is missing. await tester.pumpWidget(const DependentWidget(color: contrastDependentColor1)); - expect(tester.takeException()?.toString(), contains('does not contain a MediaQuery')); + expect(tester.takeException()?.toString(), contains('No MediaQuery widget ancestor found')); }); testWidgets( diff --git a/packages/flutter/test/cupertino/date_picker_test.dart b/packages/flutter/test/cupertino/date_picker_test.dart index edea77a606b..a00a0a2198e 100644 --- a/packages/flutter/test/cupertino/date_picker_test.dart +++ b/packages/flutter/test/cupertino/date_picker_test.dart @@ -1386,7 +1386,7 @@ void main() { home: StatefulBuilder(builder: (BuildContext context, StateSetter stateSetter) { setState = stateSetter; return MediaQuery( - data: MediaQuery.of(context)!.copyWith(platformBrightness: brightness), + data: MediaQuery.of(context).copyWith(platformBrightness: brightness), child: CupertinoDatePicker( initialDateTime: DateTime(2019), mode: CupertinoDatePickerMode.date, diff --git a/packages/flutter/test/cupertino/dialog_test.dart b/packages/flutter/test/cupertino/dialog_test.dart index 05890a47567..5a29b573da1 100644 --- a/packages/flutter/test/cupertino/dialog_test.dart +++ b/packages/flutter/test/cupertino/dialog_test.dart @@ -275,7 +275,7 @@ void main() { createAppWithButtonThatLaunchesDialog( dialogBuilder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: 3.0), + data: MediaQuery.of(context).copyWith(textScaleFactor: 3.0), child: CupertinoAlertDialog( title: const Text('The Title'), content: Text('Very long content ' * 20), @@ -375,7 +375,7 @@ void main() { createAppWithButtonThatLaunchesDialog( dialogBuilder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: 3.0), + data: MediaQuery.of(context).copyWith(textScaleFactor: 3.0), child: CupertinoAlertDialog( title: const Text('The title'), content: const Text('The content.'), @@ -436,7 +436,7 @@ void main() { createAppWithButtonThatLaunchesDialog( dialogBuilder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: textScaleFactor), + data: MediaQuery.of(context).copyWith(textScaleFactor: textScaleFactor), child: CupertinoAlertDialog( actions: const [ CupertinoDialogAction( @@ -487,7 +487,7 @@ void main() { createAppWithButtonThatLaunchesDialog( dialogBuilder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: textScaleFactor), + data: MediaQuery.of(context).copyWith(textScaleFactor: textScaleFactor), child: CupertinoAlertDialog( title: const Text('The title'), content: const Text('The content.'), @@ -556,7 +556,7 @@ void main() { await tester.pumpWidget( createAppWithButtonThatLaunchesDialog( dialogBuilder: (BuildContext context) { - dividerWidth = 1.0 / MediaQuery.of(context)!.devicePixelRatio; + dividerWidth = 1.0 / MediaQuery.of(context).devicePixelRatio; return CupertinoAlertDialog( title: const Text('The Title'), content: const Text('The message'), @@ -601,7 +601,7 @@ void main() { await tester.pumpWidget( createAppWithButtonThatLaunchesDialog( dialogBuilder: (BuildContext context) { - dividerThickness = 1.0 / MediaQuery.of(context)!.devicePixelRatio; + dividerThickness = 1.0 / MediaQuery.of(context).devicePixelRatio; return CupertinoAlertDialog( title: const Text('The Title'), content: const Text('The message'), @@ -677,7 +677,7 @@ void main() { createAppWithButtonThatLaunchesDialog( dialogBuilder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: 3.0), + data: MediaQuery.of(context).copyWith(textScaleFactor: 3.0), child: CupertinoAlertDialog( title: const Text('The Title'), content: Text('The message\n' * 20), @@ -809,7 +809,7 @@ void main() { await tester.pumpWidget( createAppWithButtonThatLaunchesDialog( dialogBuilder: (BuildContext context) { - dividerThickness = 1.0 / MediaQuery.of(context)!.devicePixelRatio; + dividerThickness = 1.0 / MediaQuery.of(context).devicePixelRatio; return CupertinoAlertDialog( title: const Text('The Title'), content: const Text('The message'), @@ -1151,7 +1151,7 @@ void main() { createAppWithButtonThatLaunchesDialog( dialogBuilder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: 3.0), + data: MediaQuery.of(context).copyWith(textScaleFactor: 3.0), child: const RepaintBoundary( child: CupertinoAlertDialog( title: Text('Title'), diff --git a/packages/flutter/test/cupertino/material/tab_scaffold_test.dart b/packages/flutter/test/cupertino/material/tab_scaffold_test.dart index d9475f3c9f8..f484043a56f 100644 --- a/packages/flutter/test/cupertino/material/tab_scaffold_test.dart +++ b/packages/flutter/test/cupertino/material/tab_scaffold_test.dart @@ -282,7 +282,7 @@ void main() { MaterialApp( home: Builder(builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: 99), + data: MediaQuery.of(context).copyWith(textScaleFactor: 99), child: CupertinoTabScaffold( tabBar: CupertinoTabBar( items: List.generate( diff --git a/packages/flutter/test/cupertino/nav_bar_test.dart b/packages/flutter/test/cupertino/nav_bar_test.dart index ef067306b60..e18effd2bca 100644 --- a/packages/flutter/test/cupertino/nav_bar_test.dart +++ b/packages/flutter/test/cupertino/nav_bar_test.dart @@ -1106,7 +1106,7 @@ void main() { CupertinoApp( home: Builder(builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: 99), + data: MediaQuery.of(context).copyWith(textScaleFactor: 99), child: CupertinoPageScaffold( child: CustomScrollView( slivers: [ @@ -1154,7 +1154,7 @@ void main() { title: 'title', builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: 99), + data: MediaQuery.of(context).copyWith(textScaleFactor: 99), child: Container( child: const CupertinoPageScaffold( child: CustomScrollView( diff --git a/packages/flutter/test/cupertino/scaffold_test.dart b/packages/flutter/test/cupertino/scaffold_test.dart index 1116ae17a92..3986fcdfe28 100644 --- a/packages/flutter/test/cupertino/scaffold_test.dart +++ b/packages/flutter/test/cupertino/scaffold_test.dart @@ -49,7 +49,7 @@ void main() { ), )); - expect(MediaQuery.of(childContext)!.padding.top, 0); + expect(MediaQuery.of(childContext).padding.top, 0); // The top of the [Container] is 44 px from the top of the screen because // it's pushed down by the opaque navigation bar whose height is 44 px, // and the 20 px [MediaQuery] top padding is fully absorbed by the navigation bar. @@ -94,12 +94,12 @@ void main() { } await tester.pumpWidget(scaffoldWithBrightness(Brightness.light)); - expect(MediaQuery.of(childContext)!.padding.top, 0); + expect(MediaQuery.of(childContext).padding.top, 0); expect(find.byType(CupertinoPageScaffold), paints..rect(color: backgroundColor.color)); await tester.pumpWidget(scaffoldWithBrightness(Brightness.dark)); - expect(MediaQuery.of(childContext)!.padding.top, greaterThan(0)); + expect(MediaQuery.of(childContext).padding.top, greaterThan(0)); expect(find.byType(CupertinoPageScaffold), paints..rect(color: backgroundColor.darkColor)); }); @@ -142,7 +142,7 @@ void main() { expect(tester.getSize(find.byType(Container)).height, 600.0 - 100.0); // The shouldn't see a media query view inset because it was consumed by // the scaffold. - expect(MediaQuery.of(childContext)!.viewInsets.bottom, 0); + expect(MediaQuery.of(childContext).viewInsets.bottom, 0); await tester.pumpWidget(Directionality( textDirection: TextDirection.ltr, @@ -439,7 +439,7 @@ void main() { builder: (BuildContext context, Widget? child) { // Acts as a 20px status bar at the root of the app. return MediaQuery( - data: MediaQuery.of(context)!.copyWith(padding: const EdgeInsets.only(top: 20)), + data: MediaQuery.of(context).copyWith(padding: const EdgeInsets.only(top: 20)), child: child!, ); }, @@ -537,7 +537,7 @@ void main() { CupertinoApp( home: Builder(builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: 99), + data: MediaQuery.of(context).copyWith(textScaleFactor: 99), child: const CupertinoPageScaffold( navigationBar: CupertinoNavigationBar( middle: Text('middle'), diff --git a/packages/flutter/test/cupertino/tab_scaffold_test.dart b/packages/flutter/test/cupertino/tab_scaffold_test.dart index 543257fe138..c4d4d87893d 100644 --- a/packages/flutter/test/cupertino/tab_scaffold_test.dart +++ b/packages/flutter/test/cupertino/tab_scaffold_test.dart @@ -406,7 +406,7 @@ void main() { expect(tester.getRect(find.byType(Placeholder)), const Rect.fromLTWH(0, 0, 800, 400)); // Don't generate more media query padding from the translucent bottom // tab since the tab is behind the keyboard now. - expect(MediaQuery.of(innerContext)!.padding.bottom, 0); + expect(MediaQuery.of(innerContext).padding.bottom, 0); }); testWidgets('Tab contents are not inset when resizeToAvoidBottomInset overridden', (WidgetTester tester) async { @@ -433,7 +433,7 @@ void main() { expect(tester.getRect(find.byType(Placeholder)), const Rect.fromLTWH(0, 0, 800, 600)); // Media query padding shows up in the inner content because it wasn't masked // by the view inset. - expect(MediaQuery.of(innerContext)!.padding.bottom, 50); + expect(MediaQuery.of(innerContext).padding.bottom, 50); }); testWidgets('Tab contents bottom padding are not consumed by viewInsets when resizeToAvoidBottomInset overridden', (WidgetTester tester) async { @@ -502,7 +502,7 @@ void main() { items: List.generate(2, tabGenerator), ), tabBuilder: (BuildContext context, int index) { - contentPadding = MediaQuery.of(context)!.padding; + contentPadding = MediaQuery.of(context).padding; return const Placeholder(); } ), @@ -543,7 +543,7 @@ void main() { ); expect(tester.getRect(find.byType(Placeholder)), const Rect.fromLTWH(0, 0, 800, 400)); - expect(MediaQuery.of(innerContext)!.padding.bottom, 0); + expect(MediaQuery.of(innerContext).padding.bottom, 0); }); testWidgets('Deleting tabs after selecting them should switch to the last available tab', (WidgetTester tester) async { @@ -1074,7 +1074,7 @@ void main() { CupertinoApp( home: Builder(builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: 99), + data: MediaQuery.of(context).copyWith(textScaleFactor: 99), child: CupertinoTabScaffold( tabBar: CupertinoTabBar( items: List.generate( diff --git a/packages/flutter/test/material/app_bar_test.dart b/packages/flutter/test/material/app_bar_test.dart index 1c74e0cec2e..5af0cf6ce10 100644 --- a/packages/flutter/test/material/app_bar_test.dart +++ b/packages/flutter/test/material/app_bar_test.dart @@ -1957,7 +1957,7 @@ void main() { home: Builder( builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: textScaleFactor), + data: MediaQuery.of(context).copyWith(textScaleFactor: textScaleFactor), child: Scaffold( appBar: AppBar( centerTitle: false, @@ -2002,7 +2002,7 @@ void main() { appBar: AppBar( centerTitle: centerTitle, title: MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: textScaleFactor), + data: MediaQuery.of(context).copyWith(textScaleFactor: textScaleFactor), child: const Text('Jumbo'), ), ), diff --git a/packages/flutter/test/material/app_test.dart b/packages/flutter/test/material/app_test.dart index 1d65595cedf..8b9c15e4bd4 100644 --- a/packages/flutter/test/material/app_test.dart +++ b/packages/flutter/test/material/app_test.dart @@ -464,7 +464,7 @@ void main() { double? textScaleFactor; await tester.pumpWidget(MaterialApp( home: Builder(builder:(BuildContext context) { - textScaleFactor = MediaQuery.of(context)!.textScaleFactor; + textScaleFactor = MediaQuery.of(context).textScaleFactor; return Container(); }), )); diff --git a/packages/flutter/test/material/bottom_sheet_test.dart b/packages/flutter/test/material/bottom_sheet_test.dart index 0c30a9ff07a..e6cff5c1ee4 100644 --- a/packages/flutter/test/material/bottom_sheet_test.dart +++ b/packages/flutter/test/material/bottom_sheet_test.dart @@ -467,11 +467,11 @@ void main() { await tester.pump(const Duration(seconds: 1)); expect( - MediaQuery.of(outerContext)!.padding, + MediaQuery.of(outerContext).padding, const EdgeInsets.all(50.0), ); expect( - MediaQuery.of(innerContext)!.padding, + MediaQuery.of(innerContext).padding, const EdgeInsets.only(left: 50.0, right: 50.0, bottom: 50.0), ); }); diff --git a/packages/flutter/test/material/circle_avatar_test.dart b/packages/flutter/test/material/circle_avatar_test.dart index 620a0f83f32..cb4d31c284d 100644 --- a/packages/flutter/test/material/circle_avatar_test.dart +++ b/packages/flutter/test/material/circle_avatar_test.dart @@ -169,7 +169,7 @@ void main() { child: CircleAvatar( child: Builder( builder: (BuildContext context) { - final MediaQueryData data = MediaQuery.of(context)!; + final MediaQueryData data = MediaQuery.of(context); // These should not change. expect(data.size, equals(const Size(111.0, 111.0))); diff --git a/packages/flutter/test/material/dialog_test.dart b/packages/flutter/test/material/dialog_test.dart index 38b92f94764..c22e922dd9c 100644 --- a/packages/flutter/test/material/dialog_test.dart +++ b/packages/flutter/test/material/dialog_test.dart @@ -25,7 +25,7 @@ MaterialApp _buildAppWithDialog(Widget dialog, { ThemeData? theme, double textSc context: context, builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: textScaleFactor), + data: MediaQuery.of(context).copyWith(textScaleFactor: textScaleFactor), child: dialog, ); }, @@ -1188,12 +1188,12 @@ void main() { await tester.pump(); - expect(MediaQuery.of(outerContext)!.padding, const EdgeInsets.all(50.0)); - expect(MediaQuery.of(routeContext)!.padding, EdgeInsets.zero); - expect(MediaQuery.of(dialogContext)!.padding, EdgeInsets.zero); - expect(MediaQuery.of(outerContext)!.viewInsets, const EdgeInsets.only(left: 25.0, bottom: 75.0)); - expect(MediaQuery.of(routeContext)!.viewInsets, const EdgeInsets.only(left: 25.0, bottom: 75.0)); - expect(MediaQuery.of(dialogContext)!.viewInsets, EdgeInsets.zero); + expect(MediaQuery.of(outerContext).padding, const EdgeInsets.all(50.0)); + expect(MediaQuery.of(routeContext).padding, EdgeInsets.zero); + expect(MediaQuery.of(dialogContext).padding, EdgeInsets.zero); + expect(MediaQuery.of(outerContext).viewInsets, const EdgeInsets.only(left: 25.0, bottom: 75.0)); + expect(MediaQuery.of(routeContext).viewInsets, const EdgeInsets.only(left: 25.0, bottom: 75.0)); + expect(MediaQuery.of(dialogContext).viewInsets, EdgeInsets.zero); }); testWidgets('Dialog widget insets by viewInsets', (WidgetTester tester) async { diff --git a/packages/flutter/test/material/dropdown_test.dart b/packages/flutter/test/material/dropdown_test.dart index 61255648134..8bb9c2ef68d 100644 --- a/packages/flutter/test/material/dropdown_test.dart +++ b/packages/flutter/test/material/dropdown_test.dart @@ -2086,7 +2086,7 @@ void main() { builder: (BuildContext context, StateSetter setState) { return MaterialApp( builder: (BuildContext context, Widget? child) { - mediaQuery = MediaQuery.of(context)!; + mediaQuery = MediaQuery.of(context); return MediaQuery( data: mediaQuery, child: child!, diff --git a/packages/flutter/test/material/elevated_button_test.dart b/packages/flutter/test/material/elevated_button_test.dart index 81d5ec4a8c0..fc7206740d6 100644 --- a/packages/flutter/test/material/elevated_button_test.dart +++ b/packages/flutter/test/material/elevated_button_test.dart @@ -766,7 +766,7 @@ void main() { home: Builder( builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith( + data: MediaQuery.of(context).copyWith( textScaleFactor: textScaleFactor, ), child: Directionality( @@ -902,7 +902,7 @@ void main() { home: Builder( builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith( + data: MediaQuery.of(context).copyWith( textScaleFactor: 2, ), child: Scaffold( diff --git a/packages/flutter/test/material/flexible_space_bar_test.dart b/packages/flutter/test/material/flexible_space_bar_test.dart index 398b083e0b9..b246c197b54 100644 --- a/packages/flutter/test/material/flexible_space_bar_test.dart +++ b/packages/flutter/test/material/flexible_space_bar_test.dart @@ -394,7 +394,7 @@ void main() { home: Scaffold( body: Builder( builder: (BuildContext context) { - width = MediaQuery.of(context)!.size.width; + width = MediaQuery.of(context).size.width; return CustomScrollView( slivers: [ SliverAppBar( diff --git a/packages/flutter/test/material/navigation_rail_test.dart b/packages/flutter/test/material/navigation_rail_test.dart index 11e72535dd2..53389c8d833 100644 --- a/packages/flutter/test/material/navigation_rail_test.dart +++ b/packages/flutter/test/material/navigation_rail_test.dart @@ -1706,7 +1706,7 @@ void main() { body: Row( children: [ MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: 3.0), + data: MediaQuery.of(context).copyWith(textScaleFactor: 3.0), child: NavigationRail( selectedIndex: 0, destinations: const [ @@ -2111,7 +2111,7 @@ Future _pumpNavigationRail( home: Builder( builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith(textScaleFactor: textScaleFactor), + data: MediaQuery.of(context).copyWith(textScaleFactor: textScaleFactor), child: Scaffold( body: Row( children: [ diff --git a/packages/flutter/test/material/outlined_button_test.dart b/packages/flutter/test/material/outlined_button_test.dart index f5c02ae2d96..a8007d3c027 100644 --- a/packages/flutter/test/material/outlined_button_test.dart +++ b/packages/flutter/test/material/outlined_button_test.dart @@ -1009,7 +1009,7 @@ void main() { home: Builder( builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith( + data: MediaQuery.of(context).copyWith( textScaleFactor: textScaleFactor, ), child: Directionality( @@ -1148,7 +1148,7 @@ void main() { home: Builder( builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith( + data: MediaQuery.of(context).copyWith( textScaleFactor: 2, ), child: Scaffold( diff --git a/packages/flutter/test/material/persistent_bottom_sheet_test.dart b/packages/flutter/test/material/persistent_bottom_sheet_test.dart index 75bf88e8973..e8f1f7099d7 100644 --- a/packages/flutter/test/material/persistent_bottom_sheet_test.dart +++ b/packages/flutter/test/material/persistent_bottom_sheet_test.dart @@ -408,7 +408,7 @@ void main() { await tester.pump(); expect( - MediaQuery.of(bottomSheetContext)!.padding, + MediaQuery.of(bottomSheetContext).padding, const EdgeInsets.only( bottom: 50.0, left: 50.0, diff --git a/packages/flutter/test/material/popup_menu_test.dart b/packages/flutter/test/material/popup_menu_test.dart index d4f5be8a96e..891b13f0687 100644 --- a/packages/flutter/test/material/popup_menu_test.dart +++ b/packages/flutter/test/material/popup_menu_test.dart @@ -138,7 +138,7 @@ void main() { return MaterialApp( home: Builder(builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith( + data: MediaQuery.of(context).copyWith( navigationMode: NavigationMode.directional, ), child: Material( @@ -254,7 +254,7 @@ void main() { MaterialApp( home: Builder(builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith( + data: MediaQuery.of(context).copyWith( navigationMode: NavigationMode.directional, ), child: Material( @@ -755,7 +755,7 @@ void main() { await tester.pump(); - expect(MediaQuery.of(popupContext)!.padding, EdgeInsets.zero); + expect(MediaQuery.of(popupContext).padding, EdgeInsets.zero); }); testWidgets('Popup Menu Offset Test', (WidgetTester tester) async { diff --git a/packages/flutter/test/material/scaffold_test.dart b/packages/flutter/test/material/scaffold_test.dart index ff2c4243a8a..3bac4b92b4d 100644 --- a/packages/flutter/test/material/scaffold_test.dart +++ b/packages/flutter/test/material/scaffold_test.dart @@ -683,7 +683,7 @@ void main() { extendBody: extendBody, body: Builder( builder: (BuildContext context) { - mediaQueryBottom = MediaQuery.of(context)!.padding.bottom; + mediaQueryBottom = MediaQuery.of(context).padding.bottom; return Container(key: bodyKey); }, ), @@ -756,7 +756,7 @@ void main() { ), body: Builder( builder: (BuildContext context) { - mediaQueryTop = MediaQuery.of(context)!.padding.top; + mediaQueryTop = MediaQuery.of(context).padding.top; return Container(key: bodyKey); } ), @@ -1675,7 +1675,7 @@ void main() { MaterialApp( home: Builder( builder: (BuildContext context) { - screenWidth = MediaQuery.of(context)!.size.width; + screenWidth = MediaQuery.of(context).size.width; return Scaffold( endDrawer: const Drawer( child: Text('Drawer'), diff --git a/packages/flutter/test/material/text_button_test.dart b/packages/flutter/test/material/text_button_test.dart index f77e9d0fe0c..0d697a9b4a0 100644 --- a/packages/flutter/test/material/text_button_test.dart +++ b/packages/flutter/test/material/text_button_test.dart @@ -804,7 +804,7 @@ void main() { home: Builder( builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith( + data: MediaQuery.of(context).copyWith( textScaleFactor: textScaleFactor, ), child: Directionality( @@ -946,7 +946,7 @@ void main() { home: Builder( builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith( + data: MediaQuery.of(context).copyWith( textScaleFactor: 2, ), child: Scaffold( diff --git a/packages/flutter/test/material/text_field_test.dart b/packages/flutter/test/material/text_field_test.dart index 26e07dd229a..f7f50a41b34 100644 --- a/packages/flutter/test/material/text_field_test.dart +++ b/packages/flutter/test/material/text_field_test.dart @@ -5439,7 +5439,7 @@ void main() { boilerplate( child: Builder(builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith( + data: MediaQuery.of(context).copyWith( navigationMode: NavigationMode.directional, ), child: TextField( @@ -5460,7 +5460,7 @@ void main() { boilerplate( child: Builder(builder: (BuildContext context) { return MediaQuery( - data: MediaQuery.of(context)!.copyWith( + data: MediaQuery.of(context).copyWith( navigationMode: NavigationMode.directional, ), child: TextField( diff --git a/packages/flutter/test/widgets/debug_test.dart b/packages/flutter/test/widgets/debug_test.dart index c6f5a591799..19b731caee4 100644 --- a/packages/flutter/test/widgets/debug_test.dart +++ b/packages/flutter/test/widgets/debug_test.dart @@ -111,23 +111,29 @@ void main() { expect( error.diagnostics.last.toStringDeep(), equalsIgnoringHashCodes( - 'Typically, the MediaQuery widget is introduced by the MaterialApp\n' - 'or WidgetsApp widget at the top of your application widget tree.\n' + 'No MediaQuery ancestor could be found starting from the context\n' + 'that was passed to MediaQuery.of(). This can happen because you\n' + 'have not added a WidgetsApp, CupertinoApp, or MaterialApp widget\n' + '(those widgets introduce a MediaQuery), or it can happen if the\n' + 'context you use comes from a widget above those widgets.\n' ), ); expect( error.toStringDeep(), equalsIgnoringHashCodes( 'FlutterError\n' - ' No MediaQuery widget found.\n' + ' No MediaQuery widget ancestor found.\n' ' Builder widgets require a MediaQuery widget ancestor.\n' ' The specific widget that could not find a MediaQuery ancestor\n' ' was:\n' ' Builder\n' ' The ownership chain for the affected widget is: "Builder ←\n' ' [root]"\n' - ' Typically, the MediaQuery widget is introduced by the MaterialApp\n' - ' or WidgetsApp widget at the top of your application widget tree.\n' + ' No MediaQuery ancestor could be found starting from the context\n' + ' that was passed to MediaQuery.of(). This can happen because you\n' + ' have not added a WidgetsApp, CupertinoApp, or MaterialApp widget\n' + ' (those widgets introduce a MediaQuery), or it can happen if the\n' + ' context you use comes from a widget above those widgets.\n' ), ); } diff --git a/packages/flutter/test/widgets/list_view_test.dart b/packages/flutter/test/widgets/list_view_test.dart index 104969760b7..29e14a6ceba 100644 --- a/packages/flutter/test/widgets/list_view_test.dart +++ b/packages/flutter/test/widgets/list_view_test.dart @@ -382,7 +382,7 @@ void main() { children: [ const Text('top', textDirection: TextDirection.ltr), Builder(builder: (BuildContext context) { - innerMediaQueryPadding = MediaQuery.of(context)!.padding; + innerMediaQueryPadding = MediaQuery.of(context).padding; return Container(); }), ], diff --git a/packages/flutter/test/widgets/media_query_test.dart b/packages/flutter/test/widgets/media_query_test.dart index 07f0095dd53..1413475cfdb 100644 --- a/packages/flutter/test/widgets/media_query_test.dart +++ b/packages/flutter/test/widgets/media_query_test.dart @@ -24,31 +24,54 @@ void main() { expect(exception, isNotNull); expect(exception ,isFlutterError); final FlutterError error = exception as FlutterError; - expect(error.diagnostics.length, 3); - expect(error.diagnostics.last, isA>()); + expect(error.diagnostics.length, 5); + expect(error.diagnostics.last, isA()); expect( error.toStringDeep(), equalsIgnoringHashCodes( 'FlutterError\n' - ' MediaQuery.of() called with a context that does not contain a\n' - ' MediaQuery.\n' + ' No MediaQuery widget ancestor found.\n' + ' Builder widgets require a MediaQuery widget ancestor.\n' + ' The specific widget that could not find a MediaQuery ancestor\n' + ' was:\n' + ' Builder\n' + ' The ownership chain for the affected widget is: "Builder ←\n' + ' [root]"\n' ' No MediaQuery ancestor could be found starting from the context\n' ' that was passed to MediaQuery.of(). This can happen because you\n' - ' do not have a WidgetsApp or MaterialApp widget (those widgets\n' - ' introduce a MediaQuery), or it can happen if the context you use\n' - ' comes from a widget above those widgets.\n' - ' The context used was:\n' - ' Builder\n', + ' have not added a WidgetsApp, CupertinoApp, or MaterialApp widget\n' + ' (those widgets introduce a MediaQuery), or it can happen if the\n' + ' context you use comes from a widget above those widgets.\n' ), ); }); - testWidgets('MediaQuery defaults to null', (WidgetTester tester) async { + testWidgets('MediaQuery.of finds a MediaQueryData when there is one', (WidgetTester tester) async { + bool tested = false; + await tester.pumpWidget( + MediaQuery( + data: const MediaQueryData(), + child: Builder( + builder: (BuildContext context) { + final MediaQueryData data = MediaQuery.of(context); + expect(data, isNotNull); + tested = true; + return Container(); + }, + ), + ), + ); + final dynamic exception = tester.takeException(); + expect(exception, isNull); + expect(tested, isTrue); + }); + + testWidgets('MediaQuery.maybeOf defaults to null', (WidgetTester tester) async { bool tested = false; await tester.pumpWidget( Builder( builder: (BuildContext context) { - final MediaQueryData? data = MediaQuery.of(context, nullOk: true); + final MediaQueryData? data = MediaQuery.maybeOf(context); expect(data, isNull); tested = true; return Container(); @@ -58,7 +81,25 @@ void main() { expect(tested, isTrue); }); - testWidgets('MediaQueryData is sane', (WidgetTester tester) async { + testWidgets('MediaQuery.maybeOf finds a MediaQueryData when there is one', (WidgetTester tester) async { + bool tested = false; + await tester.pumpWidget( + MediaQuery( + data: const MediaQueryData(), + child: Builder( + builder: (BuildContext context) { + final MediaQueryData? data = MediaQuery.maybeOf(context); + expect(data, isNotNull); + tested = true; + return Container(); + }, + ), + ), + ); + expect(tested, isTrue); + }); + + testWidgets('MediaQueryData.fromWindow is sane', (WidgetTester tester) async { final MediaQueryData data = MediaQueryData.fromWindow(WidgetsBinding.instance!.window); expect(data, hasOneLineDescription); expect(data.hashCode, equals(data.copyWith().hashCode)); @@ -169,7 +210,7 @@ void main() { removeBottom: true, child: Builder( builder: (BuildContext context) { - unpadded = MediaQuery.of(context)!; + unpadded = MediaQuery.of(context); return Container(); }, ), @@ -225,7 +266,7 @@ void main() { context: context, child: Builder( builder: (BuildContext context) { - unpadded = MediaQuery.of(context)!; + unpadded = MediaQuery.of(context); return Container(); }, ), @@ -284,7 +325,7 @@ void main() { removeBottom: true, child: Builder( builder: (BuildContext context) { - unpadded = MediaQuery.of(context)!; + unpadded = MediaQuery.of(context); return Container(); }, ), @@ -340,7 +381,7 @@ void main() { removeBottom: true, child: Builder( builder: (BuildContext context) { - unpadded = MediaQuery.of(context)!; + unpadded = MediaQuery.of(context); return Container(); }, ), @@ -399,7 +440,7 @@ void main() { removeBottom: true, child: Builder( builder: (BuildContext context) { - unpadded = MediaQuery.of(context)!; + unpadded = MediaQuery.of(context); return Container(); }, ), @@ -455,7 +496,7 @@ void main() { removeLeft: true, child: Builder( builder: (BuildContext context) { - unpadded = MediaQuery.of(context)!; + unpadded = MediaQuery.of(context); return Container(); }, ), diff --git a/packages/flutter/test/widgets/render_object_widget_test.dart b/packages/flutter/test/widgets/render_object_widget_test.dart index 32c23321882..4bf6a15ff96 100644 --- a/packages/flutter/test/widgets/render_object_widget_test.dart +++ b/packages/flutter/test/widgets/render_object_widget_test.dart @@ -28,7 +28,7 @@ class TestOrientedBox extends SingleChildRenderObjectWidget { const TestOrientedBox({ Key? key, Widget? child }) : super(key: key, child: child); Decoration _getDecoration(BuildContext context) { - final Orientation orientation = MediaQuery.of(context)!.orientation; + final Orientation orientation = MediaQuery.of(context).orientation; switch (orientation) { case Orientation.landscape: return const BoxDecoration(color: Color(0xFF00FF00)); diff --git a/packages/flutter/test/widgets/selectable_text_test.dart b/packages/flutter/test/widgets/selectable_text_test.dart index f1b02e4f74b..d831c2e4c5e 100644 --- a/packages/flutter/test/widgets/selectable_text_test.dart +++ b/packages/flutter/test/widgets/selectable_text_test.dart @@ -2276,7 +2276,7 @@ void main() { await tester.pumpWidget(selectableText); final dynamic exception = tester.takeException(); expect(exception, isFlutterError); - expect(exception.toString(), startsWith('No MediaQuery widget found.\nSelectableText widgets require a MediaQuery widget ancestor.')); + expect(exception.toString(), startsWith('No MediaQuery widget ancestor found.\nSelectableText widgets require a MediaQuery widget ancestor.')); }); testWidgets('onTap is called upon tap', (WidgetTester tester) async {