From be868397bed9498191a9ea78f400e5d52db26351 Mon Sep 17 00:00:00 2001 From: Alexandre Ardhuin Date: Thu, 13 Aug 2020 00:26:09 +0200 Subject: [PATCH] migrate part of painting to nullsafety (#63495) --- .../flutter/lib/src/painting/borders.dart | 2 +- .../lib/src/painting/box_decoration.dart | 95 ++++++++-------- .../lib/src/painting/circle_border.dart | 13 +-- packages/flutter/lib/src/painting/clip.dart | 1 - .../painting/continuous_rectangle_border.dart | 17 ++- .../flutter/lib/src/painting/decoration.dart | 17 ++- .../lib/src/painting/decoration_image.dart | 55 +++++---- .../lib/src/painting/fractional_offset.dart | 15 +-- .../flutter/lib/src/painting/geometry.dart | 11 +- .../flutter/lib/src/painting/gradient.dart | 105 +++++++++--------- .../lib/src/painting/image_decoder.dart | 3 +- .../lib/src/painting/image_resolution.dart | 43 ++++--- .../lib/src/painting/matrix_utils.dart | 33 +++--- .../painting/rounded_rectangle_border.dart | 53 +++++---- .../lib/src/painting/shape_decoration.dart | 96 ++++++++-------- 15 files changed, 270 insertions(+), 289 deletions(-) diff --git a/packages/flutter/lib/src/painting/borders.dart b/packages/flutter/lib/src/painting/borders.dart index 690cab4e0b..66dd879a87 100644 --- a/packages/flutter/lib/src/painting/borders.dart +++ b/packages/flutter/lib/src/painting/borders.dart @@ -510,7 +510,7 @@ abstract class OutlinedBorder extends ShapeBorder { /// Returns a copy of this OutlinedBorder that draws its outline with the /// specified [side], if [side] is non-null. - OutlinedBorder copyWith({ BorderSide side }); + OutlinedBorder copyWith({ BorderSide? side }); } /// Represents the addition of two otherwise-incompatible borders. diff --git a/packages/flutter/lib/src/painting/box_decoration.dart b/packages/flutter/lib/src/painting/box_decoration.dart index 009d7a7400..c766c230f7 100644 --- a/packages/flutter/lib/src/painting/box_decoration.dart +++ b/packages/flutter/lib/src/painting/box_decoration.dart @@ -2,7 +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; @@ -106,14 +105,14 @@ class BoxDecoration extends Decoration { /// Creates a copy of this object but with the given fields replaced with the /// new values. BoxDecoration copyWith({ - Color color, - DecorationImage image, - BoxBorder border, - BorderRadiusGeometry borderRadius, - List boxShadow, - Gradient gradient, - BlendMode backgroundBlendMode, - BoxShape shape, + Color? color, + DecorationImage? image, + BoxBorder? border, + BorderRadiusGeometry? borderRadius, + List? boxShadow, + Gradient? gradient, + BlendMode? backgroundBlendMode, + BoxShape? shape, }) { return BoxDecoration( color: color ?? this.color, @@ -142,14 +141,14 @@ class BoxDecoration extends Decoration { /// This is ignored if [gradient] is non-null. /// /// The [color] is drawn under the [image]. - final Color color; + final Color? color; /// An image to paint above the background [color] or [gradient]. /// /// If [shape] is [BoxShape.circle] then the image is clipped to the circle's /// boundary; if [borderRadius] is non-null then the image is clipped to the /// given radii. - final DecorationImage image; + final DecorationImage? image; /// A border to draw above the background [color], [gradient], or [image]. /// @@ -161,7 +160,7 @@ class BoxDecoration extends Decoration { /// Use [BoxBorder] objects to describe borders that should flip their left /// and right edges based on whether the text is being read left-to-right or /// right-to-left. - final BoxBorder border; + final BoxBorder? border; /// If non-null, the corners of this box are rounded by this [BorderRadius]. /// @@ -169,7 +168,7 @@ class BoxDecoration extends Decoration { /// [BoxShape.rectangle]. /// /// {@macro flutter.painting.boxDecoration.clip} - final BorderRadiusGeometry borderRadius; + final BorderRadiusGeometry? borderRadius; /// A list of shadows cast by this box behind the box. /// @@ -180,14 +179,14 @@ class BoxDecoration extends Decoration { /// * [kElevationToShadow], for some predefined shadows used in Material /// Design. /// * [PhysicalModel], a widget for showing shadows. - final List boxShadow; + final List? boxShadow; /// A gradient to use when filling the box. /// /// If this is specified, [color] has no effect. /// /// The [gradient] is drawn under the [image]. - final Gradient gradient; + final Gradient? gradient; /// The blend mode applied to the [color] or [gradient] background of the box. /// @@ -195,7 +194,7 @@ class BoxDecoration extends Decoration { /// mode is used. /// /// If no [color] or [gradient] is provided then the blend mode has no impact. - final BlendMode backgroundBlendMode; + final BlendMode? backgroundBlendMode; /// The shape to fill the background [color], [gradient], and [image] into and /// to cast as the [boxShadow]. @@ -213,18 +212,18 @@ class BoxDecoration extends Decoration { final BoxShape shape; @override - EdgeInsetsGeometry get padding => border?.dimensions; + EdgeInsetsGeometry? get padding => border?.dimensions; @override - Path getClipPath(Rect rect, TextDirection textDirection) { - Path clipPath; + Path? getClipPath(Rect rect, TextDirection textDirection) { + Path? clipPath; switch (shape) { case BoxShape.circle: clipPath = Path()..addOval(rect); break; case BoxShape.rectangle: if (borderRadius != null) - clipPath = Path()..addRRect(borderRadius.resolve(textDirection).toRRect(rect)); + clipPath = Path()..addRRect(borderRadius!.resolve(textDirection).toRRect(rect)); break; } return clipPath; @@ -247,7 +246,7 @@ class BoxDecoration extends Decoration { bool get isComplex => boxShadow != null; @override - BoxDecoration lerpFrom(Decoration a, double t) { + BoxDecoration? lerpFrom(Decoration? a, double t) { if (a == null) return scale(t); if (a is BoxDecoration) @@ -256,7 +255,7 @@ class BoxDecoration extends Decoration { } @override - BoxDecoration lerpTo(Decoration b, double t) { + BoxDecoration? lerpTo(Decoration? b, double t) { if (b == null) return scale(1.0 - t); if (b is BoxDecoration) @@ -287,12 +286,12 @@ class BoxDecoration extends Decoration { /// * [lerpFrom] and [lerpTo], which are used to implement [Decoration.lerp] /// and which use [BoxDecoration.lerp] when interpolating two /// [BoxDecoration]s or a [BoxDecoration] to or from null. - static BoxDecoration lerp(BoxDecoration a, BoxDecoration b, double t) { + static BoxDecoration? lerp(BoxDecoration? a, BoxDecoration? b, double t) { assert(t != null); if (a == null && b == null) return null; if (a == null) - return b.scale(t); + return b!.scale(t); if (b == null) return a.scale(1.0 - t); if (t == 0.0) @@ -356,13 +355,13 @@ class BoxDecoration extends Decoration { } @override - bool hitTest(Size size, Offset position, { TextDirection textDirection }) { + bool hitTest(Size size, Offset position, { TextDirection? textDirection }) { assert(shape != null); assert((Offset.zero & size).contains(position)); switch (shape) { case BoxShape.rectangle: if (borderRadius != null) { - final RRect bounds = borderRadius.resolve(textDirection).toRRect(Offset.zero & size); + final RRect bounds = borderRadius!.resolve(textDirection).toRRect(Offset.zero & size); return bounds.contains(position); } return true; @@ -372,12 +371,10 @@ class BoxDecoration extends Decoration { final double distance = (position - center).distance; return distance <= math.min(size.width, size.height) / 2.0; } - assert(shape != null); - return null; } @override - _BoxDecorationPainter createBoxPainter([ VoidCallback onChanged ]) { + _BoxDecorationPainter createBoxPainter([ VoidCallback? onChanged ]) { assert(onChanged != null || image == null); return _BoxDecorationPainter(this, onChanged); } @@ -385,15 +382,15 @@ class BoxDecoration extends Decoration { /// An object that paints a [BoxDecoration] into a canvas. class _BoxDecorationPainter extends BoxPainter { - _BoxDecorationPainter(this._decoration, VoidCallback onChanged) + _BoxDecorationPainter(this._decoration, VoidCallback? onChanged) : assert(_decoration != null), super(onChanged); final BoxDecoration _decoration; - Paint _cachedBackgroundPaint; - Rect _rectForCachedBackgroundPaint; - Paint _getBackgroundPaint(Rect rect, TextDirection textDirection) { + Paint? _cachedBackgroundPaint; + Rect? _rectForCachedBackgroundPaint; + Paint _getBackgroundPaint(Rect rect, TextDirection? textDirection) { assert(rect != null); assert(_decoration.gradient != null || _rectForCachedBackgroundPaint == null); @@ -401,20 +398,20 @@ class _BoxDecorationPainter extends BoxPainter { (_decoration.gradient != null && _rectForCachedBackgroundPaint != rect)) { final Paint paint = Paint(); if (_decoration.backgroundBlendMode != null) - paint.blendMode = _decoration.backgroundBlendMode; + paint.blendMode = _decoration.backgroundBlendMode!; if (_decoration.color != null) - paint.color = _decoration.color; + paint.color = _decoration.color!; if (_decoration.gradient != null) { - paint.shader = _decoration.gradient.createShader(rect, textDirection: textDirection); + paint.shader = _decoration.gradient!.createShader(rect, textDirection: textDirection); _rectForCachedBackgroundPaint = rect; } _cachedBackgroundPaint = paint; } - return _cachedBackgroundPaint; + return _cachedBackgroundPaint!; } - void _paintBox(Canvas canvas, Rect rect, Paint paint, TextDirection textDirection) { + void _paintBox(Canvas canvas, Rect rect, Paint paint, TextDirection? textDirection) { switch (_decoration.shape) { case BoxShape.circle: assert(_decoration.borderRadius == null); @@ -426,43 +423,43 @@ class _BoxDecorationPainter extends BoxPainter { if (_decoration.borderRadius == null) { canvas.drawRect(rect, paint); } else { - canvas.drawRRect(_decoration.borderRadius.resolve(textDirection).toRRect(rect), paint); + canvas.drawRRect(_decoration.borderRadius!.resolve(textDirection).toRRect(rect), paint); } break; } } - void _paintShadows(Canvas canvas, Rect rect, TextDirection textDirection) { + void _paintShadows(Canvas canvas, Rect rect, TextDirection? textDirection) { if (_decoration.boxShadow == null) return; - for (final BoxShadow boxShadow in _decoration.boxShadow) { + for (final BoxShadow boxShadow in _decoration.boxShadow!) { final Paint paint = boxShadow.toPaint(); final Rect bounds = rect.shift(boxShadow.offset).inflate(boxShadow.spreadRadius); _paintBox(canvas, bounds, paint, textDirection); } } - void _paintBackgroundColor(Canvas canvas, Rect rect, TextDirection textDirection) { + void _paintBackgroundColor(Canvas canvas, Rect rect, TextDirection? textDirection) { if (_decoration.color != null || _decoration.gradient != null) _paintBox(canvas, rect, _getBackgroundPaint(rect, textDirection), textDirection); } - DecorationImagePainter _imagePainter; + DecorationImagePainter? _imagePainter; void _paintBackgroundImage(Canvas canvas, Rect rect, ImageConfiguration configuration) { if (_decoration.image == null) return; - _imagePainter ??= _decoration.image.createPainter(onChanged); - Path clipPath; + _imagePainter ??= _decoration.image!.createPainter(onChanged!); + Path? clipPath; switch (_decoration.shape) { case BoxShape.circle: clipPath = Path()..addOval(rect); break; case BoxShape.rectangle: if (_decoration.borderRadius != null) - clipPath = Path()..addRRect(_decoration.borderRadius.resolve(configuration.textDirection).toRRect(rect)); + clipPath = Path()..addRRect(_decoration.borderRadius!.resolve(configuration.textDirection).toRRect(rect)); break; } - _imagePainter.paint(canvas, rect, clipPath, configuration); + _imagePainter!.paint(canvas, rect, clipPath, configuration); } @override @@ -476,8 +473,8 @@ class _BoxDecorationPainter extends BoxPainter { void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) { assert(configuration != null); assert(configuration.size != null); - final Rect rect = offset & configuration.size; - final TextDirection textDirection = configuration.textDirection; + final Rect rect = offset & configuration.size!; + final TextDirection? textDirection = configuration.textDirection; _paintShadows(canvas, rect, textDirection); _paintBackgroundColor(canvas, rect, textDirection); _paintBackgroundImage(canvas, rect, configuration); diff --git a/packages/flutter/lib/src/painting/circle_border.dart b/packages/flutter/lib/src/painting/circle_border.dart index dddfc9f279..482465873e 100644 --- a/packages/flutter/lib/src/painting/circle_border.dart +++ b/packages/flutter/lib/src/painting/circle_border.dart @@ -2,7 +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; @@ -40,21 +39,21 @@ class CircleBorder extends OutlinedBorder { ShapeBorder scale(double t) => CircleBorder(side: side.scale(t)); @override - ShapeBorder lerpFrom(ShapeBorder a, double t) { + ShapeBorder? lerpFrom(ShapeBorder? a, double t) { if (a is CircleBorder) return CircleBorder(side: BorderSide.lerp(a.side, side, t)); return super.lerpFrom(a, t); } @override - ShapeBorder lerpTo(ShapeBorder b, double t) { + ShapeBorder? lerpTo(ShapeBorder? b, double t) { if (b is CircleBorder) return CircleBorder(side: BorderSide.lerp(side, b.side, t)); return super.lerpTo(b, t); } @override - Path getInnerPath(Rect rect, { TextDirection textDirection }) { + Path getInnerPath(Rect rect, { TextDirection? textDirection }) { return Path() ..addOval(Rect.fromCircle( center: rect.center, @@ -63,7 +62,7 @@ class CircleBorder extends OutlinedBorder { } @override - Path getOuterPath(Rect rect, { TextDirection textDirection }) { + Path getOuterPath(Rect rect, { TextDirection? textDirection }) { return Path() ..addOval(Rect.fromCircle( center: rect.center, @@ -72,12 +71,12 @@ class CircleBorder extends OutlinedBorder { } @override - CircleBorder copyWith({ BorderSide side }) { + CircleBorder copyWith({ BorderSide? side }) { return CircleBorder(side: side ?? this.side); } @override - void paint(Canvas canvas, Rect rect, { TextDirection textDirection }) { + void paint(Canvas canvas, Rect rect, { TextDirection? textDirection }) { switch (side.style) { case BorderStyle.none: break; diff --git a/packages/flutter/lib/src/painting/clip.dart b/packages/flutter/lib/src/painting/clip.dart index 11ce174c18..808a5e72a2 100644 --- a/packages/flutter/lib/src/painting/clip.dart +++ b/packages/flutter/lib/src/painting/clip.dart @@ -2,7 +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:ui' show Canvas, Clip, Path, Paint, Rect, RRect; diff --git a/packages/flutter/lib/src/painting/continuous_rectangle_border.dart b/packages/flutter/lib/src/painting/continuous_rectangle_border.dart index fa53083a3b..0e380a7375 100644 --- a/packages/flutter/lib/src/painting/continuous_rectangle_border.dart +++ b/packages/flutter/lib/src/painting/continuous_rectangle_border.dart @@ -2,7 +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; @@ -61,24 +60,24 @@ class ContinuousRectangleBorder extends OutlinedBorder { } @override - ShapeBorder lerpFrom(ShapeBorder a, double t) { + ShapeBorder? lerpFrom(ShapeBorder? a, double t) { assert(t != null); if (a is ContinuousRectangleBorder) { return ContinuousRectangleBorder( side: BorderSide.lerp(a.side, side, t), - borderRadius: BorderRadiusGeometry.lerp(a.borderRadius, borderRadius, t), + borderRadius: BorderRadiusGeometry.lerp(a.borderRadius, borderRadius, t)!, ); } return super.lerpFrom(a, t); } @override - ShapeBorder lerpTo(ShapeBorder b, double t) { + ShapeBorder? lerpTo(ShapeBorder? b, double t) { assert(t != null); if (b is ContinuousRectangleBorder) { return ContinuousRectangleBorder( side: BorderSide.lerp(side, b.side, t), - borderRadius: BorderRadiusGeometry.lerp(borderRadius, b.borderRadius, t), + borderRadius: BorderRadiusGeometry.lerp(borderRadius, b.borderRadius, t)!, ); } return super.lerpTo(b, t); @@ -125,17 +124,17 @@ class ContinuousRectangleBorder extends OutlinedBorder { } @override - Path getInnerPath(Rect rect, { TextDirection textDirection }) { + Path getInnerPath(Rect rect, { TextDirection? textDirection }) { return _getPath(borderRadius.resolve(textDirection).toRRect(rect).deflate(side.width)); } @override - Path getOuterPath(Rect rect, { TextDirection textDirection }) { + Path getOuterPath(Rect rect, { TextDirection? textDirection }) { return _getPath(borderRadius.resolve(textDirection).toRRect(rect)); } @override - ContinuousRectangleBorder copyWith({ BorderSide side, BorderRadius borderRadius }) { + ContinuousRectangleBorder copyWith({ BorderSide? side, BorderRadius? borderRadius }) { return ContinuousRectangleBorder( side: side ?? this.side, borderRadius: borderRadius ?? this.borderRadius, @@ -143,7 +142,7 @@ class ContinuousRectangleBorder extends OutlinedBorder { } @override - void paint(Canvas canvas, Rect rect, { TextDirection textDirection }) { + void paint(Canvas canvas, Rect rect, { TextDirection? textDirection }) { if (rect.isEmpty) return; switch (side.style) { diff --git a/packages/flutter/lib/src/painting/decoration.dart b/packages/flutter/lib/src/painting/decoration.dart index 07d6f3c98a..aa8ee82bba 100644 --- a/packages/flutter/lib/src/painting/decoration.dart +++ b/packages/flutter/lib/src/painting/decoration.dart @@ -2,7 +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'; @@ -58,7 +57,7 @@ abstract class Decoration with Diagnosticable { /// [EdgeInsetsGeometry.resolve] to obtain an absolute [EdgeInsets]. (For /// example, [BorderDirectional] will return an [EdgeInsetsDirectional] for /// its [padding].) - EdgeInsetsGeometry get padding => EdgeInsets.zero; + EdgeInsetsGeometry? get padding => EdgeInsets.zero; /// Whether this decoration is complex enough to benefit from caching its painting. bool get isComplex => false; @@ -89,7 +88,7 @@ abstract class Decoration with Diagnosticable { /// /// Instead of calling this directly, use [Decoration.lerp]. @protected - Decoration lerpFrom(Decoration a, double t) => null; + Decoration? lerpFrom(Decoration? a, double t) => null; /// Linearly interpolates from `this` to another [Decoration] (which may be of /// a different class). @@ -118,7 +117,7 @@ abstract class Decoration with Diagnosticable { /// /// Instead of calling this directly, use [Decoration.lerp]. @protected - Decoration lerpTo(Decoration b, double t) => null; + Decoration? lerpTo(Decoration? b, double t) => null; /// Linearly interpolates between two [Decoration]s. /// @@ -127,12 +126,12 @@ abstract class Decoration with Diagnosticable { /// interpolated, then the interpolation is done via null (at `t == 0.5`). /// /// {@macro dart.ui.shadow.lerp} - static Decoration lerp(Decoration a, Decoration b, double t) { + static Decoration? lerp(Decoration? a, Decoration? b, double t) { assert(t != null); if (a == null && b == null) return null; if (a == null) - return b.lerpFrom(null, t) ?? b; + return b!.lerpFrom(null, t) ?? b; if (b == null) return a.lerpTo(null, t) ?? a; if (t == 0.0) @@ -159,7 +158,7 @@ abstract class Decoration with Diagnosticable { /// is what [Container] uses), the `textDirection` parameter will be populated /// based on the ambient [Directionality] (by way of the [RenderDecoratedBox] /// renderer). - bool hitTest(Size size, Offset position, { TextDirection textDirection }) => true; + bool hitTest(Size size, Offset position, { TextDirection? textDirection }) => true; /// Returns a [BoxPainter] that will paint this decoration. /// @@ -170,7 +169,7 @@ abstract class Decoration with Diagnosticable { BoxPainter createBoxPainter([ VoidCallback onChanged ]); /// Returns a closed [Path] that describes the outer edge of this decoration. - Path getClipPath(Rect rect, TextDirection textDirection) => null; + Path? getClipPath(Rect rect, TextDirection textDirection) => null; } /// A stateful class that can paint a particular [Decoration]. @@ -220,7 +219,7 @@ abstract class BoxPainter { /// /// Resources might not start to load until after [paint] has been called, /// because they might depend on the configuration. - final VoidCallback onChanged; + final VoidCallback? onChanged; /// Discard any resources being held by the object. /// diff --git a/packages/flutter/lib/src/painting/decoration_image.dart b/packages/flutter/lib/src/painting/decoration_image.dart index 6779d92c48..f257e532db 100644 --- a/packages/flutter/lib/src/painting/decoration_image.dart +++ b/packages/flutter/lib/src/painting/decoration_image.dart @@ -2,7 +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:developer' as developer; import 'dart:ui' as ui show Image; @@ -44,7 +43,7 @@ class DecorationImage { /// The [image], [alignment], [repeat], and [matchTextDirection] arguments /// must not be null. const DecorationImage({ - @required this.image, + required this.image, this.onError, this.colorFilter, this.fit, @@ -66,10 +65,10 @@ class DecorationImage { final ImageProvider image; /// An optional error callback for errors emitted when loading [image]. - final ImageErrorListener onError; + final ImageErrorListener? onError; /// A color filter to apply to the image before painting it. - final ColorFilter colorFilter; + final ColorFilter? colorFilter; /// How the image should be inscribed into the box. /// @@ -77,7 +76,7 @@ class DecorationImage { /// [BoxFit.fill] if [centerSlice] is not null. /// /// See the discussion at [paintImage] for more details. - final BoxFit fit; + final BoxFit? fit; /// How to align the image within its bounds. /// @@ -121,7 +120,7 @@ class DecorationImage { /// destination image size will result in [centerSlice] having no effect /// (since the nine regions of the image will be rendered with the same /// scaling, as if it wasn't specified). - final Rect centerSlice; + final Rect? centerSlice; /// How to paint any portions of the box that would not otherwise be covered /// by the image. @@ -212,8 +211,8 @@ class DecorationImagePainter { final DecorationImage _details; final VoidCallback _onChanged; - ImageStream _imageStream; - ImageInfo _image; + ImageStream? _imageStream; + ImageInfo? _image; /// Draw the image onto the given canvas. /// @@ -229,7 +228,7 @@ class DecorationImagePainter { /// because it had not yet been loaded the first time this method was called, /// then the `onChanged` callback passed to [DecorationImage.createPainter] /// will be called. - void paint(Canvas canvas, Rect rect, Path clipPath, ImageConfiguration configuration) { + void paint(Canvas canvas, Rect rect, Path? clipPath, ImageConfiguration configuration) { assert(canvas != null); assert(rect != null); assert(configuration != null); @@ -264,7 +263,7 @@ class DecorationImagePainter { ); _imageStream?.removeListener(listener); _imageStream = newImageStream; - _imageStream.addListener(listener); + _imageStream!.addListener(listener); } if (_image == null) return; @@ -277,9 +276,9 @@ class DecorationImagePainter { paintImage( canvas: canvas, rect: rect, - image: _image.image, - debugImageLabel: _image.debugLabel, - scale: _details.scale * _image.scale, + image: _image!.image, + debugImageLabel: _image!.debugLabel, + scale: _details.scale * _image!.scale, colorFilter: _details.colorFilter, fit: _details.fit, alignment: _details.alignment.resolve(configuration.textDirection), @@ -409,15 +408,15 @@ void debugFlushLastFrameImageSizeInfo() { /// * [DecorationImage], which holds a configuration for calling this function. /// * [BoxDecoration], which uses this function to paint a [DecorationImage]. void paintImage({ - @required Canvas canvas, - @required Rect rect, - @required ui.Image image, - String debugImageLabel, + required Canvas canvas, + required Rect rect, + required ui.Image image, + String? debugImageLabel, double scale = 1.0, - ColorFilter colorFilter, - BoxFit fit, + ColorFilter? colorFilter, + BoxFit? fit, Alignment alignment = Alignment.center, - Rect centerSlice, + Rect? centerSlice, ImageRepeat repeat = ImageRepeat.noRepeat, bool flipHorizontally = false, bool invertColors = false, @@ -434,7 +433,7 @@ void paintImage({ return; Size outputSize = rect.size; Size inputSize = Size(image.width.toDouble(), image.height.toDouble()); - Offset sliceBorder; + Offset? sliceBorder; if (centerSlice != null) { sliceBorder = Offset( centerSlice.left + inputSize.width - centerSlice.right, @@ -449,7 +448,7 @@ void paintImage({ final Size sourceSize = fittedSizes.source * scale; Size destinationSize = fittedSizes.destination; if (centerSlice != null) { - outputSize += sliceBorder; + outputSize += sliceBorder!; destinationSize += sliceBorder; // We don't have the ability to draw a subset of the image at the same time // as we apply a nine-patch stretch. @@ -523,23 +522,23 @@ void paintImage({ }()); // Avoid emitting events that are the same as those emitted in the last frame. if (!_lastFrameImageSizeInfo.contains(sizeInfo)) { - final ImageSizeInfo existingSizeInfo = _pendingImageSizeInfo[sizeInfo.source]; + final ImageSizeInfo? existingSizeInfo = _pendingImageSizeInfo[sizeInfo.source]; if (existingSizeInfo == null || existingSizeInfo.displaySizeInBytes < sizeInfo.displaySizeInBytes) { - _pendingImageSizeInfo[sizeInfo.source] = sizeInfo; + _pendingImageSizeInfo[sizeInfo.source!] = sizeInfo; } if (debugOnPaintImage != null) { - debugOnPaintImage(sizeInfo); + debugOnPaintImage!(sizeInfo); } - SchedulerBinding.instance.addPostFrameCallback((Duration timeStamp) { + SchedulerBinding.instance!.addPostFrameCallback((Duration timeStamp) { _lastFrameImageSizeInfo = _pendingImageSizeInfo.values.toSet(); if (_pendingImageSizeInfo.isEmpty) { return; } developer.postEvent( 'Flutter.ImageSizesForFrame', - { + { for (ImageSizeInfo imageSizeInfo in _pendingImageSizeInfo.values) - imageSizeInfo.source: imageSizeInfo.toJson() + imageSizeInfo.source!: imageSizeInfo.toJson() }, ); _pendingImageSizeInfo = {}; diff --git a/packages/flutter/lib/src/painting/fractional_offset.dart b/packages/flutter/lib/src/painting/fractional_offset.dart index e762b10e2f..56471eb691 100644 --- a/packages/flutter/lib/src/painting/fractional_offset.dart +++ b/packages/flutter/lib/src/painting/fractional_offset.dart @@ -2,7 +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:ui' as ui show lerpDouble; @@ -139,16 +138,14 @@ class FractionalOffset extends Alignment { Alignment operator -(Alignment other) { if (other is! FractionalOffset) return super - other; - final FractionalOffset typedOther = other as FractionalOffset; - return FractionalOffset(dx - typedOther.dx, dy - typedOther.dy); + return FractionalOffset(dx - other.dx, dy - other.dy); } @override Alignment operator +(Alignment other) { if (other is! FractionalOffset) return super + other; - final FractionalOffset typedOther = other as FractionalOffset; - return FractionalOffset(dx + typedOther.dx, dy + typedOther.dy); + return FractionalOffset(dx + other.dx, dy + other.dy); } @override @@ -181,15 +178,15 @@ class FractionalOffset extends Alignment { /// If either is null, this function interpolates from [FractionalOffset.center]. /// /// {@macro dart.ui.shadow.lerp} - static FractionalOffset lerp(FractionalOffset a, FractionalOffset b, double t) { + static FractionalOffset? lerp(FractionalOffset? a, FractionalOffset? b, double t) { assert(t != null); if (a == null && b == null) return null; if (a == null) - return FractionalOffset(ui.lerpDouble(0.5, b.dx, t), ui.lerpDouble(0.5, b.dy, t)); + return FractionalOffset(ui.lerpDouble(0.5, b!.dx, t)!, ui.lerpDouble(0.5, b.dy, t)!); if (b == null) - return FractionalOffset(ui.lerpDouble(a.dx, 0.5, t), ui.lerpDouble(a.dy, 0.5, t)); - return FractionalOffset(ui.lerpDouble(a.dx, b.dx, t), ui.lerpDouble(a.dy, b.dy, t)); + return FractionalOffset(ui.lerpDouble(a.dx, 0.5, t)!, ui.lerpDouble(a.dy, 0.5, t)!); + return FractionalOffset(ui.lerpDouble(a.dx, b.dx, t)!, ui.lerpDouble(a.dy, b.dy, t)!); } @override diff --git a/packages/flutter/lib/src/painting/geometry.dart b/packages/flutter/lib/src/painting/geometry.dart index 856b88e75a..9501e6f2c5 100644 --- a/packages/flutter/lib/src/painting/geometry.dart +++ b/packages/flutter/lib/src/painting/geometry.dart @@ -2,12 +2,9 @@ // 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/foundation.dart'; - import 'basic_types.dart'; /// Position a child box within a container box, either above or below a target @@ -41,10 +38,10 @@ import 'basic_types.dart'; /// /// The arguments must not be null. Offset positionDependentBox({ - @required Size size, - @required Size childSize, - @required Offset target, - @required bool preferBelow, + required Size size, + required Size childSize, + required Offset target, + required bool preferBelow, double verticalOffset = 0.0, double margin = 10.0, }) { diff --git a/packages/flutter/lib/src/painting/gradient.dart b/packages/flutter/lib/src/painting/gradient.dart index 6e331ee79c..7423cf9664 100644 --- a/packages/flutter/lib/src/painting/gradient.dart +++ b/packages/flutter/lib/src/painting/gradient.dart @@ -2,7 +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:collection'; import 'dart:math' as math; @@ -37,7 +36,7 @@ Color _sample(List colors, List stops, double t) { return Color.lerp( colors[index], colors[index + 1], (t - stops[index]) / (stops[index + 1] - stops[index]), - ); + )!; } _ColorsAndStops _interpolateColorsAndStops( @@ -56,7 +55,7 @@ _ColorsAndStops _interpolateColorsAndStops( ..addAll(bStops); final List interpolatedStops = stops.toList(growable: false); final List interpolatedColors = interpolatedStops.map( - (double stop) => Color.lerp(_sample(aColors, aStops, stop), _sample(bColors, bStops, stop), t) + (double stop) => Color.lerp(_sample(aColors, aStops, stop), _sample(bColors, bStops, stop), t)! ).toList(growable: false); return _ColorsAndStops(interpolatedColors, interpolatedStops); } @@ -78,7 +77,7 @@ abstract class GradientTransform { /// /// Implementers may return null from this method, which achieves the same /// final effect as returning [Matrix4.identity]. - Matrix4 transform(Rect bounds, {TextDirection textDirection}); + Matrix4? transform(Rect bounds, {TextDirection? textDirection}); } /// A [GradientTransform] that rotates the gradient around the center-point of @@ -106,7 +105,7 @@ class GradientRotation extends GradientTransform { final double radians; @override - Matrix4 transform(Rect bounds, {TextDirection textDirection}) { + Matrix4 transform(Rect bounds, {TextDirection? textDirection}) { assert(bounds != null); final double sinRadians = math.sin(radians); final double oneMinusCosRadians = 1 - math.cos(radians); @@ -147,7 +146,7 @@ abstract class Gradient { /// no other rotation or perspective transformations have been applied to the /// [Canvas]. If null, no transformation is applied. const Gradient({ - @required this.colors, + required this.colors, this.stops, this.transform, }) : assert(colors != null); @@ -176,17 +175,17 @@ abstract class Gradient { /// /// If stops is null, then a set of uniformly distributed stops is implied, /// with the first stop at 0.0 and the last stop at 1.0. - final List stops; + final List? stops; /// The transform, if any, to apply to the gradient. /// /// This transform is in addition to any other transformations applied to the /// canvas, but does not add any transformations to the canvas. - final GradientTransform transform; + final GradientTransform? transform; List _impliedStops() { if (stops != null) - return stops; + return stops!; assert(colors.length >= 2, 'colors list must have at least two colors'); final double separation = 1.0 / (colors.length - 1); return List.generate( @@ -205,7 +204,7 @@ abstract class Gradient { /// The shader's transform will be resolved from the [transform] of this /// gradient. @factory - Shader createShader(Rect rect, { TextDirection textDirection }); + Shader createShader(Rect rect, { TextDirection? textDirection }); /// Returns a new gradient with its properties scaled by the given factor. /// @@ -242,7 +241,7 @@ abstract class Gradient { /// /// Instead of calling this directly, use [Gradient.lerp]. @protected - Gradient lerpFrom(Gradient a, double t) { + Gradient? lerpFrom(Gradient? a, double t) { if (a == null) return scale(t); return null; @@ -273,7 +272,7 @@ abstract class Gradient { /// /// Instead of calling this directly, use [Gradient.lerp]. @protected - Gradient lerpTo(Gradient b, double t) { + Gradient? lerpTo(Gradient? b, double t) { if (b == null) return scale(1.0 - t); return null; @@ -287,9 +286,9 @@ abstract class Gradient { /// and `b` after `t == 0.5`. /// /// {@macro dart.ui.shadow.lerp} - static Gradient lerp(Gradient a, Gradient b, double t) { + static Gradient? lerp(Gradient? a, Gradient? b, double t) { assert(t != null); - Gradient result; + Gradient? result; if (b != null) result = b.lerpFrom(a, t); // if a is null, this must return non-null if (result == null && a != null) @@ -299,10 +298,10 @@ abstract class Gradient { if (a == null && b == null) return null; assert(a != null && b != null); - return t < 0.5 ? a.scale(1.0 - (t * 2.0)) : b.scale((t - 0.5) * 2.0); + return t < 0.5 ? a!.scale(1.0 - (t * 2.0)) : b!.scale((t - 0.5) * 2.0); } - Float64List _resolveTransform(Rect bounds, TextDirection textDirection) { + Float64List? _resolveTransform(Rect bounds, TextDirection? textDirection) { return transform?.transform(bounds, textDirection: textDirection)?.storage; } } @@ -366,10 +365,10 @@ class LinearGradient extends Gradient { const LinearGradient({ this.begin = Alignment.centerLeft, this.end = Alignment.centerRight, - @required List colors, - List stops, + required List colors, + List? stops, this.tileMode = TileMode.clamp, - GradientTransform transform, + GradientTransform? transform, }) : assert(begin != null), assert(end != null), assert(tileMode != null), @@ -416,7 +415,7 @@ class LinearGradient extends Gradient { final TileMode tileMode; @override - Shader createShader(Rect rect, { TextDirection textDirection }) { + Shader createShader(Rect rect, { TextDirection? textDirection }) { return ui.Gradient.linear( begin.resolve(textDirection).withinRect(rect), end.resolve(textDirection).withinRect(rect), @@ -433,21 +432,21 @@ class LinearGradient extends Gradient { return LinearGradient( begin: begin, end: end, - colors: colors.map((Color color) => Color.lerp(null, color, factor)).toList(), + colors: colors.map((Color color) => Color.lerp(null, color, factor)!).toList(), stops: stops, tileMode: tileMode, ); } @override - Gradient lerpFrom(Gradient a, double t) { + Gradient? lerpFrom(Gradient? a, double t) { if (a == null || (a is LinearGradient)) return LinearGradient.lerp(a as LinearGradient, this, t); return super.lerpFrom(a, t); } @override - Gradient lerpTo(Gradient b, double t) { + Gradient? lerpTo(Gradient? b, double t) { if (b == null || (b is LinearGradient)) return LinearGradient.lerp(this, b as LinearGradient, t); return super.lerpTo(b, t); @@ -472,12 +471,12 @@ class LinearGradient extends Gradient { /// /// Values for `t` are usually obtained from an [Animation], such as /// an [AnimationController]. - static LinearGradient lerp(LinearGradient a, LinearGradient b, double t) { + static LinearGradient? lerp(LinearGradient? a, LinearGradient? b, double t) { assert(t != null); if (a == null && b == null) return null; if (a == null) - return b.scale(t); + return b!.scale(t); if (b == null) return a.scale(1.0 - t); final _ColorsAndStops interpolated = _interpolateColorsAndStops( @@ -488,8 +487,8 @@ class LinearGradient extends Gradient { t, ); return LinearGradient( - begin: AlignmentGeometry.lerp(a.begin, b.begin, t), - end: AlignmentGeometry.lerp(a.end, b.end, t), + begin: AlignmentGeometry.lerp(a.begin, b.begin, t)!, + end: AlignmentGeometry.lerp(a.end, b.end, t)!, colors: interpolated.colors, stops: interpolated.stops, tileMode: t < 0.5 ? a.tileMode : b.tileMode, // TODO(ianh): interpolate tile mode @@ -596,12 +595,12 @@ class RadialGradient extends Gradient { const RadialGradient({ this.center = Alignment.center, this.radius = 0.5, - @required List colors, - List stops, + required List colors, + List? stops, this.tileMode = TileMode.clamp, this.focal, this.focalRadius = 0.0, - GradientTransform transform, + GradientTransform? transform, }) : assert(center != null), assert(radius != null), assert(tileMode != null), @@ -654,7 +653,7 @@ class RadialGradient extends Gradient { /// If this value is specified and [focalRadius] > 0.0, care should be taken /// to ensure that either this value or [center] will not both resolve to /// [Offset.zero], which would fail to create a valid gradient. - final AlignmentGeometry focal; + final AlignmentGeometry? focal; /// The radius of the focal point of gradient, as a fraction of the shortest /// side of the paint box. @@ -669,13 +668,13 @@ class RadialGradient extends Gradient { final double focalRadius; @override - Shader createShader(Rect rect, { TextDirection textDirection }) { + Shader createShader(Rect rect, { TextDirection? textDirection }) { return ui.Gradient.radial( center.resolve(textDirection).withinRect(rect), radius * rect.shortestSide, colors, _impliedStops(), tileMode, _resolveTransform(rect, textDirection), - focal == null ? null : focal.resolve(textDirection).withinRect(rect), + focal == null ? null : focal!.resolve(textDirection).withinRect(rect), focalRadius * rect.shortestSide, ); } @@ -689,7 +688,7 @@ class RadialGradient extends Gradient { return RadialGradient( center: center, radius: radius, - colors: colors.map((Color color) => Color.lerp(null, color, factor)).toList(), + colors: colors.map((Color color) => Color.lerp(null, color, factor)!).toList(), stops: stops, tileMode: tileMode, focal: focal, @@ -698,14 +697,14 @@ class RadialGradient extends Gradient { } @override - Gradient lerpFrom(Gradient a, double t) { + Gradient? lerpFrom(Gradient? a, double t) { if (a == null || (a is RadialGradient)) return RadialGradient.lerp(a as RadialGradient, this, t); return super.lerpFrom(a, t); } @override - Gradient lerpTo(Gradient b, double t) { + Gradient? lerpTo(Gradient? b, double t) { if (b == null || (b is RadialGradient)) return RadialGradient.lerp(this, b as RadialGradient, t); return super.lerpTo(b, t); @@ -730,12 +729,12 @@ class RadialGradient extends Gradient { /// /// Values for `t` are usually obtained from an [Animation], such as /// an [AnimationController]. - static RadialGradient lerp(RadialGradient a, RadialGradient b, double t) { + static RadialGradient? lerp(RadialGradient? a, RadialGradient? b, double t) { assert(t != null); if (a == null && b == null) return null; if (a == null) - return b.scale(t); + return b!.scale(t); if (b == null) return a.scale(1.0 - t); final _ColorsAndStops interpolated = _interpolateColorsAndStops( @@ -746,13 +745,13 @@ class RadialGradient extends Gradient { t, ); return RadialGradient( - center: AlignmentGeometry.lerp(a.center, b.center, t), - radius: math.max(0.0, ui.lerpDouble(a.radius, b.radius, t)), + center: AlignmentGeometry.lerp(a.center, b.center, t)!, + radius: math.max(0.0, ui.lerpDouble(a.radius, b.radius, t)!), colors: interpolated.colors, stops: interpolated.stops, tileMode: t < 0.5 ? a.tileMode : b.tileMode, // TODO(ianh): interpolate tile mode focal: AlignmentGeometry.lerp(a.focal, b.focal, t), - focalRadius: math.max(0.0, ui.lerpDouble(a.focalRadius, b.focalRadius, t)), + focalRadius: math.max(0.0, ui.lerpDouble(a.focalRadius, b.focalRadius, t)!), ); } @@ -872,10 +871,10 @@ class SweepGradient extends Gradient { this.center = Alignment.center, this.startAngle = 0.0, this.endAngle = math.pi * 2, - @required List colors, - List stops, + required List colors, + List? stops, this.tileMode = TileMode.clamp, - GradientTransform transform, + GradientTransform? transform, }) : assert(center != null), assert(startAngle != null), assert(endAngle != null), @@ -919,7 +918,7 @@ class SweepGradient extends Gradient { final TileMode tileMode; @override - Shader createShader(Rect rect, { TextDirection textDirection }) { + Shader createShader(Rect rect, { TextDirection? textDirection }) { return ui.Gradient.sweep( center.resolve(textDirection).withinRect(rect), colors, _impliedStops(), tileMode, @@ -939,21 +938,21 @@ class SweepGradient extends Gradient { center: center, startAngle: startAngle, endAngle: endAngle, - colors: colors.map((Color color) => Color.lerp(null, color, factor)).toList(), + colors: colors.map((Color color) => Color.lerp(null, color, factor)!).toList(), stops: stops, tileMode: tileMode, ); } @override - Gradient lerpFrom(Gradient a, double t) { + Gradient? lerpFrom(Gradient? a, double t) { if (a == null || (a is SweepGradient)) return SweepGradient.lerp(a as SweepGradient, this, t); return super.lerpFrom(a, t); } @override - Gradient lerpTo(Gradient b, double t) { + Gradient? lerpTo(Gradient? b, double t) { if (b == null || (b is SweepGradient)) return SweepGradient.lerp(this, b as SweepGradient, t); return super.lerpTo(b, t); @@ -977,12 +976,12 @@ class SweepGradient extends Gradient { /// /// Values for `t` are usually obtained from an [Animation], such as /// an [AnimationController]. - static SweepGradient lerp(SweepGradient a, SweepGradient b, double t) { + static SweepGradient? lerp(SweepGradient? a, SweepGradient? b, double t) { assert(t != null); if (a == null && b == null) return null; if (a == null) - return b.scale(t); + return b!.scale(t); if (b == null) return a.scale(1.0 - t); final _ColorsAndStops interpolated = _interpolateColorsAndStops( @@ -993,9 +992,9 @@ class SweepGradient extends Gradient { t, ); return SweepGradient( - center: AlignmentGeometry.lerp(a.center, b.center, t), - startAngle: math.max(0.0, ui.lerpDouble(a.startAngle, b.startAngle, t)), - endAngle: math.max(0.0, ui.lerpDouble(a.endAngle, b.endAngle, t)), + center: AlignmentGeometry.lerp(a.center, b.center, t)!, + startAngle: math.max(0.0, ui.lerpDouble(a.startAngle, b.startAngle, t)!), + endAngle: math.max(0.0, ui.lerpDouble(a.endAngle, b.endAngle, t)!), colors: interpolated.colors, stops: interpolated.stops, tileMode: t < 0.5 ? a.tileMode : b.tileMode, // TODO(ianh): interpolate tile mode diff --git a/packages/flutter/lib/src/painting/image_decoder.dart b/packages/flutter/lib/src/painting/image_decoder.dart index c2e5313796..d94b5abb27 100644 --- a/packages/flutter/lib/src/painting/image_decoder.dart +++ b/packages/flutter/lib/src/painting/image_decoder.dart @@ -2,7 +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:async'; import 'dart:typed_data'; @@ -23,7 +22,7 @@ import 'binding.dart'; /// [PaintingBinding.instantiateImageCodec], and therefore can be mocked in /// tests. Future decodeImageFromList(Uint8List bytes) async { - final ui.Codec codec = await PaintingBinding.instance.instantiateImageCodec(bytes); + final ui.Codec codec = await PaintingBinding.instance!.instantiateImageCodec(bytes); final ui.FrameInfo frameInfo = await codec.getNextFrame(); return frameInfo.image; } diff --git a/packages/flutter/lib/src/painting/image_resolution.dart b/packages/flutter/lib/src/painting/image_resolution.dart index ec7011b12c..658594fe8e 100644 --- a/packages/flutter/lib/src/painting/image_resolution.dart +++ b/packages/flutter/lib/src/painting/image_resolution.dart @@ -2,7 +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:async'; import 'dart:collection'; @@ -153,11 +152,11 @@ class AssetImage extends AssetBundleImageProvider { /// /// The image is obtained by calling [AssetBundle.load] on the given [bundle] /// using the key given by [keyName]. - final AssetBundle bundle; + final AssetBundle? bundle; /// The name of the package from which the image is included. See the /// documentation for the [AssetImage] class itself for details. - final String package; + final String? package; // We assume the main asset is designed for a device pixel ratio of 1.0 static const double _naturalResolution = 1.0; @@ -171,16 +170,16 @@ class AssetImage extends AssetBundleImageProvider { // that we resolve each future in a new call frame, and thus not in this // build/layout/paint sequence.) final AssetBundle chosenBundle = bundle ?? configuration.bundle ?? rootBundle; - Completer completer; - Future result; + Completer? completer; + Future? result; - chosenBundle.loadStructuredData>>(_kAssetManifestFileName, _manifestParser).then( - (Map> manifest) { + chosenBundle.loadStructuredData>?>(_kAssetManifestFileName, _manifestParser).then( + (Map>? manifest) { final String chosenName = _chooseVariant( keyName, configuration, manifest == null ? null : manifest[keyName], - ); + )!; final double chosenScale = _parseScale(chosenName); final AssetBundleImageKey key = AssetBundleImageKey( bundle: chosenBundle, @@ -200,17 +199,17 @@ class AssetImage extends AssetBundleImageProvider { result = SynchronousFuture(key); } } - ).catchError((dynamic error, StackTrace stack) { + ).catchError((Object error, StackTrace stack) { // We had an error. (This guarantees we weren't called synchronously.) // Forward the error to the caller. assert(completer != null); assert(result == null); - completer.completeError(error, stack); + completer!.completeError(error, stack); }); if (result != null) { // The code above ran synchronously, and came up with an answer. // Return the SynchronousFuture that we created above. - return result; + return result!; } // The code above hasn't yet run its "then" handler yet. Let's prepare a // completer for it to use when it does run. @@ -218,9 +217,9 @@ class AssetImage extends AssetBundleImageProvider { return completer.future; } - static Future>> _manifestParser(String jsonData) { + static Future>?> _manifestParser(String? jsonData) { if (jsonData == null) - return SynchronousFuture>>(null); + return SynchronousFuture>?>(null); // TODO(ianh): JSON decoding really shouldn't be on the main thread. final Map parsedJson = json.decode(jsonData) as Map; final Iterable keys = parsedJson.keys; @@ -228,10 +227,10 @@ class AssetImage extends AssetBundleImageProvider { Map>.fromIterables(keys, keys.map>((String key) => List.from(parsedJson[key] as List))); // TODO(ianh): convert that data structure to the right types. - return SynchronousFuture>>(parsedManifest); + return SynchronousFuture>?>(parsedManifest); } - String _chooseVariant(String main, ImageConfiguration config, List candidates) { + String? _chooseVariant(String main, ImageConfiguration config, List? candidates) { if (config.devicePixelRatio == null || candidates == null || candidates.isEmpty) return main; // TODO(ianh): Consider moving this parsing logic into _manifestParser. @@ -241,15 +240,15 @@ class AssetImage extends AssetBundleImageProvider { // TODO(ianh): implement support for config.locale, config.textDirection, // config.size, config.platform (then document this over in the Image.asset // docs) - return _findNearest(mapping, config.devicePixelRatio); + return _findNearest(mapping, config.devicePixelRatio!); } // Return the value for the key in a [SplayTreeMap] nearest the provided key. - String _findNearest(SplayTreeMap candidates, double value) { + String? _findNearest(SplayTreeMap candidates, double value) { if (candidates.containsKey(value)) - return candidates[value]; - final double lower = candidates.lastKeyBefore(value); - final double upper = candidates.firstKeyAfter(value); + return candidates[value]!; + final double? lower = candidates.lastKeyBefore(value); + final double? upper = candidates.firstKeyAfter(value); if (lower == null) return candidates[upper]; if (upper == null) @@ -273,9 +272,9 @@ class AssetImage extends AssetBundleImageProvider { directoryPath = assetUri.pathSegments[assetUri.pathSegments.length - 2]; } - final Match match = _extractRatioRegExp.firstMatch(directoryPath); + final Match? match = _extractRatioRegExp.firstMatch(directoryPath); if (match != null && match.groupCount > 0) - return double.parse(match.group(1)); + return double.parse(match.group(1)!); return _naturalResolution; // i.e. default to 1.0x } diff --git a/packages/flutter/lib/src/painting/matrix_utils.dart b/packages/flutter/lib/src/painting/matrix_utils.dart index 643a6a5cc1..2a3269576a 100644 --- a/packages/flutter/lib/src/painting/matrix_utils.dart +++ b/packages/flutter/lib/src/painting/matrix_utils.dart @@ -2,7 +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:typed_data'; @@ -22,7 +21,7 @@ class MatrixUtils { /// nothing but a 2D translation. /// /// Otherwise, returns null. - static Offset getAsTranslation(Matrix4 transform) { + static Offset? getAsTranslation(Matrix4 transform) { assert(transform != null); final Float64List values = transform.storage; // Values are stored in column-major order. @@ -49,7 +48,7 @@ class MatrixUtils { /// scale, if the matrix is nothing but a symmetric 2D scale transform. /// /// Otherwise, returns null. - static double getAsScale(Matrix4 transform) { + static double? getAsScale(Matrix4 transform) { assert(transform != null); final Float64List values = transform.storage; // Values are stored in column-major order. @@ -75,12 +74,12 @@ class MatrixUtils { /// Returns true if the given matrices are exactly equal, and false /// otherwise. Null values are assumed to be the identity matrix. - static bool matrixEquals(Matrix4 a, Matrix4 b) { + static bool matrixEquals(Matrix4? a, Matrix4? b) { if (identical(a, b)) return true; assert(a != null || b != null); if (a == null) - return isIdentity(b); + return isIdentity(b!); if (b == null) return isIdentity(a); assert(a != null && b != null); @@ -165,8 +164,6 @@ class MatrixUtils { storage[7] == 0.0 && storage[15] == 1.0; - _minMax ??= Float64List(4); - _accumulate(storage, rect.left, rect.top, true, isAffine); _accumulate(storage, rect.right, rect.top, false, isAffine); _accumulate(storage, rect.left, rect.bottom, false, isAffine); @@ -175,7 +172,7 @@ class MatrixUtils { return Rect.fromLTRB(_minMax[0], _minMax[1], _minMax[2], _minMax[3]); } - static Float64List _minMax; + static late final Float64List _minMax = Float64List(4); static void _accumulate(Float64List m, double x, double y, bool first, bool isAffine) { final double w = isAffine ? 1.0 : 1.0 / (m[3] * x + m[7] * y + m[15]); final double tx = (m[0] * x + m[4] * y + m[12]) * w; @@ -485,8 +482,8 @@ class MatrixUtils { /// almost always possible to end up seeing the inner side of the cylinder /// or the back side of the transformed plane before π / 2 when perspective > 0. static Matrix4 createCylindricalProjectionTransform({ - @required double radius, - @required double angle, + required double radius, + required double angle, double perspective = 0.001, Axis orientation = Axis.vertical, }) { @@ -541,7 +538,7 @@ class MatrixUtils { /// useful for [TransformProperty]. /// /// If the argument is null, returns a list with the single string "null". -List debugDescribeTransform(Matrix4 transform) { +List debugDescribeTransform(Matrix4? transform) { if (transform == null) return const ['null']; return [ @@ -559,9 +556,9 @@ class TransformProperty extends DiagnosticsProperty { /// The [showName] and [level] arguments must not be null. TransformProperty( String name, - Matrix4 value, { + Matrix4? value, { bool showName = true, - Object defaultValue = kNoDefaultValue, + Object? defaultValue = kNoDefaultValue, DiagnosticLevel level = DiagnosticLevel.info, }) : assert(showName != null), assert(level != null), @@ -574,15 +571,15 @@ class TransformProperty extends DiagnosticsProperty { ); @override - String valueToString({ TextTreeConfiguration parentConfiguration }) { + String valueToString({ TextTreeConfiguration? parentConfiguration }) { if (parentConfiguration != null && !parentConfiguration.lineBreakProperties) { // Format the value on a single line to be compatible with the parent's // style. final List values = [ - '${debugFormatDouble(value.entry(0, 0))},${debugFormatDouble(value.entry(0, 1))},${debugFormatDouble(value.entry(0, 2))},${debugFormatDouble(value.entry(0, 3))}', - '${debugFormatDouble(value.entry(1, 0))},${debugFormatDouble(value.entry(1, 1))},${debugFormatDouble(value.entry(1, 2))},${debugFormatDouble(value.entry(1, 3))}', - '${debugFormatDouble(value.entry(2, 0))},${debugFormatDouble(value.entry(2, 1))},${debugFormatDouble(value.entry(2, 2))},${debugFormatDouble(value.entry(2, 3))}', - '${debugFormatDouble(value.entry(3, 0))},${debugFormatDouble(value.entry(3, 1))},${debugFormatDouble(value.entry(3, 2))},${debugFormatDouble(value.entry(3, 3))}', + '${debugFormatDouble(value!.entry(0, 0))},${debugFormatDouble(value!.entry(0, 1))},${debugFormatDouble(value!.entry(0, 2))},${debugFormatDouble(value!.entry(0, 3))}', + '${debugFormatDouble(value!.entry(1, 0))},${debugFormatDouble(value!.entry(1, 1))},${debugFormatDouble(value!.entry(1, 2))},${debugFormatDouble(value!.entry(1, 3))}', + '${debugFormatDouble(value!.entry(2, 0))},${debugFormatDouble(value!.entry(2, 1))},${debugFormatDouble(value!.entry(2, 2))},${debugFormatDouble(value!.entry(2, 3))}', + '${debugFormatDouble(value!.entry(3, 0))},${debugFormatDouble(value!.entry(3, 1))},${debugFormatDouble(value!.entry(3, 2))},${debugFormatDouble(value!.entry(3, 3))}', ]; return '[${values.join('; ')}]'; } diff --git a/packages/flutter/lib/src/painting/rounded_rectangle_border.dart b/packages/flutter/lib/src/painting/rounded_rectangle_border.dart index 4cd14db796..8f99267250 100644 --- a/packages/flutter/lib/src/painting/rounded_rectangle_border.dart +++ b/packages/flutter/lib/src/painting/rounded_rectangle_border.dart @@ -2,7 +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:ui' as ui show lerpDouble; @@ -54,12 +53,12 @@ class RoundedRectangleBorder extends OutlinedBorder { } @override - ShapeBorder lerpFrom(ShapeBorder a, double t) { + ShapeBorder? lerpFrom(ShapeBorder? a, double t) { assert(t != null); if (a is RoundedRectangleBorder) { return RoundedRectangleBorder( side: BorderSide.lerp(a.side, side, t), - borderRadius: BorderRadiusGeometry.lerp(a.borderRadius, borderRadius, t), + borderRadius: BorderRadiusGeometry.lerp(a.borderRadius, borderRadius, t)!, ); } if (a is CircleBorder) { @@ -73,12 +72,12 @@ class RoundedRectangleBorder extends OutlinedBorder { } @override - ShapeBorder lerpTo(ShapeBorder b, double t) { + ShapeBorder? lerpTo(ShapeBorder? b, double t) { assert(t != null); if (b is RoundedRectangleBorder) { return RoundedRectangleBorder( side: BorderSide.lerp(side, b.side, t), - borderRadius: BorderRadiusGeometry.lerp(borderRadius, b.borderRadius, t), + borderRadius: BorderRadiusGeometry.lerp(borderRadius, b.borderRadius, t)!, ); } if (b is CircleBorder) { @@ -94,7 +93,7 @@ class RoundedRectangleBorder extends OutlinedBorder { /// Returns a copy of this RoundedRectangleBorder with the given fields /// replaced with the new values. @override - RoundedRectangleBorder copyWith({ BorderSide side, BorderRadius borderRadius }) { + RoundedRectangleBorder copyWith({ BorderSide? side, BorderRadius? borderRadius }) { return RoundedRectangleBorder( side: side ?? this.side, borderRadius: borderRadius ?? this.borderRadius, @@ -102,19 +101,19 @@ class RoundedRectangleBorder extends OutlinedBorder { } @override - Path getInnerPath(Rect rect, { TextDirection textDirection }) { + Path getInnerPath(Rect rect, { TextDirection? textDirection }) { return Path() ..addRRect(borderRadius.resolve(textDirection).toRRect(rect).deflate(side.width)); } @override - Path getOuterPath(Rect rect, { TextDirection textDirection }) { + Path getOuterPath(Rect rect, { TextDirection? textDirection }) { return Path() ..addRRect(borderRadius.resolve(textDirection).toRRect(rect)); } @override - void paint(Canvas canvas, Rect rect, { TextDirection textDirection }) { + void paint(Canvas canvas, Rect rect, { TextDirection? textDirection }) { switch (side.style) { case BorderStyle.none: break; @@ -154,7 +153,7 @@ class _RoundedRectangleToCircleBorder extends OutlinedBorder { const _RoundedRectangleToCircleBorder({ BorderSide side = BorderSide.none, this.borderRadius = BorderRadius.zero, - @required this.circleness, + required this.circleness, }) : assert(side != null), assert(borderRadius != null), assert(circleness != null), @@ -179,12 +178,12 @@ class _RoundedRectangleToCircleBorder extends OutlinedBorder { } @override - ShapeBorder lerpFrom(ShapeBorder a, double t) { + ShapeBorder? lerpFrom(ShapeBorder? a, double t) { assert(t != null); if (a is RoundedRectangleBorder) { return _RoundedRectangleToCircleBorder( side: BorderSide.lerp(a.side, side, t), - borderRadius: BorderRadiusGeometry.lerp(a.borderRadius, borderRadius, t), + borderRadius: BorderRadiusGeometry.lerp(a.borderRadius, borderRadius, t)!, circleness: circleness * t, ); } @@ -198,19 +197,19 @@ class _RoundedRectangleToCircleBorder extends OutlinedBorder { if (a is _RoundedRectangleToCircleBorder) { return _RoundedRectangleToCircleBorder( side: BorderSide.lerp(a.side, side, t), - borderRadius: BorderRadiusGeometry.lerp(a.borderRadius, borderRadius, t), - circleness: ui.lerpDouble(a.circleness, circleness, t), + borderRadius: BorderRadiusGeometry.lerp(a.borderRadius, borderRadius, t)!, + circleness: ui.lerpDouble(a.circleness, circleness, t)!, ); } return super.lerpFrom(a, t); } @override - ShapeBorder lerpTo(ShapeBorder b, double t) { + ShapeBorder? lerpTo(ShapeBorder? b, double t) { if (b is RoundedRectangleBorder) { return _RoundedRectangleToCircleBorder( side: BorderSide.lerp(side, b.side, t), - borderRadius: BorderRadiusGeometry.lerp(borderRadius, b.borderRadius, t), + borderRadius: BorderRadiusGeometry.lerp(borderRadius, b.borderRadius, t)!, circleness: circleness * (1.0 - t), ); } @@ -224,8 +223,8 @@ class _RoundedRectangleToCircleBorder extends OutlinedBorder { if (b is _RoundedRectangleToCircleBorder) { return _RoundedRectangleToCircleBorder( side: BorderSide.lerp(side, b.side, t), - borderRadius: BorderRadiusGeometry.lerp(borderRadius, b.borderRadius, t), - circleness: ui.lerpDouble(circleness, b.circleness, t), + borderRadius: BorderRadiusGeometry.lerp(borderRadius, b.borderRadius, t)!, + circleness: ui.lerpDouble(circleness, b.circleness, t)!, ); } return super.lerpTo(b, t); @@ -253,7 +252,7 @@ class _RoundedRectangleToCircleBorder extends OutlinedBorder { } } - BorderRadius _adjustBorderRadius(Rect rect, TextDirection textDirection) { + BorderRadius? _adjustBorderRadius(Rect rect, TextDirection? textDirection) { final BorderRadius resolvedRadius = borderRadius.resolve(textDirection); if (circleness == 0.0) return resolvedRadius; @@ -261,19 +260,19 @@ class _RoundedRectangleToCircleBorder extends OutlinedBorder { } @override - Path getInnerPath(Rect rect, { TextDirection textDirection }) { + Path getInnerPath(Rect rect, { TextDirection? textDirection }) { return Path() - ..addRRect(_adjustBorderRadius(rect, textDirection).toRRect(_adjustRect(rect)).deflate(side.width)); + ..addRRect(_adjustBorderRadius(rect, textDirection)!.toRRect(_adjustRect(rect)).deflate(side.width)); } @override - Path getOuterPath(Rect rect, { TextDirection textDirection }) { + Path getOuterPath(Rect rect, { TextDirection? textDirection }) { return Path() - ..addRRect(_adjustBorderRadius(rect, textDirection).toRRect(_adjustRect(rect))); + ..addRRect(_adjustBorderRadius(rect, textDirection)!.toRRect(_adjustRect(rect))); } @override - _RoundedRectangleToCircleBorder copyWith({ BorderSide side, BorderRadius borderRadius, double circleness }) { + _RoundedRectangleToCircleBorder copyWith({ BorderSide? side, BorderRadius? borderRadius, double? circleness }) { return _RoundedRectangleToCircleBorder( side: side ?? this.side, borderRadius: borderRadius ?? this.borderRadius, @@ -282,16 +281,16 @@ class _RoundedRectangleToCircleBorder extends OutlinedBorder { } @override - void paint(Canvas canvas, Rect rect, { TextDirection textDirection }) { + void paint(Canvas canvas, Rect rect, { TextDirection? textDirection }) { switch (side.style) { case BorderStyle.none: break; case BorderStyle.solid: final double width = side.width; if (width == 0.0) { - canvas.drawRRect(_adjustBorderRadius(rect, textDirection).toRRect(_adjustRect(rect)), side.toPaint()); + canvas.drawRRect(_adjustBorderRadius(rect, textDirection)!.toRRect(_adjustRect(rect)), side.toPaint()); } else { - final RRect outer = _adjustBorderRadius(rect, textDirection).toRRect(_adjustRect(rect)); + final RRect outer = _adjustBorderRadius(rect, textDirection)!.toRRect(_adjustRect(rect)); final RRect inner = outer.deflate(width); final Paint paint = Paint() ..color = side.color; diff --git a/packages/flutter/lib/src/painting/shape_decoration.dart b/packages/flutter/lib/src/painting/shape_decoration.dart index 5138248d4a..719fc766f0 100644 --- a/packages/flutter/lib/src/painting/shape_decoration.dart +++ b/packages/flutter/lib/src/painting/shape_decoration.dart @@ -2,7 +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'; @@ -77,7 +76,7 @@ class ShapeDecoration extends Decoration { this.image, this.gradient, this.shadows, - @required this.shape, + required this.shape, }) : assert(!(color != null && gradient != null)), assert(shape != null); @@ -97,18 +96,18 @@ class ShapeDecoration extends Decoration { switch (source.shape) { case BoxShape.circle: if (source.border != null) { - assert(source.border.isUniform); - shape = CircleBorder(side: source.border.top); + assert(source.border!.isUniform); + shape = CircleBorder(side: source.border!.top); } else { shape = const CircleBorder(); } break; case BoxShape.rectangle: if (source.borderRadius != null) { - assert(source.border == null || source.border.isUniform); + assert(source.border == null || source.border!.isUniform); shape = RoundedRectangleBorder( side: source.border?.top ?? BorderSide.none, - borderRadius: source.borderRadius, + borderRadius: source.borderRadius!, ); } else { shape = source.border ?? const Border(); @@ -134,19 +133,19 @@ class ShapeDecoration extends Decoration { /// The color is under the [image]. /// /// If a [gradient] is specified, [color] must be null. - final Color color; + final Color? color; /// A gradient to use when filling the shape. /// /// The gradient is under the [image]. /// /// If a [color] is specified, [gradient] must be null. - final Gradient gradient; + final Gradient? gradient; /// An image to paint inside the shape (clipped to its outline). /// /// The image is drawn over the [color] or [gradient]. - final DecorationImage image; + final DecorationImage? image; /// A list of shadows cast by the [shape]. /// @@ -155,7 +154,7 @@ class ShapeDecoration extends Decoration { /// * [kElevationToShadow], for some predefined shadows used in Material /// Design. /// * [PhysicalModel], a widget for showing shadows. - final List shadows; + final List? shadows; /// The shape to fill the [color], [gradient], and [image] into and to cast as /// the [shadows]. @@ -191,23 +190,23 @@ class ShapeDecoration extends Decoration { bool get isComplex => shadows != null; @override - ShapeDecoration lerpFrom(Decoration a, double t) { + ShapeDecoration? lerpFrom(Decoration? a, double t) { if (a is BoxDecoration) { return ShapeDecoration.lerp(ShapeDecoration.fromBoxDecoration(a), this, t); } else if (a == null || a is ShapeDecoration) { return ShapeDecoration.lerp(a as ShapeDecoration, this, t); } - return super.lerpFrom(a, t) as ShapeDecoration; + return super.lerpFrom(a, t) as ShapeDecoration?; } @override - ShapeDecoration lerpTo(Decoration b, double t) { + ShapeDecoration? lerpTo(Decoration? b, double t) { if (b is BoxDecoration) { return ShapeDecoration.lerp(this, ShapeDecoration.fromBoxDecoration(b), t); } else if (b == null || b is ShapeDecoration) { return ShapeDecoration.lerp(this, b as ShapeDecoration, t); } - return super.lerpTo(b, t) as ShapeDecoration; + return super.lerpTo(b, t) as ShapeDecoration?; } /// Linearly interpolate between two shapes. @@ -228,7 +227,7 @@ class ShapeDecoration extends Decoration { /// * [lerpFrom] and [lerpTo], which are used to implement [Decoration.lerp] /// and which use [ShapeDecoration.lerp] when interpolating two /// [ShapeDecoration]s or a [ShapeDecoration] to or from null. - static ShapeDecoration lerp(ShapeDecoration a, ShapeDecoration b, double t) { + static ShapeDecoration? lerp(ShapeDecoration? a, ShapeDecoration? b, double t) { assert(t != null); if (a == null && b == null) return null; @@ -241,9 +240,9 @@ class ShapeDecoration extends Decoration { return ShapeDecoration( color: Color.lerp(a?.color, b?.color, t), gradient: Gradient.lerp(a?.gradient, b?.gradient, t), - image: t < 0.5 ? a.image : b.image, // TODO(ianh): cross-fade the image + image: t < 0.5 ? a!.image : b!.image, // TODO(ianh): cross-fade the image shadows: BoxShadow.lerpList(a?.shadows, b?.shadows, t), - shape: ShapeBorder.lerp(a?.shape, b?.shape, t), + shape: ShapeBorder.lerp(a?.shape, b?.shape, t)!, ); } @@ -284,14 +283,14 @@ class ShapeDecoration extends Decoration { } @override - bool hitTest(Size size, Offset position, { TextDirection textDirection }) { + bool hitTest(Size size, Offset position, { TextDirection? textDirection }) { return shape.getOuterPath(Offset.zero & size, textDirection: textDirection).contains(position); } @override - _ShapeDecorationPainter createBoxPainter([ VoidCallback onChanged ]) { + _ShapeDecorationPainter createBoxPainter([ VoidCallback? onChanged ]) { assert(onChanged != null || image == null); - return _ShapeDecorationPainter(this, onChanged); + return _ShapeDecorationPainter(this, onChanged!); } } @@ -303,16 +302,19 @@ class _ShapeDecorationPainter extends BoxPainter { final ShapeDecoration _decoration; - Rect _lastRect; - TextDirection _lastTextDirection; - Path _outerPath; - Path _innerPath; - Paint _interiorPaint; - int _shadowCount; - List _shadowPaths; - List _shadowPaints; + Rect? _lastRect; + TextDirection? _lastTextDirection; + late Path _outerPath; + Path? _innerPath; + Paint? _interiorPaint; + int? _shadowCount; + late List _shadowPaths; + late List _shadowPaints; - void _precache(Rect rect, TextDirection textDirection) { + @override + VoidCallback get onChanged => super.onChanged!; + + void _precache(Rect rect, TextDirection? textDirection) { assert(rect != null); if (rect == _lastRect && textDirection == _lastTextDirection) return; @@ -324,22 +326,22 @@ class _ShapeDecorationPainter extends BoxPainter { if (_interiorPaint == null && (_decoration.color != null || _decoration.gradient != null)) { _interiorPaint = Paint(); if (_decoration.color != null) - _interiorPaint.color = _decoration.color; + _interiorPaint!.color = _decoration.color!; } if (_decoration.gradient != null) - _interiorPaint.shader = _decoration.gradient.createShader(rect); + _interiorPaint!.shader = _decoration.gradient!.createShader(rect); if (_decoration.shadows != null) { if (_shadowCount == null) { - _shadowCount = _decoration.shadows.length; - _shadowPaths = List(_shadowCount); - _shadowPaints = List(_shadowCount); - for (int index = 0; index < _shadowCount; index += 1) - _shadowPaints[index] = _decoration.shadows[index].toPaint(); - } - for (int index = 0; index < _shadowCount; index += 1) { - final BoxShadow shadow = _decoration.shadows[index]; - _shadowPaths[index] = _decoration.shape.getOuterPath(rect.shift(shadow.offset).inflate(shadow.spreadRadius), textDirection: textDirection); + _shadowCount = _decoration.shadows!.length; + _shadowPaints = [ + ..._decoration.shadows!.map((BoxShadow shadow) => shadow.toPaint()), + ]; } + _shadowPaths = [ + ..._decoration.shadows!.map((BoxShadow shadow) { + return _decoration.shape.getOuterPath(rect.shift(shadow.offset).inflate(shadow.spreadRadius), textDirection: textDirection); + }), + ]; } if (_interiorPaint != null || _shadowCount != null) _outerPath = _decoration.shape.getOuterPath(rect, textDirection: textDirection); @@ -352,22 +354,22 @@ class _ShapeDecorationPainter extends BoxPainter { void _paintShadows(Canvas canvas) { if (_shadowCount != null) { - for (int index = 0; index < _shadowCount; index += 1) + for (int index = 0; index < _shadowCount!; index += 1) canvas.drawPath(_shadowPaths[index], _shadowPaints[index]); } } void _paintInterior(Canvas canvas) { if (_interiorPaint != null) - canvas.drawPath(_outerPath, _interiorPaint); + canvas.drawPath(_outerPath, _interiorPaint!); } - DecorationImagePainter _imagePainter; + DecorationImagePainter? _imagePainter; void _paintImage(Canvas canvas, ImageConfiguration configuration) { if (_decoration.image == null) return; - _imagePainter ??= _decoration.image.createPainter(onChanged); - _imagePainter.paint(canvas, _lastRect, _innerPath, configuration); + _imagePainter ??= _decoration.image!.createPainter(onChanged); + _imagePainter!.paint(canvas, _lastRect!, _innerPath, configuration); } @override @@ -380,8 +382,8 @@ class _ShapeDecorationPainter extends BoxPainter { void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) { assert(configuration != null); assert(configuration.size != null); - final Rect rect = offset & configuration.size; - final TextDirection textDirection = configuration.textDirection; + final Rect rect = offset & configuration.size!; + final TextDirection? textDirection = configuration.textDirection; _precache(rect, textDirection); _paintShadows(canvas); _paintInterior(canvas);