diff --git a/null_safety/null_safe_app/analysis_options.yaml b/null_safety/null_safe_app/analysis_options.yaml new file mode 100644 index 000000000..85f6fbe91 --- /dev/null +++ b/null_safety/null_safe_app/analysis_options.yaml @@ -0,0 +1,19 @@ +include: package:flutter_lints/flutter.yaml + +analyzer: + strong-mode: + implicit-casts: false + implicit-dynamic: false + +linter: + rules: + avoid_types_on_closure_parameters: true + avoid_void_async: true + cancel_subscriptions: true + close_sinks: true + directives_ordering: true + package_api_docs: true + package_prefixed_library_names: true + test_types_in_equals: true + throw_in_finally: true + unnecessary_statements: true diff --git a/null_safety/null_safe_app/lib/badapp.dart b/null_safety/null_safe_app/lib/badapp.dart index 311a5b450..74b74033e 100644 --- a/null_safety/null_safe_app/lib/badapp.dart +++ b/null_safety/null_safe_app/lib/badapp.dart @@ -12,13 +12,15 @@ import 'services.dart'; // uncomment the for-loop and appBar lines below, and note how the new null // safety static analysis immediately flags those lines as errors. class BadMyApp extends StatelessWidget { + const BadMyApp({Key? key}) : super(key: key); + @override Widget build(BuildContext context) { final localizedAppName = Config.getAppName(); final temperatures = WeatherService.getTemperatures(); var tempWidgets = [ - Text('Temperature next 3 days:'), + const Text('Temperature next 3 days:'), // for (final t in temperatures) Text(t.round().toString()), ]; diff --git a/null_safety/null_safe_app/lib/goodapp.dart b/null_safety/null_safe_app/lib/goodapp.dart index 6f402b0e6..95bf43b4f 100644 --- a/null_safety/null_safe_app/lib/goodapp.dart +++ b/null_safety/null_safe_app/lib/goodapp.dart @@ -7,6 +7,8 @@ import 'package:flutter/material.dart'; import 'services.dart'; class GoodMyApp extends StatelessWidget { + const GoodMyApp({Key? key}) : super(key: key); + @override Widget build(BuildContext context) { final localizedAppName = Config.getAppName(); @@ -14,13 +16,13 @@ class GoodMyApp extends StatelessWidget { List tempWidgets; if (temperatures == null) { - tempWidgets = [Text('Temperature: Failed getting forecast :-(')]; + tempWidgets = [const Text('Temperature: Failed getting forecast :-(')]; } else { // Null safety uses flow analysis. The code checked for null in the branch // above, so in this branch it known that temperatures cannot be null. // Notice how we access temperatures without getting an analysis error. tempWidgets = [ - Text('Temperature next 3 days:'), + const Text('Temperature next 3 days:'), for (final t in temperatures) // We first use the conditional member access operator to only call // round() and toString() if t isn't null. We then test if that diff --git a/null_safety/null_safe_app/lib/main.dart b/null_safety/null_safe_app/lib/main.dart index fe21d40bb..47779a239 100644 --- a/null_safety/null_safe_app/lib/main.dart +++ b/null_safety/null_safe_app/lib/main.dart @@ -7,5 +7,5 @@ import 'package:flutter/material.dart'; import 'goodapp.dart'; void main() { - runApp(GoodMyApp()); + runApp(const GoodMyApp()); } diff --git a/null_safety/null_safe_app/pubspec.lock b/null_safety/null_safe_app/pubspec.lock index 24f6abb8e..5b6ba236d 100644 --- a/null_safety/null_safe_app/pubspec.lock +++ b/null_safety/null_safe_app/pubspec.lock @@ -62,11 +62,25 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + lints: + dependency: transitive + description: + name: lints + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" matcher: dependency: transitive description: diff --git a/null_safety/null_safe_app/pubspec.yaml b/null_safety/null_safe_app/pubspec.yaml index 51614b2d2..31eb5277b 100644 --- a/null_safety/null_safe_app/pubspec.yaml +++ b/null_safety/null_safe_app/pubspec.yaml @@ -1,6 +1,6 @@ name: null_safe_app description: A new Flutter project. -publish_to: 'none' # Do not publish apps & package using the null safety experiment. +publish_to: "none" # Do not publish apps & package using the null safety experiment. version: 1.2.0 environment: @@ -15,6 +15,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + flutter_lints: ^1.0.0 flutter: uses-material-design: true diff --git a/null_safety/null_safe_app/test/widget_test.dart b/null_safety/null_safe_app/test/widget_test.dart index d808a7b1b..bc33d3f09 100644 --- a/null_safety/null_safe_app/test/widget_test.dart +++ b/null_safety/null_safe_app/test/widget_test.dart @@ -4,9 +4,9 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:null_safe_app/goodapp.dart'; void main() { - testWidgets('App smoke test', (WidgetTester tester) async { + testWidgets('App smoke test', (tester) async { // Build our app and trigger a frame. - await tester.pumpWidget(GoodMyApp()); + await tester.pumpWidget(const GoodMyApp()); // Verify that we have a forecast, or a managed failure. expect(find.textContaining('Temperature'), findsOneWidget); diff --git a/null_safety/null_unsafe_app/analysis_options.yaml b/null_safety/null_unsafe_app/analysis_options.yaml new file mode 100644 index 000000000..85f6fbe91 --- /dev/null +++ b/null_safety/null_unsafe_app/analysis_options.yaml @@ -0,0 +1,19 @@ +include: package:flutter_lints/flutter.yaml + +analyzer: + strong-mode: + implicit-casts: false + implicit-dynamic: false + +linter: + rules: + avoid_types_on_closure_parameters: true + avoid_void_async: true + cancel_subscriptions: true + close_sinks: true + directives_ordering: true + package_api_docs: true + package_prefixed_library_names: true + test_types_in_equals: true + throw_in_finally: true + unnecessary_statements: true diff --git a/null_safety/null_unsafe_app/lib/main.dart b/null_safety/null_unsafe_app/lib/main.dart index 908ed9757..002f3f536 100644 --- a/null_safety/null_unsafe_app/lib/main.dart +++ b/null_safety/null_unsafe_app/lib/main.dart @@ -5,13 +5,15 @@ import 'package:flutter/material.dart'; void main() { - runApp(MyApp()); + runApp(const MyApp()); } // This app simulates possible null errors. Try running it and see if it fails. // You can then try to hot reload a few times; you should see it occasionally // failing and occasionally succeeding. class MyApp extends StatelessWidget { + const MyApp({Key key}) : super(key: key); + @override Widget build(BuildContext context) { // Get data from services. Note: in a real application, @@ -28,7 +30,7 @@ class MyApp extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('Temperature next 3 days:'), + const Text('Temperature next 3 days:'), for (final t in temperatures) Text(t.round().toString()), ], ), diff --git a/null_safety/null_unsafe_app/pubspec.lock b/null_safety/null_unsafe_app/pubspec.lock index 628ebe4e0..2c85bc0f8 100644 --- a/null_safety/null_unsafe_app/pubspec.lock +++ b/null_safety/null_unsafe_app/pubspec.lock @@ -62,11 +62,25 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + lints: + dependency: transitive + description: + name: lints + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" matcher: dependency: transitive description: diff --git a/null_safety/null_unsafe_app/pubspec.yaml b/null_safety/null_unsafe_app/pubspec.yaml index fad88d676..30df791f7 100644 --- a/null_safety/null_unsafe_app/pubspec.yaml +++ b/null_safety/null_unsafe_app/pubspec.yaml @@ -1,6 +1,6 @@ name: null_unsafe_app description: A new Flutter project. -publish_to: 'none' # Remove this line if you wish to publish to pub.dev +publish_to: "none" # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: @@ -14,5 +14,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + flutter_lints: ^1.0.0 + flutter: uses-material-design: true diff --git a/null_safety/null_unsafe_app/test/widget_test.dart b/null_safety/null_unsafe_app/test/widget_test.dart index 8c65b0917..331b1aa14 100644 --- a/null_safety/null_unsafe_app/test/widget_test.dart +++ b/null_safety/null_unsafe_app/test/widget_test.dart @@ -8,8 +8,7 @@ import 'package:flutter_test/flutter_test.dart'; void main() { - testWidgets('Rendering the page throws an exception', - (WidgetTester tester) async { + testWidgets('Rendering the page throws an exception', (tester) async { // Do nothing, running the app throws an exception on widget render. }); }