diff --git a/mdc_100_series/lib/app.dart b/mdc_100_series/lib/app.dart index e46448369f..a539966f49 100644 --- a/mdc_100_series/lib/app.dart +++ b/mdc_100_series/lib/app.dart @@ -35,7 +35,7 @@ class ShrineApp extends StatelessWidget { ); } - Route _getRoute(RouteSettings settings) { + Route? _getRoute(RouteSettings settings) { if (settings.name != '/login') { return null; } diff --git a/mdc_100_series/lib/model/product.dart b/mdc_100_series/lib/model/product.dart index 5df0ad197b..10644f0431 100755 --- a/mdc_100_series/lib/model/product.dart +++ b/mdc_100_series/lib/model/product.dart @@ -12,22 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -import 'package:flutter/foundation.dart'; - enum Category { all, accessories, clothing, home, } class Product { const Product({ - @required this.category, - @required this.id, - @required this.isFeatured, - @required this.name, - @required this.price, - }) : assert(category != null), - assert(id != null), - assert(isFeatured != null), - assert(name != null), - assert(price != null); + required this.category, + required this.id, + required this.isFeatured, + required this.name, + required this.price, + }); final Category category; final int id; diff --git a/mdc_100_series/lib/supplemental/asymmetric_view.dart b/mdc_100_series/lib/supplemental/asymmetric_view.dart index 6b5be2be47..39895e9ebc 100644 --- a/mdc_100_series/lib/supplemental/asymmetric_view.dart +++ b/mdc_100_series/lib/supplemental/asymmetric_view.dart @@ -20,10 +20,10 @@ import 'product_columns.dart'; class AsymmetricView extends StatelessWidget { final List products; - AsymmetricView({Key key, this.products}); + AsymmetricView({Key? key, required this.products}); List _buildColumns(BuildContext context) { - if (products == null || products.isEmpty) { + if (products.isEmpty) { return []; } diff --git a/mdc_100_series/lib/supplemental/cut_corners_border.dart b/mdc_100_series/lib/supplemental/cut_corners_border.dart index 6837a09922..097930252e 100644 --- a/mdc_100_series/lib/supplemental/cut_corners_border.dart +++ b/mdc_100_series/lib/supplemental/cut_corners_border.dart @@ -19,10 +19,10 @@ import 'package:flutter/widgets.dart'; class CutCornersBorder extends OutlineInputBorder { const CutCornersBorder({ - BorderSide borderSide: const BorderSide(), - BorderRadius borderRadius: const BorderRadius.all(Radius.circular(2.0)), - this.cut: 7.0, - double gapPadding: 2.0, + BorderSide borderSide = const BorderSide(), + BorderRadius borderRadius = const BorderRadius.all(Radius.circular(2.0)), + this.cut = 7.0, + double gapPadding = 2.0, }) : super( borderSide: borderSide, borderRadius: borderRadius, @@ -30,10 +30,10 @@ class CutCornersBorder extends OutlineInputBorder { @override CutCornersBorder copyWith({ - BorderSide borderSide, - BorderRadius borderRadius, - double gapPadding, - double cut, + BorderSide? borderSide, + BorderRadius? borderRadius, + double? gapPadding, + double? cut, }) { return CutCornersBorder( borderRadius: borderRadius ?? this.borderRadius, @@ -46,11 +46,11 @@ class CutCornersBorder extends OutlineInputBorder { final double cut; @override - ShapeBorder lerpFrom(ShapeBorder a, double t) { + ShapeBorder? lerpFrom(ShapeBorder? a, double t) { if (a is CutCornersBorder) { final CutCornersBorder outline = a; return CutCornersBorder( - borderRadius: BorderRadius.lerp(outline.borderRadius, borderRadius, t), + borderRadius: BorderRadius.lerp(outline.borderRadius, borderRadius, t)!, borderSide: BorderSide.lerp(outline.borderSide, borderSide, t), cut: cut, gapPadding: outline.gapPadding, @@ -60,11 +60,11 @@ class CutCornersBorder extends OutlineInputBorder { } @override - ShapeBorder lerpTo(ShapeBorder b, double t) { + ShapeBorder? lerpTo(ShapeBorder? b, double t) { if (b is CutCornersBorder) { final CutCornersBorder outline = b; return CutCornersBorder( - borderRadius: BorderRadius.lerp(borderRadius, outline.borderRadius, t), + borderRadius: BorderRadius.lerp(borderRadius, outline.borderRadius, t)!, borderSide: BorderSide.lerp(borderSide, outline.borderSide, t), cut: cut, gapPadding: outline.gapPadding, @@ -103,12 +103,11 @@ class CutCornersBorder extends OutlineInputBorder { void paint( Canvas canvas, Rect rect, { - double gapStart, + double? gapStart, double gapExtent: 0.0, double gapPercentage: 0.0, - TextDirection textDirection, + TextDirection? textDirection, }) { - assert(gapExtent != null); assert(gapPercentage >= 0.0 && gapPercentage <= 1.0); final Paint paint = borderSide.toPaint(); @@ -117,8 +116,8 @@ class CutCornersBorder extends OutlineInputBorder { canvas.drawPath(_notchedCornerPath(outer.middleRect), paint); } else { final double extent = - lerpDouble(0.0, gapExtent + gapPadding * 2.0, gapPercentage); - switch (textDirection) { + lerpDouble(0.0, gapExtent + gapPadding * 2.0, gapPercentage)!; + switch (textDirection!) { case TextDirection.rtl: { final Path path = _notchedCornerPath( diff --git a/mdc_100_series/lib/supplemental/product_card.dart b/mdc_100_series/lib/supplemental/product_card.dart index a062a38a2a..a8ebbc420d 100644 --- a/mdc_100_series/lib/supplemental/product_card.dart +++ b/mdc_100_series/lib/supplemental/product_card.dart @@ -18,8 +18,8 @@ import 'package:intl/intl.dart'; import '../model/product.dart'; class ProductCard extends StatelessWidget { - ProductCard({this.imageAspectRatio: 33 / 49, this.product}) - : assert(imageAspectRatio == null || imageAspectRatio > 0); + ProductCard({this.imageAspectRatio = 33 / 49, required this.product}) + : assert(imageAspectRatio > 0); final double imageAspectRatio; final Product product; @@ -54,7 +54,7 @@ class ProductCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - product == null ? '' : product.name, + product.name, style: theme.textTheme.headline6, softWrap: false, overflow: TextOverflow.ellipsis, @@ -62,7 +62,7 @@ class ProductCard extends StatelessWidget { ), SizedBox(height: 4.0), Text( - product == null ? '' : formatter.format(product.price), + formatter.format(product.price), style: theme.textTheme.subtitle2, ), ], diff --git a/mdc_100_series/lib/supplemental/product_columns.dart b/mdc_100_series/lib/supplemental/product_columns.dart index ad6be75006..29351328bc 100644 --- a/mdc_100_series/lib/supplemental/product_columns.dart +++ b/mdc_100_series/lib/supplemental/product_columns.dart @@ -19,11 +19,12 @@ import 'product_card.dart'; class TwoProductCardColumn extends StatelessWidget { TwoProductCardColumn({ - this.bottom, + required this.bottom, this.top, - }) : assert(bottom != null); + }); - final Product bottom, top; + final Product bottom; + final Product? top; @override Widget build(BuildContext context) { @@ -46,7 +47,7 @@ class TwoProductCardColumn extends StatelessWidget { child: top != null ? ProductCard( imageAspectRatio: imageAspectRatio, - product: top, + product: top!, ) : SizedBox( height: heightOfCards, @@ -67,7 +68,7 @@ class TwoProductCardColumn extends StatelessWidget { } class OneProductCardColumn extends StatelessWidget { - OneProductCardColumn({this.product}); + OneProductCardColumn({required this.product}); final Product product; diff --git a/mdc_100_series/pubspec.yaml b/mdc_100_series/pubspec.yaml index e95db02cdd..19ceba4a66 100644 --- a/mdc_100_series/pubspec.yaml +++ b/mdc_100_series/pubspec.yaml @@ -1,10 +1,13 @@ name: Shrine description: Learn how to use Material for structure and layout. +environment: + sdk: '>=2.12.0-0 <3.0.0' + dependencies: flutter: sdk: flutter - intl: ^0.15.6 + intl: ^0.17.0-nullsafety.2 cupertino_icons: ^0.1.0 shrine_images: 1.1.1