From f2a25c5bd2de39a80246370ad53c5bf2e93c81be Mon Sep 17 00:00:00 2001 From: Michael Goderbauer Date: Fri, 30 Oct 2020 15:43:03 -0700 Subject: [PATCH] Make Directionality.of non-null (#69060) --- .../lib/src/cupertino/date_picker.dart | 2 +- .../flutter/lib/src/cupertino/nav_bar.dart | 4 +-- .../flutter/lib/src/cupertino/picker.dart | 4 +-- packages/flutter/lib/src/cupertino/route.dart | 6 ++-- .../flutter/lib/src/cupertino/scrollbar.dart | 4 +-- .../lib/src/cupertino/segmented_control.dart | 4 +-- .../flutter/lib/src/cupertino/slider.dart | 4 +-- .../cupertino/sliding_segmented_control.dart | 2 +- .../flutter/lib/src/cupertino/switch.dart | 4 +-- .../animated_icons/animated_icons.dart | 2 +- .../src/material/bottom_navigation_bar.dart | 2 +- packages/flutter/lib/src/material/chip.dart | 2 +- packages/flutter/lib/src/material/drawer.dart | 6 ++-- .../lib/src/material/flexible_space_bar.dart | 2 +- .../flutter/lib/src/material/ink_well.dart | 4 +-- .../lib/src/material/input_decorator.dart | 4 +-- .../flutter/lib/src/material/list_tile.dart | 2 +- .../pickers/calendar_date_picker.dart | 6 ++-- .../pickers/calendar_date_range_picker.dart | 4 +-- .../flutter/lib/src/material/popup_menu.dart | 2 +- .../lib/src/material/progress_indicator.dart | 2 +- .../lib/src/material/range_slider.dart | 4 +-- .../flutter/lib/src/material/scaffold.dart | 2 +- .../flutter/lib/src/material/scrollbar.dart | 2 +- packages/flutter/lib/src/material/slider.dart | 6 ++-- packages/flutter/lib/src/material/switch.dart | 4 +-- packages/flutter/lib/src/material/tabs.dart | 2 +- .../flutter/lib/src/material/time_picker.dart | 4 +-- .../lib/src/material/toggle_buttons.dart | 6 ++-- .../flutter/lib/src/material/tooltip.dart | 2 +- .../material/user_accounts_drawer_header.dart | 2 +- packages/flutter/lib/src/widgets/banner.dart | 4 +-- packages/flutter/lib/src/widgets/basic.dart | 29 +++++++++++++------ .../flutter/lib/src/widgets/dismissible.dart | 6 ++-- .../lib/src/widgets/editable_text.dart | 4 +-- packages/flutter/lib/src/widgets/icon.dart | 2 +- .../lib/src/widgets/implicit_animations.dart | 2 +- .../lib/src/widgets/navigation_toolbar.dart | 2 +- .../flutter/lib/src/widgets/overflow_bar.dart | 4 +-- packages/flutter/lib/src/widgets/overlay.dart | 4 +-- .../flutter/lib/src/widgets/page_view.dart | 2 +- .../lib/src/widgets/platform_view.dart | 4 +-- packages/flutter/lib/src/widgets/table.dart | 4 +-- .../flutter/lib/src/widgets/viewport.dart | 4 +-- .../test/widgets/directionality_test.dart | 24 ++++++++++++++- 45 files changed, 117 insertions(+), 84 deletions(-) diff --git a/packages/flutter/lib/src/cupertino/date_picker.dart b/packages/flutter/lib/src/cupertino/date_picker.dart index 1b361c4ba25..b9bccccd493 100644 --- a/packages/flutter/lib/src/cupertino/date_picker.dart +++ b/packages/flutter/lib/src/cupertino/date_picker.dart @@ -1620,7 +1620,7 @@ class _CupertinoTimerPickerState extends State { void didChangeDependencies() { super.didChangeDependencies(); - textDirection = Directionality.of(context)!; + textDirection = Directionality.of(context); localizations = CupertinoLocalizations.of(context); _measureLabelMetrics(); diff --git a/packages/flutter/lib/src/cupertino/nav_bar.dart b/packages/flutter/lib/src/cupertino/nav_bar.dart index 11e39678cf6..4f388da2568 100644 --- a/packages/flutter/lib/src/cupertino/nav_bar.dart +++ b/packages/flutter/lib/src/cupertino/nav_bar.dart @@ -1374,7 +1374,7 @@ class _BackChevron extends StatelessWidget { @override Widget build(BuildContext context) { - final TextDirection textDirection = Directionality.of(context)!; + final TextDirection textDirection = Directionality.of(context); final TextStyle textStyle = DefaultTextStyle.of(context).style; // Replicate the Icon logic here to get a tightly sized icon and add @@ -1588,7 +1588,7 @@ class _NavigationBarTransition extends StatelessWidget { animation: animation, bottomNavBar: bottomNavBar, topNavBar: topNavBar, - directionality: Directionality.of(context)!, + directionality: Directionality.of(context), ); final List children = [ diff --git a/packages/flutter/lib/src/cupertino/picker.dart b/packages/flutter/lib/src/cupertino/picker.dart index 456dccd4b1d..b95dccee38c 100644 --- a/packages/flutter/lib/src/cupertino/picker.dart +++ b/packages/flutter/lib/src/cupertino/picker.dart @@ -413,14 +413,14 @@ class _CupertinoPickerSemantics extends SingleChildRenderObjectWidget { @override RenderObject createRenderObject(BuildContext context) { assert(debugCheckHasDirectionality(context)); - return _RenderCupertinoPickerSemantics(scrollController, Directionality.of(context)!); + return _RenderCupertinoPickerSemantics(scrollController, Directionality.of(context)); } @override void updateRenderObject(BuildContext context, covariant _RenderCupertinoPickerSemantics renderObject) { assert(debugCheckHasDirectionality(context)); renderObject - ..textDirection = Directionality.of(context)! + ..textDirection = Directionality.of(context) ..controller = scrollController; } } diff --git a/packages/flutter/lib/src/cupertino/route.dart b/packages/flutter/lib/src/cupertino/route.dart index 61c9ee37edf..b8e9be67782 100644 --- a/packages/flutter/lib/src/cupertino/route.dart +++ b/packages/flutter/lib/src/cupertino/route.dart @@ -514,7 +514,7 @@ class CupertinoPageTransition extends StatelessWidget { @override Widget build(BuildContext context) { assert(debugCheckHasDirectionality(context)); - final TextDirection? textDirection = Directionality.of(context); + final TextDirection textDirection = Directionality.of(context); return SlideTransition( position: _secondaryPositionAnimation, textDirection: textDirection, @@ -578,7 +578,7 @@ class CupertinoFullscreenDialogTransition extends StatelessWidget { @override Widget build(BuildContext context) { assert(debugCheckHasDirectionality(context)); - final TextDirection? textDirection = Directionality.of(context); + final TextDirection textDirection = Directionality.of(context); return SlideTransition( position: _secondaryPositionAnimation, textDirection: textDirection, @@ -677,7 +677,7 @@ class _CupertinoBackGestureDetectorState extends State<_CupertinoBackGestureD } double _convertToLogical(double value) { - switch (Directionality.of(context)!) { + switch (Directionality.of(context)) { case TextDirection.rtl: return -value; case TextDirection.ltr: diff --git a/packages/flutter/lib/src/cupertino/scrollbar.dart b/packages/flutter/lib/src/cupertino/scrollbar.dart index 0588345b465..c9e23fb943c 100644 --- a/packages/flutter/lib/src/cupertino/scrollbar.dart +++ b/packages/flutter/lib/src/cupertino/scrollbar.dart @@ -283,7 +283,7 @@ class _CupertinoScrollbarState extends State with TickerProv _painter = _buildCupertinoScrollbarPainter(context); } else { _painter! - ..textDirection = Directionality.of(context)! + ..textDirection = Directionality.of(context) ..color = CupertinoDynamicColor.resolve(_kScrollbarColor, context)! ..padding = MediaQuery.of(context).padding; } @@ -309,7 +309,7 @@ class _CupertinoScrollbarState extends State with TickerProv ScrollbarPainter _buildCupertinoScrollbarPainter(BuildContext context) { return ScrollbarPainter( color: CupertinoDynamicColor.resolve(_kScrollbarColor, context)!, - textDirection: Directionality.of(context)!, + textDirection: Directionality.of(context), thickness: _thickness, fadeoutOpacityAnimation: _fadeoutOpacityAnimation, mainAxisMargin: _kScrollbarMainAxisMargin, diff --git a/packages/flutter/lib/src/cupertino/segmented_control.dart b/packages/flutter/lib/src/cupertino/segmented_control.dart index c569db40f5d..e8399927abf 100644 --- a/packages/flutter/lib/src/cupertino/segmented_control.dart +++ b/packages/flutter/lib/src/cupertino/segmented_control.dart @@ -448,7 +448,7 @@ class _SegmentedControlRenderWidget extends MultiChildRenderObjectWidget { @override RenderObject createRenderObject(BuildContext context) { return _RenderSegmentedControl( - textDirection: Directionality.of(context)!, + textDirection: Directionality.of(context), selectedIndex: selectedIndex, pressedIndex: pressedIndex, backgroundColors: backgroundColors, @@ -459,7 +459,7 @@ class _SegmentedControlRenderWidget extends MultiChildRenderObjectWidget { @override void updateRenderObject(BuildContext context, _RenderSegmentedControl renderObject) { renderObject - ..textDirection = Directionality.of(context)! + ..textDirection = Directionality.of(context) ..selectedIndex = selectedIndex ..pressedIndex = pressedIndex ..backgroundColors = backgroundColors diff --git a/packages/flutter/lib/src/cupertino/slider.dart b/packages/flutter/lib/src/cupertino/slider.dart index 697f1002ddb..0d515cc537f 100644 --- a/packages/flutter/lib/src/cupertino/slider.dart +++ b/packages/flutter/lib/src/cupertino/slider.dart @@ -288,7 +288,7 @@ class _CupertinoSliderRenderObjectWidget extends LeafRenderObjectWidget { onChangeStart: onChangeStart, onChangeEnd: onChangeEnd, vsync: vsync, - textDirection: Directionality.of(context)!, + textDirection: Directionality.of(context), ); } @@ -304,7 +304,7 @@ class _CupertinoSliderRenderObjectWidget extends LeafRenderObjectWidget { ..onChanged = onChanged ..onChangeStart = onChangeStart ..onChangeEnd = onChangeEnd - ..textDirection = Directionality.of(context)!; + ..textDirection = Directionality.of(context); // Ticker provider cannot change since there's a 1:1 relationship between // the _SliderRenderObjectWidget object and the _SliderState object. } diff --git a/packages/flutter/lib/src/cupertino/sliding_segmented_control.dart b/packages/flutter/lib/src/cupertino/sliding_segmented_control.dart index 3d6297a505e..f3d725818c8 100644 --- a/packages/flutter/lib/src/cupertino/sliding_segmented_control.dart +++ b/packages/flutter/lib/src/cupertino/sliding_segmented_control.dart @@ -399,7 +399,7 @@ class _SegmentedControlState extends State with TickerProviderSt ..curve = Curves.linear ..reverseCurve = Curves.linear; final double delta = details.primaryDelta! / _kTrackInnerLength; - switch (Directionality.of(context)!) { + switch (Directionality.of(context)) { case TextDirection.rtl: _positionController.value -= delta; break; @@ -302,7 +302,7 @@ class _CupertinoSwitchState extends State with TickerProviderSt )!, trackColor: CupertinoDynamicColor.resolve(widget.trackColor ?? CupertinoColors.secondarySystemFill, context)!, onChanged: widget.onChanged, - textDirection: Directionality.of(context)!, + textDirection: Directionality.of(context), state: this, ), ); diff --git a/packages/flutter/lib/src/material/animated_icons/animated_icons.dart b/packages/flutter/lib/src/material/animated_icons/animated_icons.dart index 09a423bc209..8e90b300a3e 100644 --- a/packages/flutter/lib/src/material/animated_icons/animated_icons.dart +++ b/packages/flutter/lib/src/material/animated_icons/animated_icons.dart @@ -109,7 +109,7 @@ class AnimatedIcon extends StatelessWidget { final IconThemeData iconTheme = IconTheme.of(context); assert(iconTheme.isConcrete); final double iconSize = size ?? iconTheme.size!; - final TextDirection textDirection = this.textDirection ?? Directionality.of(context)!; + final TextDirection textDirection = this.textDirection ?? Directionality.of(context); final double iconOpacity = iconTheme.opacity!; Color iconColor = color ?? iconTheme.color!; if (iconOpacity != 1.0) diff --git a/packages/flutter/lib/src/material/bottom_navigation_bar.dart b/packages/flutter/lib/src/material/bottom_navigation_bar.dart index a7742936519..541c33a6104 100644 --- a/packages/flutter/lib/src/material/bottom_navigation_bar.dart +++ b/packages/flutter/lib/src/material/bottom_navigation_bar.dart @@ -940,7 +940,7 @@ class _BottomNavigationBarState extends State with TickerPr child: CustomPaint( painter: _RadialPainter( circles: _circles.toList(), - textDirection: Directionality.of(context)!, + textDirection: Directionality.of(context), ), child: Material( // Splashes. type: MaterialType.transparency, diff --git a/packages/flutter/lib/src/material/chip.dart b/packages/flutter/lib/src/material/chip.dart index 043cc0af972..b592d53b090 100644 --- a/packages/flutter/lib/src/material/chip.dart +++ b/packages/flutter/lib/src/material/chip.dart @@ -2129,7 +2129,7 @@ class _ChipRenderWidget extends RenderObjectWidget { RenderObject createRenderObject(BuildContext context) { return _RenderChip( theme: theme, - textDirection: Directionality.of(context)!, + textDirection: Directionality.of(context), value: value, isEnabled: isEnabled, checkmarkAnimation: checkmarkAnimation, diff --git a/packages/flutter/lib/src/material/drawer.dart b/packages/flutter/lib/src/material/drawer.dart index 799a70052bb..ff6de834ad4 100644 --- a/packages/flutter/lib/src/material/drawer.dart +++ b/packages/flutter/lib/src/material/drawer.dart @@ -407,7 +407,7 @@ class DrawerControllerState extends State with SingleTickerPro delta = -delta; break; } - switch (Directionality.of(context)!) { + switch (Directionality.of(context)) { case TextDirection.rtl: _controller.value -= delta; break; @@ -434,7 +434,7 @@ class DrawerControllerState extends State with SingleTickerPro visualVelocity = -visualVelocity; break; } - switch (Directionality.of(context)!) { + switch (Directionality.of(context)) { case TextDirection.rtl: _controller.fling(velocity: -visualVelocity); if (widget.drawerCallback != null) @@ -499,7 +499,7 @@ class DrawerControllerState extends State with SingleTickerPro Widget _buildDrawer(BuildContext context) { final bool drawerIsStart = widget.alignment == DrawerAlignment.start; final EdgeInsets padding = MediaQuery.of(context).padding; - final TextDirection textDirection = Directionality.of(context)!; + final TextDirection textDirection = Directionality.of(context); double? dragAreaWidth = widget.edgeDragWidth; if (widget.edgeDragWidth == null) { diff --git a/packages/flutter/lib/src/material/flexible_space_bar.dart b/packages/flutter/lib/src/material/flexible_space_bar.dart index 6a6ef0e8e7e..63825161e20 100644 --- a/packages/flutter/lib/src/material/flexible_space_bar.dart +++ b/packages/flutter/lib/src/material/flexible_space_bar.dart @@ -252,7 +252,7 @@ class _FlexibleSpaceBarState extends State { Alignment _getTitleAlignment(bool effectiveCenterTitle) { if (effectiveCenterTitle) return Alignment.bottomCenter; - final TextDirection textDirection = Directionality.of(context)!; + final TextDirection textDirection = Directionality.of(context); assert(textDirection != null); switch (textDirection) { case TextDirection.rtl: diff --git a/packages/flutter/lib/src/material/ink_well.dart b/packages/flutter/lib/src/material/ink_well.dart index ff267591c5e..94d642b4607 100644 --- a/packages/flutter/lib/src/material/ink_well.dart +++ b/packages/flutter/lib/src/material/ink_well.dart @@ -842,7 +842,7 @@ class _InkResponseState extends State<_InkResponseStateWidget> customBorder: widget.customBorder, rectCallback: widget.getRectCallback!(referenceBox), onRemoved: handleInkRemoval, - textDirection: Directionality.of(context)!, + textDirection: Directionality.of(context), fadeDuration: getFadeDurationForType(type), ); updateKeepAlive(); @@ -900,7 +900,7 @@ class _InkResponseState extends State<_InkResponseStateWidget> borderRadius: borderRadius, customBorder: customBorder, onRemoved: onRemoved, - textDirection: Directionality.of(context)!, + textDirection: Directionality.of(context), ); return splash; diff --git a/packages/flutter/lib/src/material/input_decorator.dart b/packages/flutter/lib/src/material/input_decorator.dart index 58865e94dc6..291b828dbd7 100644 --- a/packages/flutter/lib/src/material/input_decorator.dart +++ b/packages/flutter/lib/src/material/input_decorator.dart @@ -237,7 +237,7 @@ class _BorderContainerState extends State<_BorderContainer> with TickerProviderS border: _border, gapAnimation: widget.gapAnimation, gap: widget.gap, - textDirection: Directionality.of(context)!, + textDirection: Directionality.of(context), fillColor: widget.fillColor, hoverColorTween: _hoverColorTween, hoverAnimation: _hoverAnimation, @@ -2311,7 +2311,7 @@ class _InputDecoratorState extends State with TickerProviderStat // The _Decoration widget and _RenderDecoration assume that contentPadding // has been resolved to EdgeInsets. - final TextDirection textDirection = Directionality.of(context)!; + final TextDirection textDirection = Directionality.of(context); final EdgeInsets? decorationContentPadding = decoration!.contentPadding?.resolve(textDirection); final EdgeInsets contentPadding; diff --git a/packages/flutter/lib/src/material/list_tile.dart b/packages/flutter/lib/src/material/list_tile.dart index f320060badb..935f7f22fd2 100644 --- a/packages/flutter/lib/src/material/list_tile.dart +++ b/packages/flutter/lib/src/material/list_tile.dart @@ -1067,7 +1067,7 @@ class ListTile extends StatelessWidget { } const EdgeInsets _defaultContentPadding = EdgeInsets.symmetric(horizontal: 16.0); - final TextDirection textDirection = Directionality.of(context)!; + final TextDirection textDirection = Directionality.of(context); final EdgeInsets resolvedContentPadding = contentPadding?.resolve(textDirection) ?? tileTheme.contentPadding?.resolve(textDirection) ?? _defaultContentPadding; diff --git a/packages/flutter/lib/src/material/pickers/calendar_date_picker.dart b/packages/flutter/lib/src/material/pickers/calendar_date_picker.dart index c490f341975..102bc303a14 100644 --- a/packages/flutter/lib/src/material/pickers/calendar_date_picker.dart +++ b/packages/flutter/lib/src/material/pickers/calendar_date_picker.dart @@ -180,7 +180,7 @@ class _CalendarDatePickerState extends State { assert(debugCheckHasMaterialLocalizations(context)); assert(debugCheckHasDirectionality(context)); _localizations = MaterialLocalizations.of(context); - _textDirection = Directionality.of(context)!; + _textDirection = Directionality.of(context); if (!_announcedInitialDate) { _announcedInitialDate = true; SemanticsService.announce( @@ -525,7 +525,7 @@ class _MonthPickerState extends State<_MonthPicker> { void didChangeDependencies() { super.didChangeDependencies(); _localizations = MaterialLocalizations.of(context); - _textDirection = Directionality.of(context)!; + _textDirection = Directionality.of(context); } @override @@ -709,7 +709,7 @@ class _MonthPickerState extends State<_MonthPicker> { } DateTime? _nextDateInDirection(DateTime date, TraversalDirection direction) { - final TextDirection textDirection = Directionality.of(context)!; + final TextDirection textDirection = Directionality.of(context); DateTime nextDate = utils.addDaysToDate(date, _dayDirectionOffset(direction, textDirection)); while (!nextDate.isBefore(widget.firstDate) && !nextDate.isAfter(widget.lastDate)) { if (_isSelectable(nextDate)) { 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 8ce4ad978aa..d51dd5a5723 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 @@ -340,7 +340,7 @@ class _CalendarKeyboardNavigatorState extends State<_CalendarKeyboardNavigator> } DateTime? _nextDateInDirection(DateTime date, TraversalDirection direction) { - final TextDirection textDirection = Directionality.of(context)!; + final TextDirection textDirection = Directionality.of(context); final DateTime nextDate = utils.addDaysToDate(date, _dayDirectionOffset(direction, textDirection)); if (!nextDate.isBefore(widget.firstDate) && !nextDate.isAfter(widget.lastDate)) { return nextDate; @@ -707,7 +707,7 @@ class _MonthItemState extends State<_MonthItem> { final ColorScheme colorScheme = theme.colorScheme; final TextTheme textTheme = theme.textTheme; final MaterialLocalizations localizations = MaterialLocalizations.of(context); - final TextDirection textDirection = Directionality.of(context)!; + final TextDirection textDirection = Directionality.of(context); final Color highlightColor = _highlightColor(context); final int day = dayToBuild.day; diff --git a/packages/flutter/lib/src/material/popup_menu.dart b/packages/flutter/lib/src/material/popup_menu.dart index 3ab6e3b159c..111d8ce7c49 100644 --- a/packages/flutter/lib/src/material/popup_menu.dart +++ b/packages/flutter/lib/src/material/popup_menu.dart @@ -749,7 +749,7 @@ class _PopupMenuRoute extends PopupRoute { position, itemSizes, selectedItemIndex, - Directionality.of(context)!, + Directionality.of(context), ), child: capturedThemes.wrap(menu), ); diff --git a/packages/flutter/lib/src/material/progress_indicator.dart b/packages/flutter/lib/src/material/progress_indicator.dart index 129d86c279d..a33b312a940 100644 --- a/packages/flutter/lib/src/material/progress_indicator.dart +++ b/packages/flutter/lib/src/material/progress_indicator.dart @@ -332,7 +332,7 @@ class _LinearProgressIndicatorState extends State with @override Widget build(BuildContext context) { - final TextDirection textDirection = Directionality.of(context)!; + final TextDirection textDirection = Directionality.of(context); if (widget.value != null) return _buildIndicator(context, _controller.value, textDirection); diff --git a/packages/flutter/lib/src/material/range_slider.dart b/packages/flutter/lib/src/material/range_slider.dart index 042835f04b1..c18b83e922c 100644 --- a/packages/flutter/lib/src/material/range_slider.dart +++ b/packages/flutter/lib/src/material/range_slider.dart @@ -720,7 +720,7 @@ class _RangeSliderRenderObjectWidget extends LeafRenderObjectWidget { onChangeStart: onChangeStart, onChangeEnd: onChangeEnd, state: state, - textDirection: Directionality.of(context)!, + textDirection: Directionality.of(context), semanticFormatterCallback: semanticFormatterCallback, platform: Theme.of(context)!.platform, ); @@ -741,7 +741,7 @@ class _RangeSliderRenderObjectWidget extends LeafRenderObjectWidget { ..onChanged = onChanged ..onChangeStart = onChangeStart ..onChangeEnd = onChangeEnd - ..textDirection = Directionality.of(context)! + ..textDirection = Directionality.of(context) ..semanticFormatterCallback = semanticFormatterCallback ..platform = Theme.of(context)!.platform; } diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart index c530c5af3f8..1c40f5170ef 100644 --- a/packages/flutter/lib/src/material/scaffold.dart +++ b/packages/flutter/lib/src/material/scaffold.dart @@ -2908,7 +2908,7 @@ class ScaffoldState extends State with TickerProviderStateMixin { assert(debugCheckHasDirectionality(context)); final MediaQueryData mediaQuery = MediaQuery.of(context); final ThemeData themeData = Theme.of(context)!; - final TextDirection textDirection = Directionality.of(context)!; + final TextDirection textDirection = Directionality.of(context); // TODO(Piinks): Remove old SnackBar API after migrating ScaffoldMessenger _accessibleNavigation = mediaQuery.accessibleNavigation; diff --git a/packages/flutter/lib/src/material/scrollbar.dart b/packages/flutter/lib/src/material/scrollbar.dart index 3d446a89948..ca6bdf1f5f9 100644 --- a/packages/flutter/lib/src/material/scrollbar.dart +++ b/packages/flutter/lib/src/material/scrollbar.dart @@ -122,7 +122,7 @@ class _ScrollbarState extends State with SingleTickerProviderStateMix case TargetPlatform.linux: case TargetPlatform.windows: _themeColor = theme.highlightColor.withOpacity(1.0); - _textDirection = Directionality.of(context)!; + _textDirection = Directionality.of(context); _materialPainter = _buildMaterialScrollbarPainter(); _useCupertinoScrollbar = false; _triggerScrollbar(); diff --git a/packages/flutter/lib/src/material/slider.dart b/packages/flutter/lib/src/material/slider.dart index b00a17b4fb3..a13710dfbf2 100644 --- a/packages/flutter/lib/src/material/slider.dart +++ b/packages/flutter/lib/src/material/slider.dart @@ -550,7 +550,7 @@ class _SliderState extends State with TickerProviderStateMixin { void _actionHandler(_AdjustSliderIntent intent) { final _RenderSlider renderSlider = _renderObjectKey.currentContext!.findRenderObject()! as _RenderSlider; - final TextDirection textDirection = Directionality.of(_renderObjectKey.currentContext!)!; + final TextDirection textDirection = Directionality.of(_renderObjectKey.currentContext!); switch (intent.type) { case _SliderAdjustmentType.right: switch (textDirection) { @@ -825,7 +825,7 @@ class _SliderRenderObjectWidget extends LeafRenderObjectWidget { onChangeStart: onChangeStart, onChangeEnd: onChangeEnd, state: state, - textDirection: Directionality.of(context)!, + textDirection: Directionality.of(context), semanticFormatterCallback: semanticFormatterCallback, platform: Theme.of(context)!.platform, hasFocus: hasFocus, @@ -847,7 +847,7 @@ class _SliderRenderObjectWidget extends LeafRenderObjectWidget { ..onChanged = onChanged ..onChangeStart = onChangeStart ..onChangeEnd = onChangeEnd - ..textDirection = Directionality.of(context)! + ..textDirection = Directionality.of(context) ..semanticFormatterCallback = semanticFormatterCallback ..platform = Theme.of(context)!.platform ..hasFocus = hasFocus diff --git a/packages/flutter/lib/src/material/switch.dart b/packages/flutter/lib/src/material/switch.dart index a3304810a4f..06a76326b8d 100644 --- a/packages/flutter/lib/src/material/switch.dart +++ b/packages/flutter/lib/src/material/switch.dart @@ -476,7 +476,7 @@ class _SwitchRenderObjectWidget extends LeafRenderObjectWidget { inactiveTrackColor: inactiveTrackColor, configuration: configuration, onChanged: onChanged != null ? _handleValueChanged : null, - textDirection: Directionality.of(context)!, + textDirection: Directionality.of(context), additionalConstraints: additionalConstraints, hasFocus: hasFocus, hovering: hovering, @@ -501,7 +501,7 @@ class _SwitchRenderObjectWidget extends LeafRenderObjectWidget { ..inactiveTrackColor = inactiveTrackColor ..configuration = configuration ..onChanged = onChanged != null ? _handleValueChanged : null - ..textDirection = Directionality.of(context)! + ..textDirection = Directionality.of(context) ..additionalConstraints = additionalConstraints ..dragStartBehavior = dragStartBehavior ..hasFocus = hasFocus diff --git a/packages/flutter/lib/src/material/tabs.dart b/packages/flutter/lib/src/material/tabs.dart index 9e05045c4d3..4937a536882 100644 --- a/packages/flutter/lib/src/material/tabs.dart +++ b/packages/flutter/lib/src/material/tabs.dart @@ -918,7 +918,7 @@ class _TabBarState extends State { if (!widget.isScrollable) return 0.0; double tabCenter = _indicatorPainter!.centerOf(index); - switch (Directionality.of(context)!) { + switch (Directionality.of(context)) { case TextDirection.rtl: tabCenter = _tabStripWidth - tabCenter; break; diff --git a/packages/flutter/lib/src/material/time_picker.dart b/packages/flutter/lib/src/material/time_picker.dart index ef85ab77a65..abbe3568309 100644 --- a/packages/flutter/lib/src/material/time_picker.dart +++ b/packages/flutter/lib/src/material/time_picker.dart @@ -1266,7 +1266,7 @@ class _DialState extends State<_Dial> with SingleTickerProviderStateMixin { accentColor: accentColor, dotColor: theme.colorScheme.surface, theta: _theta.value, - textDirection: Directionality.of(context)!, + textDirection: Directionality.of(context), ), ), ); @@ -2210,5 +2210,5 @@ Future showTimePicker({ } void _announceToAccessibility(BuildContext context, String message) { - SemanticsService.announce(message, Directionality.of(context)!); + SemanticsService.announce(message, Directionality.of(context)); } diff --git a/packages/flutter/lib/src/material/toggle_buttons.dart b/packages/flutter/lib/src/material/toggle_buttons.dart index c0884e4eca8..d21d631fd9b 100644 --- a/packages/flutter/lib/src/material/toggle_buttons.dart +++ b/packages/flutter/lib/src/material/toggle_buttons.dart @@ -577,7 +577,7 @@ class ToggleButtons extends StatelessWidget { ); final ThemeData theme = Theme.of(context)!; final ToggleButtonsThemeData toggleButtonsTheme = ToggleButtonsTheme.of(context); - final TextDirection textDirection = Directionality.of(context)!; + final TextDirection textDirection = Directionality.of(context); return IntrinsicHeight( child: Row( @@ -901,7 +901,7 @@ class _SelectToggleButton extends SingleChildRenderObjectWidget { borderRadius, isFirstButton, isLastButton, - Directionality.of(context)!, + Directionality.of(context), ); @override @@ -913,7 +913,7 @@ class _SelectToggleButton extends SingleChildRenderObjectWidget { ..borderRadius = borderRadius ..isFirstButton = isFirstButton ..isLastButton = isLastButton - ..textDirection = Directionality.of(context)!; + ..textDirection = Directionality.of(context); } } diff --git a/packages/flutter/lib/src/material/tooltip.dart b/packages/flutter/lib/src/material/tooltip.dart index 2ef31605972..955c2e997d7 100644 --- a/packages/flutter/lib/src/material/tooltip.dart +++ b/packages/flutter/lib/src/material/tooltip.dart @@ -332,7 +332,7 @@ class _TooltipState extends State with SingleTickerProviderStateMixin { // updated values from happening to leak into the overlay when the overlay // rebuilds. final Widget overlay = Directionality( - textDirection: Directionality.of(context)!, + textDirection: Directionality.of(context), child: _TooltipOverlay( message: widget.message, height: height, diff --git a/packages/flutter/lib/src/material/user_accounts_drawer_header.dart b/packages/flutter/lib/src/material/user_accounts_drawer_header.dart index ed74e0a3772..7b932a0adea 100644 --- a/packages/flutter/lib/src/material/user_accounts_drawer_header.dart +++ b/packages/flutter/lib/src/material/user_accounts_drawer_header.dart @@ -138,7 +138,7 @@ class _AccountDetailsState extends State<_AccountDetails> with SingleTickerProvi Widget accountDetails = CustomMultiChildLayout( delegate: _AccountDetailsLayout( - textDirection: Directionality.of(context)!, + textDirection: Directionality.of(context), ), children: [ if (widget.accountName != null) diff --git a/packages/flutter/lib/src/widgets/banner.dart b/packages/flutter/lib/src/widgets/banner.dart index 9a261c015b3..ae52573f00a 100644 --- a/packages/flutter/lib/src/widgets/banner.dart +++ b/packages/flutter/lib/src/widgets/banner.dart @@ -304,9 +304,9 @@ class Banner extends StatelessWidget { return CustomPaint( foregroundPainter: BannerPainter( message: message, - textDirection: textDirection ?? Directionality.of(context)!, + textDirection: textDirection ?? Directionality.of(context), location: location, - layoutDirection: layoutDirection ?? Directionality.of(context)!, + layoutDirection: layoutDirection ?? Directionality.of(context), color: color, textStyle: textStyle, ), diff --git a/packages/flutter/lib/src/widgets/basic.dart b/packages/flutter/lib/src/widgets/basic.dart index 24cd2553941..3c770863f19 100644 --- a/packages/flutter/lib/src/widgets/basic.dart +++ b/packages/flutter/lib/src/widgets/basic.dart @@ -100,17 +100,23 @@ class Directionality extends InheritedWidget { /// the given context. /// /// If there is no [Directionality] ancestor widget in the tree at the given - /// context, then this will return null. + /// context, then this will throw a descriptive [FlutterError] in debug mode + /// and an exception in release mode. /// /// Typical usage is as follows: /// /// ```dart /// TextDirection textDirection = Directionality.of(context); /// ``` - // TODO(goderbauer): Make this non-null when customers have upgraded to Directionality.maybeOf. - static TextDirection? of(BuildContext context) { - final Directionality? widget = context.dependOnInheritedWidgetOfExactType(); - return widget?.textDirection; + /// + /// See also: + /// + /// * [maybeOf], which will return null if no [Directionality] ancestor + /// widget is in the tree. + static TextDirection of(BuildContext context) { + assert(debugCheckHasDirectionality(context)); + final Directionality widget = context.dependOnInheritedWidgetOfExactType()!; + return widget.textDirection; } /// The text direction from the closest instance of this class that encloses @@ -124,6 +130,11 @@ class Directionality extends InheritedWidget { /// ```dart /// TextDirection? textDirection = Directionality.maybeOf(context); /// ``` + /// + /// See also: + /// + /// * [of], which will throw if no [Directionality] ancestor widget is in the + /// tree. static TextDirection? maybeOf(BuildContext context) { final Directionality? widget = context.dependOnInheritedWidgetOfExactType(); return widget?.textDirection; @@ -3135,7 +3146,7 @@ AxisDirection getAxisDirectionFromAxisReverseAndDirectionality( switch (axis) { case Axis.horizontal: assert(debugCheckHasDirectionality(context)); - final TextDirection textDirection = Directionality.of(context)!; + final TextDirection textDirection = Directionality.of(context); final AxisDirection axisDirection = textDirectionToAxisDirection(textDirection); return reverse ? flipAxisDirection(axisDirection) : axisDirection; case Axis.vertical: @@ -3866,7 +3877,7 @@ class PositionedDirectional extends StatelessWidget { @override Widget build(BuildContext context) { return Positioned.directional( - textDirection: Directionality.of(context)!, + textDirection: Directionality.of(context), start: start, top: top, end: end, @@ -5376,7 +5387,7 @@ class RichText extends MultiChildRenderObjectWidget { assert(textDirection != null || debugCheckHasDirectionality(context)); return RenderParagraph(text, textAlign: textAlign, - textDirection: textDirection ?? Directionality.of(context)!, + textDirection: textDirection ?? Directionality.of(context), softWrap: softWrap, overflow: overflow, textScaleFactor: textScaleFactor, @@ -5394,7 +5405,7 @@ class RichText extends MultiChildRenderObjectWidget { renderObject ..text = text ..textAlign = textAlign - ..textDirection = textDirection ?? Directionality.of(context)! + ..textDirection = textDirection ?? Directionality.of(context) ..softWrap = softWrap ..overflow = overflow ..textScaleFactor = textScaleFactor diff --git a/packages/flutter/lib/src/widgets/dismissible.dart b/packages/flutter/lib/src/widgets/dismissible.dart index b6c823f0cf2..92eec7f8f98 100644 --- a/packages/flutter/lib/src/widgets/dismissible.dart +++ b/packages/flutter/lib/src/widgets/dismissible.dart @@ -274,7 +274,7 @@ class _DismissibleState extends State with TickerProviderStateMixin if (extent == 0.0) return null; if (_directionIsXAxis) { - switch (Directionality.of(context)!) { + switch (Directionality.of(context)) { case TextDirection.rtl: return extent < 0 ? DismissDirection.startToEnd : DismissDirection.endToStart; case TextDirection.ltr: @@ -332,7 +332,7 @@ class _DismissibleState extends State with TickerProviderStateMixin break; case DismissDirection.endToStart: - switch (Directionality.of(context)!) { + switch (Directionality.of(context)) { case TextDirection.rtl: if (_dragExtent + delta > 0) _dragExtent += delta; @@ -345,7 +345,7 @@ class _DismissibleState extends State with TickerProviderStateMixin break; case DismissDirection.startToEnd: - switch (Directionality.of(context)!) { + switch (Directionality.of(context)) { case TextDirection.rtl: if (_dragExtent + delta < 0) _dragExtent += delta; diff --git a/packages/flutter/lib/src/widgets/editable_text.dart b/packages/flutter/lib/src/widgets/editable_text.dart index fb66d156abc..0d360644b85 100644 --- a/packages/flutter/lib/src/widgets/editable_text.dart +++ b/packages/flutter/lib/src/widgets/editable_text.dart @@ -2429,9 +2429,9 @@ class EditableTextState extends State with AutomaticKeepAliveClien } TextDirection get _textDirection { - final TextDirection? result = widget.textDirection ?? Directionality.of(context); + final TextDirection result = widget.textDirection ?? Directionality.of(context); assert(result != null, '$runtimeType created without a textDirection and with no ambient Directionality.'); - return result!; + return result; } /// The renderer for this widget's descendant. diff --git a/packages/flutter/lib/src/widgets/icon.dart b/packages/flutter/lib/src/widgets/icon.dart index 38beeaf5e79..b0728a3f7e2 100644 --- a/packages/flutter/lib/src/widgets/icon.dart +++ b/packages/flutter/lib/src/widgets/icon.dart @@ -152,7 +152,7 @@ class Icon extends StatelessWidget { @override Widget build(BuildContext context) { assert(this.textDirection != null || debugCheckHasDirectionality(context)); - final TextDirection textDirection = this.textDirection ?? Directionality.of(context)!; + final TextDirection textDirection = this.textDirection ?? Directionality.of(context); final IconThemeData iconTheme = IconTheme.of(context); diff --git a/packages/flutter/lib/src/widgets/implicit_animations.dart b/packages/flutter/lib/src/widgets/implicit_animations.dart index b5e1042b4ff..3292a33f420 100644 --- a/packages/flutter/lib/src/widgets/implicit_animations.dart +++ b/packages/flutter/lib/src/widgets/implicit_animations.dart @@ -1307,7 +1307,7 @@ class _AnimatedPositionedDirectionalState extends AnimatedWidgetBaseState { switch (widget.scrollDirection) { case Axis.horizontal: assert(debugCheckHasDirectionality(context)); - final TextDirection textDirection = Directionality.of(context)!; + final TextDirection textDirection = Directionality.of(context); final AxisDirection axisDirection = textDirectionToAxisDirection(textDirection); return widget.reverse ? flipAxisDirection(axisDirection) : axisDirection; case Axis.vertical: diff --git a/packages/flutter/lib/src/widgets/platform_view.dart b/packages/flutter/lib/src/widgets/platform_view.dart index b08883e7ce5..c59fed0c3f8 100644 --- a/packages/flutter/lib/src/widgets/platform_view.dart +++ b/packages/flutter/lib/src/widgets/platform_view.dart @@ -491,7 +491,7 @@ class _AndroidViewState extends State { TextDirection _findLayoutDirection() { assert(widget.layoutDirection != null || debugCheckHasDirectionality(context)); - return widget.layoutDirection ?? Directionality.of(context)!; + return widget.layoutDirection ?? Directionality.of(context); } @override @@ -616,7 +616,7 @@ class _UiKitViewState extends State { TextDirection _findLayoutDirection() { assert(widget.layoutDirection != null || debugCheckHasDirectionality(context)); - return widget.layoutDirection ?? Directionality.of(context)!; + return widget.layoutDirection ?? Directionality.of(context); } @override diff --git a/packages/flutter/lib/src/widgets/table.dart b/packages/flutter/lib/src/widgets/table.dart index 347c34a2398..4ac5363f914 100644 --- a/packages/flutter/lib/src/widgets/table.dart +++ b/packages/flutter/lib/src/widgets/table.dart @@ -249,7 +249,7 @@ class Table extends RenderObjectWidget { rows: children.length, columnWidths: columnWidths, defaultColumnWidth: defaultColumnWidth, - textDirection: textDirection ?? Directionality.of(context)!, + textDirection: textDirection ?? Directionality.of(context), border: border, rowDecorations: _rowDecorations, configuration: createLocalImageConfiguration(context), @@ -266,7 +266,7 @@ class Table extends RenderObjectWidget { renderObject ..columnWidths = columnWidths ..defaultColumnWidth = defaultColumnWidth - ..textDirection = textDirection ?? Directionality.of(context)! + ..textDirection = textDirection ?? Directionality.of(context) ..border = border ..rowDecorations = _rowDecorations ..configuration = createLocalImageConfiguration(context) diff --git a/packages/flutter/lib/src/widgets/viewport.dart b/packages/flutter/lib/src/widgets/viewport.dart index 34aab5f23a5..c2b826814f7 100644 --- a/packages/flutter/lib/src/widgets/viewport.dart +++ b/packages/flutter/lib/src/widgets/viewport.dart @@ -147,7 +147,7 @@ class Viewport extends MultiChildRenderObjectWidget { why: 'to determine the cross-axis direction when the viewport has an \'up\' axisDirection', alternative: 'Alternatively, consider specifying the \'crossAxisDirection\' argument on the Viewport.', )); - return textDirectionToAxisDirection(Directionality.of(context)!); + return textDirectionToAxisDirection(Directionality.of(context)); case AxisDirection.right: return AxisDirection.down; case AxisDirection.down: @@ -156,7 +156,7 @@ class Viewport extends MultiChildRenderObjectWidget { why: 'to determine the cross-axis direction when the viewport has a \'down\' axisDirection', alternative: 'Alternatively, consider specifying the \'crossAxisDirection\' argument on the Viewport.', )); - return textDirectionToAxisDirection(Directionality.of(context)!); + return textDirectionToAxisDirection(Directionality.of(context)); case AxisDirection.left: return AxisDirection.down; } diff --git a/packages/flutter/test/widgets/directionality_test.dart b/packages/flutter/test/widgets/directionality_test.dart index 01fc85353c2..3cf3630d138 100644 --- a/packages/flutter/test/widgets/directionality_test.dart +++ b/packages/flutter/test/widgets/directionality_test.dart @@ -10,7 +10,7 @@ void main() { final List log = []; final Widget inner = Builder( builder: (BuildContext context) { - log.add(Directionality.of(context)!); + log.add(Directionality.of(context)); return const Placeholder(); } ); @@ -80,4 +80,26 @@ void main() { expect(Directionality.maybeOf(noDirectionality.currentContext!), isNull); expect(Directionality.maybeOf(hasDirectionality.currentContext!), TextDirection.rtl); }); + + testWidgets('Directionality.of', (WidgetTester tester) async { + final GlobalKey hasDirectionality = GlobalKey(); + final GlobalKey noDirectionality = GlobalKey(); + await tester.pumpWidget( + Container( + key: noDirectionality, + child: Directionality( + textDirection: TextDirection.rtl, + child: Container( + key: hasDirectionality, + ), + ), + ), + ); + expect(() => Directionality.of(noDirectionality.currentContext!), throwsA(isAssertionError.having( + (AssertionError e) => e.message, + 'message', + contains('No Directionality widget found.'), + ))); + expect(Directionality.of(hasDirectionality.currentContext!), TextDirection.rtl); + }); }