migrate some cupertino files to nullsafety (#66024)
* migrate some cupertino files to nullsafety
* address review comments
* address review comments
diff --git a/packages/flutter/lib/src/cupertino/activity_indicator.dart b/packages/flutter/lib/src/cupertino/activity_indicator.dart
index 5472bfb..e55193d 100644
--- a/packages/flutter/lib/src/cupertino/activity_indicator.dart
+++ b/packages/flutter/lib/src/cupertino/activity_indicator.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// @dart = 2.8
-
import 'dart:math' as math;
import 'package:flutter/widgets.dart';
@@ -28,7 +26,7 @@
class CupertinoActivityIndicator extends StatefulWidget {
/// Creates an iOS-style activity indicator that spins clockwise.
const CupertinoActivityIndicator({
- Key key,
+ Key? key,
this.animating = true,
this.radius = _kDefaultIndicatorRadius,
}) : assert(animating != null),
@@ -44,7 +42,7 @@
/// will be shown) and 1.0 (all ticks will be shown) inclusive. Defaults
/// to 1.0.
const CupertinoActivityIndicator.partiallyRevealed({
- Key key,
+ Key? key,
this.radius = _kDefaultIndicatorRadius,
this.progress = 1.0,
}) : assert(radius != null),
@@ -80,7 +78,7 @@
class _CupertinoActivityIndicatorState extends State<CupertinoActivityIndicator>
with SingleTickerProviderStateMixin {
- AnimationController _controller;
+ late AnimationController _controller;
@override
void initState() {
@@ -121,7 +119,7 @@
painter: _CupertinoActivityIndicatorPainter(
position: _controller,
activeColor:
- CupertinoDynamicColor.resolve(_kActiveTickColor, context),
+ CupertinoDynamicColor.resolve(_kActiveTickColor, context)!,
radius: widget.radius,
progress: widget.progress,
),
@@ -150,10 +148,10 @@
class _CupertinoActivityIndicatorPainter extends CustomPainter {
_CupertinoActivityIndicatorPainter({
- @required this.position,
- @required this.activeColor,
- @required this.radius,
- @required this.progress,
+ required this.position,
+ required this.activeColor,
+ required this.radius,
+ required this.progress,
}) : tickFundamentalRRect = RRect.fromLTRBXY(
-radius / _kDefaultIndicatorRadius,
-radius / 3.0,
diff --git a/packages/flutter/lib/src/cupertino/button.dart b/packages/flutter/lib/src/cupertino/button.dart
index 7eda646..0c497f6 100644
--- a/packages/flutter/lib/src/cupertino/button.dart
+++ b/packages/flutter/lib/src/cupertino/button.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// @dart = 2.8
-
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
@@ -34,15 +32,15 @@
class CupertinoButton extends StatefulWidget {
/// Creates an iOS-style button.
const CupertinoButton({
- Key key,
- @required this.child,
+ Key? key,
+ required this.child,
this.padding,
this.color,
this.disabledColor = CupertinoColors.quaternarySystemFill,
this.minSize = kMinInteractiveDimensionCupertino,
this.pressedOpacity = 0.4,
this.borderRadius = const BorderRadius.all(Radius.circular(8.0)),
- @required this.onPressed,
+ required this.onPressed,
}) : assert(pressedOpacity == null || (pressedOpacity >= 0.0 && pressedOpacity <= 1.0)),
assert(disabledColor != null),
_filled = false,
@@ -55,14 +53,14 @@
/// To specify a custom background color, use the [color] argument of the
/// default constructor.
const CupertinoButton.filled({
- Key key,
- @required this.child,
+ Key? key,
+ required this.child,
this.padding,
this.disabledColor = CupertinoColors.quaternarySystemFill,
this.minSize = kMinInteractiveDimensionCupertino,
this.pressedOpacity = 0.4,
this.borderRadius = const BorderRadius.all(Radius.circular(8.0)),
- @required this.onPressed,
+ required this.onPressed,
}) : assert(pressedOpacity == null || (pressedOpacity >= 0.0 && pressedOpacity <= 1.0)),
assert(disabledColor != null),
color = null,
@@ -77,7 +75,7 @@
/// The amount of space to surround the child inside the bounds of the button.
///
/// Defaults to 16.0 pixels.
- final EdgeInsetsGeometry padding;
+ final EdgeInsetsGeometry? padding;
/// The color of the button's background.
///
@@ -85,7 +83,7 @@
///
/// Defaults to the [CupertinoTheme]'s `primaryColor` when the
/// [CupertinoButton.filled] constructor is used.
- final Color color;
+ final Color? color;
/// The color of the button's background when the button is disabled.
///
@@ -98,25 +96,25 @@
/// The callback that is called when the button is tapped or otherwise activated.
///
/// If this is set to null, the button will be disabled.
- final VoidCallback onPressed;
+ final VoidCallback? onPressed;
/// Minimum size of the button.
///
/// Defaults to kMinInteractiveDimensionCupertino which the iOS Human
/// Interface Guidelines recommends as the minimum tappable area.
- final double minSize;
+ final double? minSize;
/// The opacity that the button will fade to when it is pressed.
/// The button will have an opacity of 1.0 when it is not pressed.
///
/// This defaults to 0.4. If null, opacity will not change on pressed if using
/// your own custom effects is desired.
- final double pressedOpacity;
+ final double? pressedOpacity;
/// The radius of the button's corners when it has a background color.
///
/// Defaults to round corners of 8 logical pixels.
- final BorderRadius borderRadius;
+ final BorderRadius? borderRadius;
final bool _filled;
@@ -140,8 +138,8 @@
static const Duration kFadeInDuration = Duration(milliseconds: 100);
final Tween<double> _opacityTween = Tween<double>(begin: 1.0);
- AnimationController _animationController;
- Animation<double> _opacityAnimation;
+ late AnimationController _animationController;
+ late Animation<double> _opacityAnimation;
@override
void initState() {
@@ -170,7 +168,6 @@
@override
void dispose() {
_animationController.dispose();
- _animationController = null;
super.dispose();
}
@@ -214,12 +211,12 @@
Widget build(BuildContext context) {
final bool enabled = widget.enabled;
final CupertinoThemeData themeData = CupertinoTheme.of(context);
- final Color primaryColor = themeData.primaryColor;
- final Color backgroundColor = widget.color == null
+ final Color? primaryColor = themeData.primaryColor;
+ final Color? backgroundColor = widget.color == null
? (widget._filled ? primaryColor : null)
: CupertinoDynamicColor.resolve(widget.color, context);
- final Color foregroundColor = backgroundColor != null
+ final Color? foregroundColor = backgroundColor != null
? themeData.primaryContrastingColor
: enabled
? primaryColor
@@ -239,9 +236,9 @@
constraints: widget.minSize == null
? const BoxConstraints()
: BoxConstraints(
- minWidth: widget.minSize,
- minHeight: widget.minSize,
- ),
+ minWidth: widget.minSize!,
+ minHeight: widget.minSize!,
+ ),
child: FadeTransition(
opacity: _opacityAnimation,
child: DecoratedBox(
diff --git a/packages/flutter/lib/src/cupertino/constants.dart b/packages/flutter/lib/src/cupertino/constants.dart
index 5fbbf04..2831c50 100644
--- a/packages/flutter/lib/src/cupertino/constants.dart
+++ b/packages/flutter/lib/src/cupertino/constants.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// @dart = 2.8
-
/// The minimum dimension of any interactive region according to the iOS Human
/// Interface Guidelines.
///
diff --git a/packages/flutter/lib/src/cupertino/icons.dart b/packages/flutter/lib/src/cupertino/icons.dart
index 59ffd11..e27f3e7 100644
--- a/packages/flutter/lib/src/cupertino/icons.dart
+++ b/packages/flutter/lib/src/cupertino/icons.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// @dart = 2.8
-
import 'package:flutter/widgets.dart';
/// Identifiers for the supported Cupertino icons.
diff --git a/packages/flutter/lib/src/cupertino/picker.dart b/packages/flutter/lib/src/cupertino/picker.dart
index 805a057..37bd495 100644
--- a/packages/flutter/lib/src/cupertino/picker.dart
+++ b/packages/flutter/lib/src/cupertino/picker.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// @dart = 2.8
-
import 'package:flutter/foundation.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
@@ -70,7 +68,7 @@
/// will loop the list back to the beginning. If set to false, the list will
/// stop scrolling when you reach the end or the beginning.
CupertinoPicker({
- Key key,
+ Key? key,
this.diameterRatio = _kDefaultDiameterRatio,
this.backgroundColor,
this.offAxisFraction = 0.0,
@@ -78,9 +76,9 @@
this.magnification = 1.0,
this.scrollController,
this.squeeze = _kSqueeze,
- @required this.itemExtent,
- @required this.onSelectedItemChanged,
- @required List<Widget> children,
+ required this.itemExtent,
+ required this.onSelectedItemChanged,
+ required List<Widget> children,
bool looping = false,
}) : assert(children != null),
assert(diameterRatio != null),
@@ -113,7 +111,7 @@
/// (i.e. the picker is going to have a completely transparent background), to match
/// the native UIPicker and UIDatePicker.
CupertinoPicker.builder({
- Key key,
+ Key? key,
this.diameterRatio = _kDefaultDiameterRatio,
this.backgroundColor,
this.offAxisFraction = 0.0,
@@ -121,10 +119,10 @@
this.magnification = 1.0,
this.scrollController,
this.squeeze = _kSqueeze,
- @required this.itemExtent,
- @required this.onSelectedItemChanged,
- @required IndexedWidgetBuilder itemBuilder,
- int childCount,
+ required this.itemExtent,
+ required this.onSelectedItemChanged,
+ required NullableIndexedWidgetBuilder itemBuilder,
+ int? childCount,
}) : assert(itemBuilder != null),
assert(diameterRatio != null),
assert(diameterRatio > 0.0, RenderListWheelViewport.diameterRatioZeroMessage),
@@ -153,7 +151,7 @@
///
/// Any alpha value less 255 (fully opaque) will cause the removal of the
/// wheel list edge fade gradient from rendering of the widget.
- final Color backgroundColor;
+ final Color? backgroundColor;
/// {@macro flutter.rendering.wheelList.offAxisFraction}
final double offAxisFraction;
@@ -168,7 +166,7 @@
/// to set the initial item.
///
/// If null, an implicit one will be created internally.
- final FixedExtentScrollController scrollController;
+ final FixedExtentScrollController? scrollController;
/// The uniform height of all children.
///
@@ -198,8 +196,8 @@
}
class _CupertinoPickerState extends State<CupertinoPicker> {
- int _lastHapticIndex;
- FixedExtentScrollController _controller;
+ int? _lastHapticIndex;
+ FixedExtentScrollController? _controller;
@override
void initState() {
@@ -255,7 +253,7 @@
/// Draws the magnifier borders.
Widget _buildMagnifierScreen() {
- final Color resolvedBorderColor = CupertinoDynamicColor.resolve(_kHighlighterBorder, context);
+ final Color resolvedBorderColor = CupertinoDynamicColor.resolve(_kHighlighterBorder, context)!;
return IgnorePointer(
child: Center(
@@ -276,7 +274,7 @@
@override
Widget build(BuildContext context) {
- final Color resolvedBackgroundColor = CupertinoDynamicColor.resolve(widget.backgroundColor, context);
+ final Color? resolvedBackgroundColor = CupertinoDynamicColor.resolve(widget.backgroundColor, context);
final Widget result = DefaultTextStyle(
style: CupertinoTheme.of(context).textTheme.pickerTextStyle,
@@ -284,7 +282,7 @@
children: <Widget>[
Positioned.fill(
child: _CupertinoPickerSemantics(
- scrollController: widget.scrollController ?? _controller,
+ scrollController: widget.scrollController ?? _controller!,
child: ListWheelScrollView.useDelegate(
controller: widget.scrollController ?? _controller,
physics: const FixedExtentScrollPhysics(),
@@ -321,38 +319,45 @@
// scroll controller.
class _CupertinoPickerSemantics extends SingleChildRenderObjectWidget {
const _CupertinoPickerSemantics({
- Key key,
- Widget child,
- @required this.scrollController,
+ Key? key,
+ Widget? child,
+ required this.scrollController,
}) : super(key: key, child: child);
final FixedExtentScrollController scrollController;
@override
- RenderObject createRenderObject(BuildContext context) => _RenderCupertinoPickerSemantics(scrollController, Directionality.of(context));
+ RenderObject createRenderObject(BuildContext context) {
+ assert(debugCheckHasDirectionality(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;
}
}
class _RenderCupertinoPickerSemantics extends RenderProxyBox {
_RenderCupertinoPickerSemantics(FixedExtentScrollController controller, this._textDirection) {
- this.controller = controller;
+ _updateController(null, controller);
}
FixedExtentScrollController get controller => _controller;
- FixedExtentScrollController _controller;
- set controller(FixedExtentScrollController value) {
- if (value == _controller)
+ late FixedExtentScrollController _controller;
+ set controller(FixedExtentScrollController value) => _updateController(_controller, value);
+
+ // This method exists to allow controller to be non-null. It is only called with a null oldValue from construtor.
+ void _updateController(FixedExtentScrollController? oldValue, FixedExtentScrollController value) {
+ if (value == oldValue)
return;
- if (_controller != null)
- _controller.removeListener(_handleScrollUpdate);
+ if (oldValue != null)
+ oldValue.removeListener(_handleScrollUpdate);
else
- _currentIndex = value.initialItem ?? 0;
+ _currentIndex = value.initialItem;
value.addListener(_handleScrollUpdate);
_controller = value;
}
@@ -399,15 +404,15 @@
final Map<int, SemanticsNode> indexedChildren = <int, SemanticsNode>{};
scrollable.visitChildren((SemanticsNode child) {
assert(child.indexInParent != null);
- indexedChildren[child.indexInParent] = child;
+ indexedChildren[child.indexInParent!] = child;
return true;
});
if (indexedChildren[_currentIndex] == null) {
return node.updateWith(config: config);
}
- config.value = indexedChildren[_currentIndex].label;
- final SemanticsNode previousChild = indexedChildren[_currentIndex - 1];
- final SemanticsNode nextChild = indexedChildren[_currentIndex + 1];
+ config.value = indexedChildren[_currentIndex]!.label;
+ final SemanticsNode? previousChild = indexedChildren[_currentIndex - 1];
+ final SemanticsNode? nextChild = indexedChildren[_currentIndex + 1];
if (nextChild != null) {
config.increasedValue = nextChild.label;
config.onIncrease = _handleIncrease;
diff --git a/packages/flutter/lib/src/cupertino/refresh.dart b/packages/flutter/lib/src/cupertino/refresh.dart
index 2b2300b..d4ba781 100644
--- a/packages/flutter/lib/src/cupertino/refresh.dart
+++ b/packages/flutter/lib/src/cupertino/refresh.dart
@@ -2,8 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// @dart = 2.8
-
+import 'dart:async';
import 'dart:math';
import 'package:flutter/rendering.dart';
@@ -18,10 +17,10 @@
class _CupertinoSliverRefresh extends SingleChildRenderObjectWidget {
const _CupertinoSliverRefresh({
- Key key,
+ Key? key,
this.refreshIndicatorLayoutExtent = 0.0,
this.hasLayoutExtent = false,
- Widget child,
+ Widget? child,
}) : assert(refreshIndicatorLayoutExtent != null),
assert(refreshIndicatorLayoutExtent >= 0.0),
assert(hasLayoutExtent != null),
@@ -61,9 +60,9 @@
class _RenderCupertinoSliverRefresh extends RenderSliver
with RenderObjectWithChildMixin<RenderBox> {
_RenderCupertinoSliverRefresh({
- @required double refreshIndicatorExtent,
- @required bool hasLayoutExtent,
- RenderBox child,
+ required double refreshIndicatorExtent,
+ required bool hasLayoutExtent,
+ RenderBox? child,
}) : assert(refreshIndicatorExtent != null),
assert(refreshIndicatorExtent >= 0.0),
assert(hasLayoutExtent != null),
@@ -135,7 +134,7 @@
// Layout the child giving it the space of the currently dragged overscroll
// which may or may not include a sliver layout extent space that it will
// keep after the user lets go during the refresh process.
- child.layout(
+ child!.layout(
constraints.asBoxConstraints(
maxExtent: layoutExtent
// Plus only the overscrolled portion immediately preceding this
@@ -153,11 +152,11 @@
// layoutExtent may be zero. Check layoutExtent also since even
// with a layoutExtent, the indicator builder may decide to not
// build anything.
- max(child.size.height, layoutExtent) - constraints.scrollOffset,
+ max(child!.size.height, layoutExtent) - constraints.scrollOffset,
0.0,
),
maxPaintExtent: max(
- max(child.size.height, layoutExtent) - constraints.scrollOffset,
+ max(child!.size.height, layoutExtent) - constraints.scrollOffset,
0.0,
),
layoutExtent: max(layoutExtent - constraints.scrollOffset, 0.0),
@@ -171,8 +170,8 @@
@override
void paint(PaintingContext paintContext, Offset offset) {
if (constraints.overlap < 0.0 ||
- constraints.scrollOffset + child.size.height > 0) {
- paintContext.paintChild(child, offset);
+ constraints.scrollOffset + child!.size.height > 0) {
+ paintContext.paintChild(child!, offset);
}
}
@@ -345,7 +344,7 @@
/// The [onRefresh] argument will be called when pulled far enough to trigger
/// a refresh.
const CupertinoSliverRefreshControl({
- Key key,
+ Key? key,
this.refreshTriggerPullDistance = _defaultRefreshTriggerPullDistance,
this.refreshIndicatorExtent = _defaultRefreshIndicatorExtent,
this.builder = buildRefreshIndicator,
@@ -389,7 +388,7 @@
///
/// Will not be called when the available space is zero such as before any
/// overscroll.
- final RefreshControlIndicatorBuilder builder;
+ final RefreshControlIndicatorBuilder? builder;
/// Callback invoked when pulled by [refreshTriggerPullDistance].
///
@@ -399,7 +398,7 @@
/// Can be null, in which case a single frame of [RefreshIndicatorMode.armed]
/// state will be drawn before going immediately to the [RefreshIndicatorMode.done]
/// where the sliver will start retracting.
- final RefreshCallback onRefresh;
+ final RefreshCallback? onRefresh;
static const double _defaultRefreshTriggerPullDistance = 100.0;
static const double _defaultRefreshIndicatorExtent = 60.0;
@@ -408,7 +407,7 @@
/// state that gets passed into the [builder] function. Used for testing.
@visibleForTesting
static RefreshIndicatorMode state(BuildContext context) {
- final _CupertinoSliverRefreshControlState state = context.findAncestorStateOfType<_CupertinoSliverRefreshControlState>();
+ final _CupertinoSliverRefreshControlState state = context.findAncestorStateOfType<_CupertinoSliverRefreshControlState>()!;
return state.refreshState;
}
@@ -483,9 +482,9 @@
// original `refreshTriggerPullDistance` is left.
static const double _inactiveResetOverscrollFraction = 0.1;
- RefreshIndicatorMode refreshState;
+ late RefreshIndicatorMode refreshState;
// [Future] returned by the widget's `onRefresh`.
- Future<void> refreshTask;
+ Future<void>? refreshTask;
// The amount of space available from the inner indicator box's perspective.
//
// The value is the sum of the sliver's layout extent and the overscroll
@@ -512,10 +511,10 @@
nextState = RefreshIndicatorMode.done;
// Either schedule the RenderSliver to re-layout on the next frame
// when not currently in a frame or schedule it on the next frame.
- if (SchedulerBinding.instance.schedulerPhase == SchedulerPhase.idle) {
+ if (SchedulerBinding.instance!.schedulerPhase == SchedulerPhase.idle) {
setState(() => hasSliverLayoutExtent = false);
} else {
- SchedulerBinding.instance.addPostFrameCallback((Duration timestamp) {
+ SchedulerBinding.instance!.addPostFrameCallback((Duration timestamp) {
setState(() => hasSliverLayoutExtent = false);
});
}
@@ -541,8 +540,8 @@
// Call onRefresh after this frame finished since the function is
// user supplied and we're always here in the middle of the sliver's
// performLayout.
- SchedulerBinding.instance.addPostFrameCallback((Duration timestamp) {
- refreshTask = widget.onRefresh()..whenComplete(() {
+ SchedulerBinding.instance!.addPostFrameCallback((Duration timestamp) {
+ refreshTask = widget.onRefresh!()..whenComplete(() {
if (mounted) {
setState(() => refreshTask = null);
// Trigger one more transition because by this time, BoxConstraint's
@@ -557,9 +556,6 @@
}
return RefreshIndicatorMode.armed;
}
- // Don't continue here. We can never possibly call onRefresh and
- // progress to the next state in one [computeNextState] call.
- break;
case RefreshIndicatorMode.armed:
if (refreshState == RefreshIndicatorMode.armed && refreshTask == null) {
goToDone();
@@ -610,7 +606,7 @@
latestIndicatorBoxExtent = constraints.maxHeight;
refreshState = transitionNextState();
if (widget.builder != null && latestIndicatorBoxExtent > 0) {
- return widget.builder(
+ return widget.builder!(
context,
refreshState,
latestIndicatorBoxExtent,
diff --git a/packages/flutter/lib/src/cupertino/slider.dart b/packages/flutter/lib/src/cupertino/slider.dart
index e5fe72f..cfde1ab 100644
--- a/packages/flutter/lib/src/cupertino/slider.dart
+++ b/packages/flutter/lib/src/cupertino/slider.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// @dart = 2.8
-
import 'dart:math' as math;
import 'dart:ui' show lerpDouble;
@@ -55,9 +53,9 @@
/// * [onChangeEnd] is called when the user is done selecting a new value for
/// the slider.
const CupertinoSlider({
- Key key,
- @required this.value,
- @required this.onChanged,
+ Key? key,
+ required this.value,
+ required this.onChanged,
this.onChangeStart,
this.onChangeEnd,
this.min = 0.0,
@@ -110,7 +108,7 @@
/// changing the value.
/// * [onChangeEnd] for a callback that is called when the user stops
/// changing the value.
- final ValueChanged<double> onChanged;
+ final ValueChanged<double>? onChanged;
/// Called when the user starts selecting a new value for the slider.
///
@@ -145,7 +143,7 @@
///
/// * [onChangeEnd] for a callback that is called when the value change is
/// complete.
- final ValueChanged<double> onChangeStart;
+ final ValueChanged<double>? onChangeStart;
/// Called when the user is done selecting a new value for the slider.
///
@@ -177,7 +175,7 @@
///
/// * [onChangeStart] for a callback that is called when a value change
/// begins.
- final ValueChanged<double> onChangeEnd;
+ final ValueChanged<double>? onChangeEnd;
/// The minimum value the user can select.
///
@@ -192,12 +190,12 @@
/// The number of discrete divisions.
///
/// If null, the slider is continuous.
- final int divisions;
+ final int? divisions;
/// The color to use for the portion of the slider that has been selected.
///
/// Defaults to the [CupertinoTheme]'s primary color if null.
- final Color activeColor;
+ final Color? activeColor;
/// The color to use for the thumb of the slider.
///
@@ -221,20 +219,20 @@
class _CupertinoSliderState extends State<CupertinoSlider> with TickerProviderStateMixin {
void _handleChanged(double value) {
assert(widget.onChanged != null);
- final double lerpValue = lerpDouble(widget.min, widget.max, value);
+ final double lerpValue = lerpDouble(widget.min, widget.max, value)!;
if (lerpValue != widget.value) {
- widget.onChanged(lerpValue);
+ widget.onChanged!(lerpValue);
}
}
void _handleDragStart(double value) {
assert(widget.onChangeStart != null);
- widget.onChangeStart(lerpDouble(widget.min, widget.max, value));
+ widget.onChangeStart!(lerpDouble(widget.min, widget.max, value)!);
}
void _handleDragEnd(double value) {
assert(widget.onChangeEnd != null);
- widget.onChangeEnd(lerpDouble(widget.min, widget.max, value));
+ widget.onChangeEnd!(lerpDouble(widget.min, widget.max, value)!);
}
@override
@@ -245,7 +243,7 @@
activeColor: CupertinoDynamicColor.resolve(
widget.activeColor ?? CupertinoTheme.of(context).primaryColor,
context,
- ),
+ )!,
thumbColor: widget.thumbColor,
onChanged: widget.onChanged != null ? _handleChanged : null,
onChangeStart: widget.onChangeStart != null ? _handleDragStart : null,
@@ -257,54 +255,56 @@
class _CupertinoSliderRenderObjectWidget extends LeafRenderObjectWidget {
const _CupertinoSliderRenderObjectWidget({
- Key key,
- this.value,
+ Key? key,
+ required this.value,
this.divisions,
- this.activeColor,
- this.thumbColor,
+ required this.activeColor,
+ required this.thumbColor,
this.onChanged,
this.onChangeStart,
this.onChangeEnd,
- this.vsync,
+ required this.vsync,
}) : super(key: key);
final double value;
- final int divisions;
+ final int? divisions;
final Color activeColor;
final Color thumbColor;
- final ValueChanged<double> onChanged;
- final ValueChanged<double> onChangeStart;
- final ValueChanged<double> onChangeEnd;
+ final ValueChanged<double>? onChanged;
+ final ValueChanged<double>? onChangeStart;
+ final ValueChanged<double>? onChangeEnd;
final TickerProvider vsync;
@override
_RenderCupertinoSlider createRenderObject(BuildContext context) {
+ assert(debugCheckHasDirectionality(context));
return _RenderCupertinoSlider(
value: value,
divisions: divisions,
activeColor: activeColor,
- thumbColor: CupertinoDynamicColor.resolve(thumbColor, context),
- trackColor: CupertinoDynamicColor.resolve(CupertinoColors.systemFill, context),
+ thumbColor: CupertinoDynamicColor.resolve(thumbColor, context)!,
+ trackColor: CupertinoDynamicColor.resolve(CupertinoColors.systemFill, context)!,
onChanged: onChanged,
onChangeStart: onChangeStart,
onChangeEnd: onChangeEnd,
vsync: vsync,
- textDirection: Directionality.of(context),
+ textDirection: Directionality.of(context)!,
);
}
@override
void updateRenderObject(BuildContext context, _RenderCupertinoSlider renderObject) {
+ assert(debugCheckHasDirectionality(context));
renderObject
..value = value
..divisions = divisions
..activeColor = activeColor
- ..thumbColor = CupertinoDynamicColor.resolve(thumbColor, context)
- ..trackColor = CupertinoDynamicColor.resolve(CupertinoColors.systemFill, context)
+ ..thumbColor = CupertinoDynamicColor.resolve(thumbColor, context)!
+ ..trackColor = CupertinoDynamicColor.resolve(CupertinoColors.systemFill, context)!
..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.
}
@@ -319,16 +319,16 @@
class _RenderCupertinoSlider extends RenderConstrainedBox {
_RenderCupertinoSlider({
- @required double value,
- int divisions,
- Color activeColor,
- Color thumbColor,
- Color trackColor,
- ValueChanged<double> onChanged,
+ required double value,
+ int? divisions,
+ required Color activeColor,
+ required Color thumbColor,
+ required Color trackColor,
+ ValueChanged<double>? onChanged,
this.onChangeStart,
this.onChangeEnd,
- TickerProvider vsync,
- @required TextDirection textDirection,
+ required TickerProvider vsync,
+ required TextDirection textDirection,
}) : assert(value != null && value >= 0.0 && value <= 1.0),
assert(textDirection != null),
_value = value,
@@ -364,9 +364,9 @@
markNeedsSemanticsUpdate();
}
- int get divisions => _divisions;
- int _divisions;
- set divisions(int value) {
+ int? get divisions => _divisions;
+ int? _divisions;
+ set divisions(int? value) {
if (value == _divisions)
return;
_divisions = value;
@@ -400,9 +400,9 @@
markNeedsPaint();
}
- ValueChanged<double> get onChanged => _onChanged;
- ValueChanged<double> _onChanged;
- set onChanged(ValueChanged<double> value) {
+ ValueChanged<double>? get onChanged => _onChanged;
+ ValueChanged<double>? _onChanged;
+ set onChanged(ValueChanged<double>? value) {
if (value == _onChanged)
return;
final bool wasInteractive = isInteractive;
@@ -411,8 +411,8 @@
markNeedsSemanticsUpdate();
}
- ValueChanged<double> onChangeStart;
- ValueChanged<double> onChangeEnd;
+ ValueChanged<double>? onChangeStart;
+ ValueChanged<double>? onChangeEnd;
TextDirection get textDirection => _textDirection;
TextDirection _textDirection;
@@ -424,15 +424,15 @@
markNeedsPaint();
}
- AnimationController _position;
+ late AnimationController _position;
- HorizontalDragGestureRecognizer _drag;
+ late HorizontalDragGestureRecognizer _drag;
double _currentDragValue = 0.0;
double get _discretizedCurrentDragValue {
- double dragValue = _currentDragValue.clamp(0.0, 1.0) as double;
+ double dragValue = _currentDragValue.clamp(0.0, 1.0);
if (divisions != null)
- dragValue = (dragValue * divisions).round() / divisions;
+ dragValue = (dragValue * divisions!).round() / divisions!;
return dragValue;
}
@@ -448,7 +448,7 @@
visualPosition = _value;
break;
}
- return lerpDouble(_trackLeft + CupertinoThumbPainter.radius, _trackRight - CupertinoThumbPainter.radius, visualPosition);
+ return lerpDouble(_trackLeft + CupertinoThumbPainter.radius, _trackRight - CupertinoThumbPainter.radius, visualPosition)!;
}
bool get isInteractive => onChanged != null;
@@ -458,7 +458,7 @@
void _handleDragUpdate(DragUpdateDetails details) {
if (isInteractive) {
final double extent = math.max(_kPadding, size.width - 2.0 * (_kPadding + CupertinoThumbPainter.radius));
- final double valueDelta = details.primaryDelta / extent;
+ final double valueDelta = details.primaryDelta! / extent;
switch (textDirection) {
case TextDirection.rtl:
_currentDragValue -= valueDelta;
@@ -467,7 +467,7 @@
_currentDragValue += valueDelta;
break;
}
- onChanged(_discretizedCurrentDragValue);
+ onChanged!(_discretizedCurrentDragValue);
}
}
@@ -476,16 +476,16 @@
void _startInteraction(Offset globalPosition) {
if (isInteractive) {
if (onChangeStart != null) {
- onChangeStart(_discretizedCurrentDragValue);
+ onChangeStart!(_discretizedCurrentDragValue);
}
_currentDragValue = _value;
- onChanged(_discretizedCurrentDragValue);
+ onChanged!(_discretizedCurrentDragValue);
}
}
void _endInteraction() {
if (onChangeEnd != null) {
- onChangeEnd(_discretizedCurrentDragValue);
+ onChangeEnd!(_discretizedCurrentDragValue);
}
_currentDragValue = 0.0;
}
@@ -558,15 +558,15 @@
}
}
- double get _semanticActionUnit => divisions != null ? 1.0 / divisions : _kAdjustmentUnit;
+ double get _semanticActionUnit => divisions != null ? 1.0 / divisions! : _kAdjustmentUnit;
void _increaseAction() {
if (isInteractive)
- onChanged((value + _semanticActionUnit).clamp(0.0, 1.0) as double);
+ onChanged!((value + _semanticActionUnit).clamp(0.0, 1.0));
}
void _decreaseAction() {
if (isInteractive)
- onChanged((value - _semanticActionUnit).clamp(0.0, 1.0) as double);
+ onChanged!((value - _semanticActionUnit).clamp(0.0, 1.0));
}
}
diff --git a/packages/flutter/lib/src/cupertino/thumb_painter.dart b/packages/flutter/lib/src/cupertino/thumb_painter.dart
index 7f3bd49..c5a56c1 100644
--- a/packages/flutter/lib/src/cupertino/thumb_painter.dart
+++ b/packages/flutter/lib/src/cupertino/thumb_painter.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// @dart = 2.8
-
import 'package:flutter/painting.dart';
import 'colors.dart';
diff --git a/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart b/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart
index 9b29a63..e8f8da5 100644
--- a/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart
+++ b/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart
@@ -163,7 +163,7 @@
}) : assert(builder != null);
/// Called lazily to build children.
- final IndexedWidgetBuilder builder;
+ final NullableIndexedWidgetBuilder builder;
/// {@template flutter.widgets.wheelList.childCount}
/// If non-null, [childCount] is the maximum number of children that can be
diff --git a/packages/flutter/lib/src/widgets/navigator.dart b/packages/flutter/lib/src/widgets/navigator.dart
index 3abfb70..a69b456 100644
--- a/packages/flutter/lib/src/widgets/navigator.dart
+++ b/packages/flutter/lib/src/widgets/navigator.dart
@@ -633,7 +633,7 @@
/// Creates a widget to host the input [controller].
const HeroControllerScope({
Key? key,
- this.controller,
+ required HeroController this.controller,
required Widget child,
}) : assert(controller != null),
super(key: key, child: child);