From 707fb35b0c41ee24b053bf4512b2fd8c4b764c8c Mon Sep 17 00:00:00 2001 From: Michael Klimushyn Date: Thu, 7 Nov 2019 11:04:55 -0800 Subject: [PATCH] [all] Switch to pedantic lint package Our `analysis_options.yaml` was supposed to be a mirror of flutter/flutter but had fallen out of date. This will be an easier way to keep it standardized and synced. This also required fixing all the lint errors brought in by that lint package. Most of them were missing `await`s. --- analysis_options.yaml | 140 +----------------- .../test_driver/android_intent_e2e.dart | 3 +- .../test_driver/android_intent_e2e_test.dart | 2 +- .../test/android_intent_test.dart | 6 +- packages/battery/example/lib/main.dart | 2 +- .../example/test_driver/camera_e2e.dart | 2 +- .../example/test_driver/camera_e2e_test.dart | 2 +- packages/camera/lib/camera.dart | 2 +- packages/connectivity/example/lib/main.dart | 2 +- .../test/connectivity_e2e_test.dart | 2 +- .../test_driver/device_info_e2e_test.dart | 2 +- packages/e2e/README.md | 4 +- .../example/test_driver/example_e2e_test.dart | 2 +- .../example/lib/marker_icons.dart | 2 +- .../example/test_driver/google_maps_test.dart | 2 +- .../lib/src/google_map.dart | 10 +- packages/google_sign_in/example/lib/main.dart | 2 +- .../in_app_purchase/analysis_options.yaml | 3 - .../in_app_purchase/example/lib/main.dart | 22 +-- .../test/in_app_purchase_e2e_test.dart | 2 +- .../purchase_wrapper.dart | 3 +- .../sku_details_wrapper.dart | 6 + .../in_app_purchase/app_store_connection.dart | 2 +- .../google_play_connection.dart | 8 +- .../in_app_purchase_connection.dart | 2 +- .../src/in_app_purchase/product_details.dart | 8 +- .../src/in_app_purchase/purchase_details.dart | 4 +- .../sk_payment_queue_wrapper.dart | 2 +- .../test_driver/package_info_e2e_test.dart | 2 +- packages/package_info/lib/package_info.dart | 5 +- packages/package_info/pubspec.yaml | 1 + .../test_driver/path_provider_test.dart | 2 +- .../test_driver/quick_actions_e2e_test.dart | 2 +- .../test_driver/test/sensors_e2e_test.dart | 2 +- .../test_driver/test/share_e2e_test.dart | 2 +- packages/share/test/share_test.dart | 2 +- .../shared_preferences/example/lib/main.dart | 5 +- .../test_driver/shared_preferences_e2e.dart | 24 +-- .../shared_preferences_e2e_test.dart | 2 +- .../test/shared_preferences_test.dart | 13 +- .../test_driver/url_launcher_e2e_test.dart | 2 +- packages/video_player/lib/video_player.dart | 2 +- .../webview_flutter/example/lib/main.dart | 8 +- .../test_driver/webview_flutter_e2e_test.dart | 2 +- .../webview_flutter/lib/webview_flutter.dart | 5 +- .../test/webview_flutter_test.dart | 22 +-- pubspec.yaml | 6 + 47 files changed, 115 insertions(+), 243 deletions(-) delete mode 100644 packages/in_app_purchase/analysis_options.yaml create mode 100644 pubspec.yaml diff --git a/analysis_options.yaml b/analysis_options.yaml index a73c3a63e1bb..484eb13ae0ca 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,140 +1,4 @@ -# Specify analysis options. -# -# Until there are meta linter rules, each desired lint must be explicitly enabled. -# See: https://github.com/dart-lang/linter/issues/288 -# -# For a list of lints, see: http://dart-lang.github.io/linter/lints/ -# See the configuration guide for more -# https://github.com/dart-lang/sdk/tree/master/pkg/analyzer#configuring-the-analyzer -# -# NOTE: Please keep this file in sync with -# https://github.com/flutter/flutter/blob/master/analysis_options.yaml - +include: package:pedantic/analysis_options.yaml analyzer: - language: - enableStrictCallChecks: true - enableSuperMixins: true - enableAssertInitializer: true - strong-mode: - implicit-dynamic: false - errors: - # treat missing required parameters as a warning (not a hint) - missing_required_param: warning - # treat missing returns as a warning (not a hint) - missing_return: warning - # allow having TODOs in the code - todo: ignore exclude: - - 'bin/cache/**' - # the following two are relative to the stocks example and the flutter package respectively - # see https://github.com/dart-lang/sdk/issues/28463 - - 'lib/i18n/stock_messages_*.dart' - - 'lib/src/http/**' - -linter: - rules: - # these rules are documented on and in the same order as - # the Dart Lint rules page to make maintenance easier - # http://dart-lang.github.io/linter/lints/ - - # === error rules === - - avoid_empty_else - - avoid_slow_async_io - - cancel_subscriptions - # - close_sinks # https://github.com/flutter/flutter/issues/5789 - # - comment_references # blocked on https://github.com/dart-lang/dartdoc/issues/1153 - - control_flow_in_finally - - empty_statements - - hash_and_equals - # - invariant_booleans # https://github.com/flutter/flutter/issues/5790 - - iterable_contains_unrelated_type - - list_remove_unrelated_type - # - literal_only_boolean_expressions # https://github.com/flutter/flutter/issues/5791 - - no_adjacent_strings_in_list - - no_duplicate_case_values - - test_types_in_equals - - throw_in_finally - - unrelated_type_equality_checks - - valid_regexps - - # === style rules === - - always_declare_return_types - # - always_put_control_body_on_new_line - - always_require_non_null_named_parameters - - always_specify_types - - annotate_overrides - # - avoid_annotating_with_dynamic # not yet tested - - avoid_as - # - avoid_catches_without_on_clauses # not yet tested - # - avoid_catching_errors # not yet tested - # - avoid_classes_with_only_static_members # not yet tested - # - avoid_function_literals_in_foreach_calls # not yet tested - - avoid_init_to_null - - avoid_null_checks_in_equality_operators - # - avoid_positional_boolean_parameters # not yet tested - - avoid_return_types_on_setters - # - avoid_returning_null # not yet tested - # - avoid_returning_this # not yet tested - # - avoid_setters_without_getters # not yet tested - # - avoid_types_on_closure_parameters # not yet tested - - await_only_futures - - camel_case_types - # - cascade_invocations # not yet tested - # - constant_identifier_names # https://github.com/dart-lang/linter/issues/204 - - directives_ordering - - empty_catches - - empty_constructor_bodies - - implementation_imports - # - join_return_with_assignment # not yet tested - - library_names - - library_prefixes - - non_constant_identifier_names - # - omit_local_variable_types # opposite of always_specify_types - # - one_member_abstracts # too many false positives - # - only_throw_errors # https://github.com/flutter/flutter/issues/5792 - - overridden_fields - - package_api_docs - - package_prefixed_library_names - # - parameter_assignments # we do this commonly - - prefer_adjacent_string_concatenation - - prefer_collection_literals - # - prefer_conditional_assignment # not yet tested - - prefer_const_constructors - # - prefer_constructors_over_static_methods # not yet tested - - prefer_contains - - prefer_equal_for_default_values - # - prefer_expression_function_bodies # conflicts with https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#consider-using--for-short-functions-and-methods - # - prefer_final_fields # https://github.com/dart-lang/linter/issues/506 - - prefer_final_locals - # - prefer_foreach # not yet tested - # - prefer_function_declarations_over_variables # not yet tested - - prefer_initializing_formals - # - prefer_interpolation_to_compose_strings # not yet tested - - prefer_is_empty - - prefer_is_not_empty - - prefer_void_to_null - # - recursive_getters # https://github.com/dart-lang/linter/issues/452 - - slash_for_doc_comments - - sort_constructors_first - - sort_unnamed_constructors_first - - super_goes_last - # - type_annotate_public_apis # subset of always_specify_types - - type_init_formals - # - unawaited_futures # https://github.com/flutter/flutter/issues/5793 - - unnecessary_brace_in_string_interps - - unnecessary_const - - unnecessary_getters_setters - # - unnecessary_lambdas # https://github.com/dart-lang/linter/issues/498 - - unnecessary_new - - unnecessary_null_aware_assignments - - unnecessary_null_in_if_null_operators - # - unnecessary_overrides # https://github.com/dart-lang/linter/issues/626 and https://github.com/dart-lang/linter/issues/627 - - unnecessary_statements - - unnecessary_this - - use_rethrow_when_possible - # - use_setters_to_change_properties # not yet tested - # - use_string_buffers # https://github.com/dart-lang/linter/pull/664 - # - use_to_and_as_if_applicable # has false positives, so we prefer to catch this by code-review - - # === pub rules === - - package_names + - '**/*.g.dart' # Ignore generated files diff --git a/packages/android_intent/example/test_driver/android_intent_e2e.dart b/packages/android_intent/example/test_driver/android_intent_e2e.dart index 8df8146f52be..2c45262147b1 100644 --- a/packages/android_intent/example/test_driver/android_intent_e2e.dart +++ b/packages/android_intent/example/test_driver/android_intent_e2e.dart @@ -1,13 +1,12 @@ import 'dart:io'; +import 'package:android_intent/android_intent.dart'; import 'package:android_intent_example/main.dart'; import 'package:e2e/e2e.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; -import '../../lib/android_intent.dart'; - /// This is a smoke test that verifies that the example app builds and loads. /// Because this plugin works by launching Android platform UIs it's not /// possible to meaningfully test it through its Dart interface currently. There diff --git a/packages/android_intent/example/test_driver/android_intent_e2e_test.dart b/packages/android_intent/example/test_driver/android_intent_e2e_test.dart index 4f38746ce76c..6147d44df2ec 100644 --- a/packages/android_intent/example/test_driver/android_intent_e2e_test.dart +++ b/packages/android_intent/example/test_driver/android_intent_e2e_test.dart @@ -7,6 +7,6 @@ Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); final String result = await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); + await driver.close(); exit(result == 'pass' ? 0 : 1); } diff --git a/packages/android_intent/test/android_intent_test.dart b/packages/android_intent/test/android_intent_test.dart index b13438bf7469..5562159d7bcc 100644 --- a/packages/android_intent/test/android_intent_test.dart +++ b/packages/android_intent/test/android_intent_test.dart @@ -23,7 +23,7 @@ void main() { flags: [Flag.FLAG_ACTIVITY_NEW_TASK], channel: mockChannel, platform: FakePlatform(operatingSystem: 'android')); - androidIntent.launch(); + await androidIntent.launch(); verify(mockChannel.invokeMethod('launch', { 'action': 'action_view', 'data': Uri.encodeFull('https://flutter.io'), @@ -35,7 +35,7 @@ void main() { action: null, channel: mockChannel, platform: FakePlatform(operatingSystem: 'android')); - androidIntent.launch(); + await androidIntent.launch(); verify(mockChannel.invokeMethod('launch', { 'action': null, })); @@ -46,7 +46,7 @@ void main() { action: null, channel: mockChannel, platform: FakePlatform(operatingSystem: 'ios')); - androidIntent.launch(); + await androidIntent.launch(); verifyZeroInteractions(mockChannel); }); }); diff --git a/packages/battery/example/lib/main.dart b/packages/battery/example/lib/main.dart index 0feaa0503e45..8b8e3c6227f3 100644 --- a/packages/battery/example/lib/main.dart +++ b/packages/battery/example/lib/main.dart @@ -63,7 +63,7 @@ class _MyHomePageState extends State { child: const Icon(Icons.battery_unknown), onPressed: () async { final int batteryLevel = await _battery.batteryLevel; - showDialog( + await showDialog( context: context, builder: (_) => AlertDialog( content: Text('Battery: $batteryLevel%'), diff --git a/packages/camera/example/test_driver/camera_e2e.dart b/packages/camera/example/test_driver/camera_e2e.dart index 151339942f15..a1cc8ad9ca02 100644 --- a/packages/camera/example/test_driver/camera_e2e.dart +++ b/packages/camera/example/test_driver/camera_e2e.dart @@ -231,7 +231,7 @@ void main() { sleep(const Duration(milliseconds: 500)); await controller.stopImageStream(); - controller.dispose(); + await controller.dispose(); }, skip: !Platform.isAndroid, ); diff --git a/packages/camera/example/test_driver/camera_e2e_test.dart b/packages/camera/example/test_driver/camera_e2e_test.dart index e3e089a81fc9..4963854dea72 100644 --- a/packages/camera/example/test_driver/camera_e2e_test.dart +++ b/packages/camera/example/test_driver/camera_e2e_test.dart @@ -35,7 +35,7 @@ Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); final String result = await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); + await driver.close(); print('Test finished. Revoking camera permissions...'); Process.runSync('adb', [ 'shell', diff --git a/packages/camera/lib/camera.dart b/packages/camera/lib/camera.dart index ee1892c4cbc0..aeaf0d21b1ae 100644 --- a/packages/camera/lib/camera.dart +++ b/packages/camera/lib/camera.dart @@ -444,7 +444,7 @@ class CameraController extends ValueNotifier { throw CameraException(e.code, e.message); } - _imageStreamSubscription.cancel(); + await _imageStreamSubscription.cancel(); _imageStreamSubscription = null; } diff --git a/packages/connectivity/example/lib/main.dart b/packages/connectivity/example/lib/main.dart index c01a110efb60..0748409d52fd 100644 --- a/packages/connectivity/example/lib/main.dart +++ b/packages/connectivity/example/lib/main.dart @@ -72,7 +72,7 @@ class _MyHomePageState extends State { return; } - _updateConnectionStatus(result); + await _updateConnectionStatus(result); } @override diff --git a/packages/connectivity/example/test_driver/test/connectivity_e2e_test.dart b/packages/connectivity/example/test_driver/test/connectivity_e2e_test.dart index d4586bdc7127..84b7ae6a47ab 100644 --- a/packages/connectivity/example/test_driver/test/connectivity_e2e_test.dart +++ b/packages/connectivity/example/test_driver/test/connectivity_e2e_test.dart @@ -9,6 +9,6 @@ Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); final String result = await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); + await driver.close(); exit(result == 'pass' ? 0 : 1); } diff --git a/packages/device_info/example/test_driver/device_info_e2e_test.dart b/packages/device_info/example/test_driver/device_info_e2e_test.dart index ff6e9ce74ad9..f3aa9e218d82 100644 --- a/packages/device_info/example/test_driver/device_info_e2e_test.dart +++ b/packages/device_info/example/test_driver/device_info_e2e_test.dart @@ -10,6 +10,6 @@ Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); final String result = await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); + await driver.close(); exit(result == 'pass' ? 0 : 1); } diff --git a/packages/e2e/README.md b/packages/e2e/README.md index faeadf3b4df7..df47e1fbfda0 100644 --- a/packages/e2e/README.md +++ b/packages/e2e/README.md @@ -47,7 +47,7 @@ import 'package:flutter_driver/flutter_driver.dart'; Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); + await driver.close(); exit(result == 'pass' ? 0 : 1); } ``` @@ -118,7 +118,7 @@ To e2e test on a local Android device (emulated or physical): ## Firebase Test Lab -If this is you first time testing with Firebase Test Lab, +If this is you first time testing with Firebase Test Lab, you'll need to follow the guides in the [Firebase test lab documentation](https://firebase.google.com/docs/test-lab/?gclid=EAIaIQobChMIs5qVwqW25QIV8iCtBh3DrwyUEAAYASAAEgLFU_D_BwE) to set up a project. diff --git a/packages/e2e/example/test_driver/example_e2e_test.dart b/packages/e2e/example/test_driver/example_e2e_test.dart index 4f38746ce76c..6147d44df2ec 100644 --- a/packages/e2e/example/test_driver/example_e2e_test.dart +++ b/packages/e2e/example/test_driver/example_e2e_test.dart @@ -7,6 +7,6 @@ Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); final String result = await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); + await driver.close(); exit(result == 'pass' ? 0 : 1); } diff --git a/packages/google_maps_flutter/example/lib/marker_icons.dart b/packages/google_maps_flutter/example/lib/marker_icons.dart index 7472e8f8a175..6b516f88cbf0 100644 --- a/packages/google_maps_flutter/example/lib/marker_icons.dart +++ b/packages/google_maps_flutter/example/lib/marker_icons.dart @@ -71,7 +71,7 @@ class MarkerIconsBodyState extends State { if (_markerIcon == null) { final ImageConfiguration imageConfiguration = createLocalImageConfiguration(context); - BitmapDescriptor.fromAssetImage( + await BitmapDescriptor.fromAssetImage( imageConfiguration, 'assets/red_square.png') .then(_updateBitmap); } diff --git a/packages/google_maps_flutter/example/test_driver/google_maps_test.dart b/packages/google_maps_flutter/example/test_driver/google_maps_test.dart index b0d3305cd652..f44ae55b3ef6 100644 --- a/packages/google_maps_flutter/example/test_driver/google_maps_test.dart +++ b/packages/google_maps_flutter/example/test_driver/google_maps_test.dart @@ -9,5 +9,5 @@ import 'package:flutter_driver/flutter_driver.dart'; Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); + await driver.close(); } diff --git a/packages/google_maps_flutter/lib/src/google_map.dart b/packages/google_maps_flutter/lib/src/google_map.dart index fa5c3fdac490..26a63305f7de 100644 --- a/packages/google_maps_flutter/lib/src/google_map.dart +++ b/packages/google_maps_flutter/lib/src/google_map.dart @@ -253,34 +253,34 @@ class _GoogleMapState extends State { return; } final GoogleMapController controller = await _controller.future; - controller._updateMapOptions(updates); + await controller._updateMapOptions(updates); _googleMapOptions = newOptions; } void _updateMarkers() async { final GoogleMapController controller = await _controller.future; - controller._updateMarkers( + await controller._updateMarkers( _MarkerUpdates.from(_markers.values.toSet(), widget.markers)); _markers = _keyByMarkerId(widget.markers); } void _updatePolygons() async { final GoogleMapController controller = await _controller.future; - controller._updatePolygons( + await controller._updatePolygons( _PolygonUpdates.from(_polygons.values.toSet(), widget.polygons)); _polygons = _keyByPolygonId(widget.polygons); } void _updatePolylines() async { final GoogleMapController controller = await _controller.future; - controller._updatePolylines( + await controller._updatePolylines( _PolylineUpdates.from(_polylines.values.toSet(), widget.polylines)); _polylines = _keyByPolylineId(widget.polylines); } void _updateCircles() async { final GoogleMapController controller = await _controller.future; - controller._updateCircles( + await controller._updateCircles( _CircleUpdates.from(_circles.values.toSet(), widget.circles)); _circles = _keyByCircleId(widget.circles); } diff --git a/packages/google_sign_in/example/lib/main.dart b/packages/google_sign_in/example/lib/main.dart index 6973a36c3b02..25a4a4f93dff 100755 --- a/packages/google_sign_in/example/lib/main.dart +++ b/packages/google_sign_in/example/lib/main.dart @@ -103,7 +103,7 @@ class SignInDemoState extends State { } Future _handleSignOut() async { - _googleSignIn.disconnect(); + await _googleSignIn.disconnect(); } Widget _buildBody() { diff --git a/packages/in_app_purchase/analysis_options.yaml b/packages/in_app_purchase/analysis_options.yaml deleted file mode 100644 index afa04c8cb084..000000000000 --- a/packages/in_app_purchase/analysis_options.yaml +++ /dev/null @@ -1,3 +0,0 @@ -analyzer: - exclude: - - lib/**/*.g.dart # Ignore generated files \ No newline at end of file diff --git a/packages/in_app_purchase/example/lib/main.dart b/packages/in_app_purchase/example/lib/main.dart index 729fc0f77f46..e50db8669ddb 100644 --- a/packages/in_app_purchase/example/lib/main.dart +++ b/packages/in_app_purchase/example/lib/main.dart @@ -36,7 +36,7 @@ class _MyAppState extends State { bool _isAvailable = false; bool _purchasePending = false; bool _loading = true; - String _queryProductError = null; + String _queryProductError; @override void initState() { @@ -149,12 +149,12 @@ class _MyAppState extends State { stack.add( Stack( children: [ - new Opacity( + Opacity( opacity: 0.3, child: const ModalBarrier(dismissible: false, color: Colors.grey), ), - new Center( - child: new CircularProgressIndicator(), + Center( + child: CircularProgressIndicator(), ), ], ), @@ -213,7 +213,7 @@ class _MyAppState extends State { title: Text('Products for Sale', style: Theme.of(context).textTheme.headline)); List productList = []; - if (!_notFoundIds.isEmpty) { + if (_notFoundIds.isNotEmpty) { productList.add(ListTile( title: Text('[${_notFoundIds.join(", ")}] not found', style: TextStyle(color: ThemeData.light().errorColor)), @@ -375,11 +375,13 @@ class _MyAppState extends State { } } if (Platform.isIOS) { - InAppPurchaseConnection.instance.completePurchase(purchaseDetails); - } else if (Platform.isAndroid) { - if (!kAutoConsume && purchaseDetails.productID == _kConsumableId) { - InAppPurchaseConnection.instance.consumePurchase(purchaseDetails); - } + await InAppPurchaseConnection.instance + .completePurchase(purchaseDetails); + } else if (Platform.isAndroid && + !kAutoConsume && + purchaseDetails.productID == _kConsumableId) { + await InAppPurchaseConnection.instance + .consumePurchase(purchaseDetails); } } }); diff --git a/packages/in_app_purchase/example/test_driver/test/in_app_purchase_e2e_test.dart b/packages/in_app_purchase/example/test_driver/test/in_app_purchase_e2e_test.dart index d0a7005afa96..449af666b605 100644 --- a/packages/in_app_purchase/example/test_driver/test/in_app_purchase_e2e_test.dart +++ b/packages/in_app_purchase/example/test_driver/test/in_app_purchase_e2e_test.dart @@ -10,6 +10,6 @@ Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); final String result = await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); + await driver.close(); exit(result == 'pass' ? 0 : 1); } diff --git a/packages/in_app_purchase/lib/src/billing_client_wrappers/purchase_wrapper.dart b/packages/in_app_purchase/lib/src/billing_client_wrappers/purchase_wrapper.dart index e2bea9fc4d03..30f8732904b7 100644 --- a/packages/in_app_purchase/lib/src/billing_client_wrappers/purchase_wrapper.dart +++ b/packages/in_app_purchase/lib/src/billing_client_wrappers/purchase_wrapper.dart @@ -101,8 +101,7 @@ class PurchaseWrapper { @BillingResponseConverter() class PurchasesResultWrapper { PurchasesResultWrapper( - {@required BillingResponse this.responseCode, - @required List this.purchasesList}); + {@required this.responseCode, @required this.purchasesList}); factory PurchasesResultWrapper.fromJson(Map map) => _$PurchasesResultWrapperFromJson(map); diff --git a/packages/in_app_purchase/lib/src/billing_client_wrappers/sku_details_wrapper.dart b/packages/in_app_purchase/lib/src/billing_client_wrappers/sku_details_wrapper.dart index 670bf5125491..655980657e1c 100644 --- a/packages/in_app_purchase/lib/src/billing_client_wrappers/sku_details_wrapper.dart +++ b/packages/in_app_purchase/lib/src/billing_client_wrappers/sku_details_wrapper.dart @@ -142,6 +142,12 @@ class SkuDetailsResponseWrapper { factory SkuDetailsResponseWrapper.fromJson(Map map) => _$SkuDetailsResponseWrapperFromJson(map); + static SkuDetailsResponseWrapper _errorInstance = SkuDetailsResponseWrapper( + responseCode: BillingResponse.error, skuDetailsList: []); + + /// Returns an empty wrapper with an error response code. + static SkuDetailsResponseWrapper get error => _errorInstance; + /// The final status of the [BillingClient.querySkuDetails] call. final BillingResponse responseCode; diff --git a/packages/in_app_purchase/lib/src/in_app_purchase/app_store_connection.dart b/packages/in_app_purchase/lib/src/in_app_purchase/app_store_connection.dart index e6b8ac5e9e95..956eb09f6313 100644 --- a/packages/in_app_purchase/lib/src/in_app_purchase/app_store_connection.dart +++ b/packages/in_app_purchase/lib/src/in_app_purchase/app_store_connection.dart @@ -154,7 +154,7 @@ class AppStoreConnection implements InAppPurchaseConnection { .toList(); } List invalidIdentifiers = response.invalidProductIdentifiers ?? []; - if (productDetails.length == 0) { + if (productDetails.isEmpty) { invalidIdentifiers = identifiers.toList(); } ProductDetailsResponse productDetailsResponse = ProductDetailsResponse( diff --git a/packages/in_app_purchase/lib/src/in_app_purchase/google_play_connection.dart b/packages/in_app_purchase/lib/src/in_app_purchase/google_play_connection.dart index 32f8fc79681e..c7d4f2d21bc5 100644 --- a/packages/in_app_purchase/lib/src/in_app_purchase/google_play_connection.dart +++ b/packages/in_app_purchase/lib/src/in_app_purchase/google_play_connection.dart @@ -186,10 +186,8 @@ class GooglePlayConnection } on PlatformException catch (e) { exception = e; responses = [ - SkuDetailsResponseWrapper( - responseCode: BillingResponse.error, skuDetailsList: []), - SkuDetailsResponseWrapper( - responseCode: BillingResponse.error, skuDetailsList: []) + SkuDetailsResponseWrapper.error, + SkuDetailsResponseWrapper.error, ]; } List productDetailsList = @@ -236,7 +234,7 @@ class GooglePlayConnection ..status = status ..error = error); }).toList(); - if (!purchases.isEmpty) { + if (purchases.isNotEmpty) { return Future.wait(purchases); } else { return [ diff --git a/packages/in_app_purchase/lib/src/in_app_purchase/in_app_purchase_connection.dart b/packages/in_app_purchase/lib/src/in_app_purchase/in_app_purchase_connection.dart index 46088b9b008f..73990e86d9bd 100644 --- a/packages/in_app_purchase/lib/src/in_app_purchase/in_app_purchase_connection.dart +++ b/packages/in_app_purchase/lib/src/in_app_purchase/in_app_purchase_connection.dart @@ -249,7 +249,7 @@ class IAPError { {@required this.source, @required this.code, @required this.message, - this.details = null}); + this.details}); /// Which source is the error on. final IAPSource source; diff --git a/packages/in_app_purchase/lib/src/in_app_purchase/product_details.dart b/packages/in_app_purchase/lib/src/in_app_purchase/product_details.dart index 2cfbb0c2299c..9808bba999fe 100644 --- a/packages/in_app_purchase/lib/src/in_app_purchase/product_details.dart +++ b/packages/in_app_purchase/lib/src/in_app_purchase/product_details.dart @@ -17,8 +17,8 @@ class ProductDetails { @required this.title, @required this.description, @required this.price, - this.skProduct = null, - this.skuDetail = null}); + this.skProduct, + this.skuDetail}); /// The identifier of the product, specified in App Store Connect or Sku in Google Play console. final String id; @@ -67,9 +67,7 @@ class ProductDetails { /// A list of [ProductDetails] can be obtained from the this response. class ProductDetailsResponse { ProductDetailsResponse( - {@required this.productDetails, - @required this.notFoundIDs, - this.error = null}); + {@required this.productDetails, @required this.notFoundIDs, this.error}); /// Each [ProductDetails] uniquely matches one valid identifier in [identifiers] of [InAppPurchaseConnection.queryProductDetails]. final List productDetails; diff --git a/packages/in_app_purchase/lib/src/in_app_purchase/purchase_details.dart b/packages/in_app_purchase/lib/src/in_app_purchase/purchase_details.dart index b980b01bfa46..d5e8612bd76d 100644 --- a/packages/in_app_purchase/lib/src/in_app_purchase/purchase_details.dart +++ b/packages/in_app_purchase/lib/src/in_app_purchase/purchase_details.dart @@ -142,8 +142,8 @@ class PurchaseDetails { @required this.productID, @required this.verificationData, @required this.transactionDate, - this.skPaymentTransaction = null, - this.billingClientPurchase = null, + this.skPaymentTransaction, + this.billingClientPurchase, }); /// Generate a [PurchaseDetails] object based on an iOS [SKTransactionWrapper] object. diff --git a/packages/in_app_purchase/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart b/packages/in_app_purchase/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart index a5084b5c80cb..eb3ed4a5ae30 100644 --- a/packages/in_app_purchase/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart +++ b/packages/in_app_purchase/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart @@ -35,7 +35,7 @@ class SKPaymentQueueWrapper { return _singleton; } - static final SKPaymentQueueWrapper _singleton = new SKPaymentQueueWrapper._(); + static final SKPaymentQueueWrapper _singleton = SKPaymentQueueWrapper._(); SKPaymentQueueWrapper._() { callbackChannel.setMethodCallHandler(_handleObserverCallbacks); diff --git a/packages/package_info/example/test_driver/package_info_e2e_test.dart b/packages/package_info/example/test_driver/package_info_e2e_test.dart index ac4ea11482e2..1bcd0d37f450 100644 --- a/packages/package_info/example/test_driver/package_info_e2e_test.dart +++ b/packages/package_info/example/test_driver/package_info_e2e_test.dart @@ -10,6 +10,6 @@ Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); final String result = await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); + await driver.close(); exit(result == 'pass' ? 0 : 1); } diff --git a/packages/package_info/lib/package_info.dart b/packages/package_info/lib/package_info.dart index f1a75d5a9cf5..6db979bc78cc 100644 --- a/packages/package_info/lib/package_info.dart +++ b/packages/package_info/lib/package_info.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'package:flutter/services.dart'; +import 'package:pedantic/pedantic.dart'; const MethodChannel _kChannel = MethodChannel('plugins.flutter.io/package_info'); @@ -32,7 +33,7 @@ class PackageInfo { if (_fromPlatform == null) { final Completer completer = Completer(); - _kChannel.invokeMapMethod('getAll').then( + unawaited(_kChannel.invokeMapMethod('getAll').then( (dynamic result) { final Map map = result; @@ -42,7 +43,7 @@ class PackageInfo { version: map["version"], buildNumber: map["buildNumber"], )); - }, onError: completer.completeError); + }, onError: completer.completeError)); _fromPlatform = completer.future; } diff --git a/packages/package_info/pubspec.yaml b/packages/package_info/pubspec.yaml index 50712baaa2e4..183ef7a9fcba 100644 --- a/packages/package_info/pubspec.yaml +++ b/packages/package_info/pubspec.yaml @@ -14,6 +14,7 @@ flutter: dependencies: flutter: sdk: flutter + pedantic: ^1.8.0 dev_dependencies: flutter_test: diff --git a/packages/path_provider/example/test_driver/path_provider_test.dart b/packages/path_provider/example/test_driver/path_provider_test.dart index b0d3305cd652..f44ae55b3ef6 100644 --- a/packages/path_provider/example/test_driver/path_provider_test.dart +++ b/packages/path_provider/example/test_driver/path_provider_test.dart @@ -9,5 +9,5 @@ import 'package:flutter_driver/flutter_driver.dart'; Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); + await driver.close(); } diff --git a/packages/quick_actions/example/test_driver/quick_actions_e2e_test.dart b/packages/quick_actions/example/test_driver/quick_actions_e2e_test.dart index ff6e9ce74ad9..f3aa9e218d82 100644 --- a/packages/quick_actions/example/test_driver/quick_actions_e2e_test.dart +++ b/packages/quick_actions/example/test_driver/quick_actions_e2e_test.dart @@ -10,6 +10,6 @@ Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); final String result = await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); + await driver.close(); exit(result == 'pass' ? 0 : 1); } diff --git a/packages/sensors/example/test_driver/test/sensors_e2e_test.dart b/packages/sensors/example/test_driver/test/sensors_e2e_test.dart index ff6e9ce74ad9..f3aa9e218d82 100644 --- a/packages/sensors/example/test_driver/test/sensors_e2e_test.dart +++ b/packages/sensors/example/test_driver/test/sensors_e2e_test.dart @@ -10,6 +10,6 @@ Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); final String result = await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); + await driver.close(); exit(result == 'pass' ? 0 : 1); } diff --git a/packages/share/example/test_driver/test/share_e2e_test.dart b/packages/share/example/test_driver/test/share_e2e_test.dart index ff6e9ce74ad9..f3aa9e218d82 100644 --- a/packages/share/example/test_driver/test/share_e2e_test.dart +++ b/packages/share/example/test_driver/test/share_e2e_test.dart @@ -10,6 +10,6 @@ Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); final String result = await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); + await driver.close(); exit(result == 'pass' ? 0 : 1); } diff --git a/packages/share/test/share_test.dart b/packages/share/test/share_test.dart index 697e0925708a..cfb655ab05f2 100644 --- a/packages/share/test/share_test.dart +++ b/packages/share/test/share_test.dart @@ -21,7 +21,7 @@ void main() { // Re-pipe to mockito for easier verifies. Share.channel.setMockMethodCallHandler((MethodCall call) async { // The explicit type can be void as the only method call has a return type of void. - mockChannel.invokeMethod(call.method, call.arguments); + return mockChannel.invokeMethod(call.method, call.arguments); }); }); diff --git a/packages/shared_preferences/example/lib/main.dart b/packages/shared_preferences/example/lib/main.dart index 0d93675bc84d..b5f781087f09 100644 --- a/packages/shared_preferences/example/lib/main.dart +++ b/packages/shared_preferences/example/lib/main.dart @@ -65,13 +65,14 @@ class SharedPreferencesDemoState extends State { case ConnectionState.waiting: return const CircularProgressIndicator(); default: - if (snapshot.hasError) + if (snapshot.hasError) { return Text('Error: ${snapshot.error}'); - else + } else { return Text( 'Button tapped ${snapshot.data} time${snapshot.data == 1 ? '' : 's'}.\n\n' 'This should persist across restarts.', ); + } } })), floatingActionButton: FloatingActionButton( diff --git a/packages/shared_preferences/example/test_driver/shared_preferences_e2e.dart b/packages/shared_preferences/example/test_driver/shared_preferences_e2e.dart index 1c09e2eb867e..72a09760166f 100644 --- a/packages/shared_preferences/example/test_driver/shared_preferences_e2e.dart +++ b/packages/shared_preferences/example/test_driver/shared_preferences_e2e.dart @@ -63,23 +63,23 @@ void main() { test('removing', () async { const String key = 'testKey'; - preferences - ..setString(key, kTestValues['flutter.String']) - ..setBool(key, kTestValues['flutter.bool']) - ..setInt(key, kTestValues['flutter.int']) - ..setDouble(key, kTestValues['flutter.double']) - ..setStringList(key, kTestValues['flutter.List']); + await preferences.setString(key, kTestValues['flutter.String']); + await preferences.setBool(key, kTestValues['flutter.bool']); + await preferences.setInt(key, kTestValues['flutter.int']); + await preferences.setDouble(key, kTestValues['flutter.double']); + await preferences.setStringList(key, kTestValues['flutter.List']); + ; await preferences.remove(key); expect(preferences.get('testKey'), isNull); }); test('clearing', () async { - preferences - ..setString('String', kTestValues['flutter.String']) - ..setBool('bool', kTestValues['flutter.bool']) - ..setInt('int', kTestValues['flutter.int']) - ..setDouble('double', kTestValues['flutter.double']) - ..setStringList('List', kTestValues['flutter.List']); + await preferences.setString('String', kTestValues['flutter.String']); + await preferences.setBool('bool', kTestValues['flutter.bool']); + await preferences.setInt('int', kTestValues['flutter.int']); + await preferences.setDouble('double', kTestValues['flutter.double']); + await preferences.setStringList('List', kTestValues['flutter.List']); + ; await preferences.clear(); expect(preferences.getString('String'), null); expect(preferences.getBool('bool'), null); diff --git a/packages/shared_preferences/example/test_driver/shared_preferences_e2e_test.dart b/packages/shared_preferences/example/test_driver/shared_preferences_e2e_test.dart index ff6e9ce74ad9..f3aa9e218d82 100644 --- a/packages/shared_preferences/example/test_driver/shared_preferences_e2e_test.dart +++ b/packages/shared_preferences/example/test_driver/shared_preferences_e2e_test.dart @@ -10,6 +10,6 @@ Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); final String result = await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); + await driver.close(); exit(result == 'pass' ? 0 : 1); } diff --git a/packages/shared_preferences/test/shared_preferences_test.dart b/packages/shared_preferences/test/shared_preferences_test.dart index 8ebcb96c0ad8..ac6d89f047be 100755 --- a/packages/shared_preferences/test/shared_preferences_test.dart +++ b/packages/shared_preferences/test/shared_preferences_test.dart @@ -108,12 +108,11 @@ void main() { test('removing', () async { const String key = 'testKey'; - preferences - ..setString(key, null) - ..setBool(key, null) - ..setInt(key, null) - ..setDouble(key, null) - ..setStringList(key, null); + await preferences.setString(key, null); + await preferences.setBool(key, null); + await preferences.setInt(key, null); + await preferences.setDouble(key, null); + await preferences.setStringList(key, null); await preferences.remove(key); expect( log, @@ -132,7 +131,7 @@ void main() { expect(false, preferences.containsKey(key)); - preferences.setString(key, 'test'); + await preferences.setString(key, 'test'); expect(true, preferences.containsKey(key)); }); diff --git a/packages/url_launcher/url_launcher/example/test_driver/url_launcher_e2e_test.dart b/packages/url_launcher/url_launcher/example/test_driver/url_launcher_e2e_test.dart index ac4ea11482e2..1bcd0d37f450 100644 --- a/packages/url_launcher/url_launcher/example/test_driver/url_launcher_e2e_test.dart +++ b/packages/url_launcher/url_launcher/example/test_driver/url_launcher_e2e_test.dart @@ -10,6 +10,6 @@ Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); final String result = await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); + await driver.close(); exit(result == 'pass' ? 0 : 1); } diff --git a/packages/video_player/lib/video_player.dart b/packages/video_player/lib/video_player.dart index f1b0e7c9791d..22a4705ecee7 100644 --- a/packages/video_player/lib/video_player.dart +++ b/packages/video_player/lib/video_player.dart @@ -324,7 +324,7 @@ class VideoPlayerController extends ValueNotifier { if (!value.initialized || _isDisposed) { return; } - _channel.invokeMethod( + await _channel.invokeMethod( 'setLooping', {'textureId': _textureId, 'looping': value.isLooping}, ); diff --git a/packages/webview_flutter/example/lib/main.dart b/packages/webview_flutter/example/lib/main.dart index 5f3e0f8ff4fa..b1c18c2aef6b 100644 --- a/packages/webview_flutter/example/lib/main.dart +++ b/packages/webview_flutter/example/lib/main.dart @@ -194,7 +194,7 @@ class SampleMenu extends StatelessWidget { WebViewController controller, BuildContext context) async { // Send a message with the user agent string to the Toaster JavaScript channel we registered // with the WebView. - controller.evaluateJavascript( + await controller.evaluateJavascript( 'Toaster.postMessage("User Agent: " + navigator.userAgent);'); } @@ -250,7 +250,7 @@ class SampleMenu extends StatelessWidget { WebViewController controller, BuildContext context) async { final String contentBase64 = base64Encode(const Utf8Encoder().convert(kNavigationExamplePage)); - controller.loadUrl('data:text/html;base64,$contentBase64'); + await controller.loadUrl('data:text/html;base64,$contentBase64'); } Widget _getCookieList(String cookies) { @@ -291,7 +291,7 @@ class NavigationControls extends StatelessWidget { ? null : () async { if (await controller.canGoBack()) { - controller.goBack(); + await controller.goBack(); } else { Scaffold.of(context).showSnackBar( const SnackBar(content: Text("No back history item")), @@ -306,7 +306,7 @@ class NavigationControls extends StatelessWidget { ? null : () async { if (await controller.canGoForward()) { - controller.goForward(); + await controller.goForward(); } else { Scaffold.of(context).showSnackBar( const SnackBar( diff --git a/packages/webview_flutter/example/test_driver/webview_flutter_e2e_test.dart b/packages/webview_flutter/example/test_driver/webview_flutter_e2e_test.dart index 2e5c27fd402e..ccd716607d60 100644 --- a/packages/webview_flutter/example/test_driver/webview_flutter_e2e_test.dart +++ b/packages/webview_flutter/example/test_driver/webview_flutter_e2e_test.dart @@ -11,6 +11,6 @@ Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); final String result = await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); + await driver.close(); exit(result == 'pass' ? 0 : 1); } diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index cd5ca46701d7..d7b5f86ebae6 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -587,10 +587,11 @@ class WebViewController { final Set channelsToRemove = currentChannels.difference(newChannelNames); if (channelsToRemove.isNotEmpty) { - _webViewPlatformController.removeJavascriptChannels(channelsToRemove); + await _webViewPlatformController + .removeJavascriptChannels(channelsToRemove); } if (channelsToAdd.isNotEmpty) { - _webViewPlatformController.addJavascriptChannels(channelsToAdd); + await _webViewPlatformController.addJavascriptChannels(channelsToAdd); } _platformCallbacksHandler._updateJavascriptChannelsFromSet(newChannels); } diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart index 5184ddd13de3..728686f45e5b 100644 --- a/packages/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/test/webview_flutter_test.dart @@ -83,7 +83,7 @@ void main() { expect(controller, isNotNull); - controller.loadUrl('https://flutter.io'); + await controller.loadUrl('https://flutter.io'); expect(await controller.currentUrl(), 'https://flutter.io'); }); @@ -272,11 +272,11 @@ void main() { expect(await controller.currentUrl(), 'https://youtube.com'); - controller.loadUrl('https://flutter.io'); + await controller.loadUrl('https://flutter.io'); expect(await controller.currentUrl(), 'https://flutter.io'); - controller.goBack(); + await controller.goBack(); expect(await controller.currentUrl(), 'https://youtube.com'); }); @@ -296,15 +296,15 @@ void main() { expect(await controller.currentUrl(), 'https://youtube.com'); - controller.loadUrl('https://flutter.io'); + await controller.loadUrl('https://flutter.io'); expect(await controller.currentUrl(), 'https://flutter.io'); - controller.goBack(); + await controller.goBack(); expect(await controller.currentUrl(), 'https://youtube.com'); - controller.goForward(); + await controller.goForward(); expect(await controller.currentUrl(), 'https://flutter.io'); }); @@ -324,13 +324,13 @@ void main() { // Test a WebView without an explicitly set first URL. expect(await controller.currentUrl(), isNull); - controller.loadUrl('https://youtube.com'); + await controller.loadUrl('https://youtube.com'); expect(await controller.currentUrl(), 'https://youtube.com'); - controller.loadUrl('https://flutter.io'); + await controller.loadUrl('https://flutter.io'); expect(await controller.currentUrl(), 'https://flutter.io'); - controller.goBack(); + await controller.goBack(); expect(await controller.currentUrl(), 'https://youtube.com'); }); @@ -351,12 +351,12 @@ void main() { expect(platformWebView.currentUrl, 'https://flutter.io'); expect(platformWebView.amountOfReloadsOnCurrentUrl, 0); - controller.reload(); + await controller.reload(); expect(platformWebView.currentUrl, 'https://flutter.io'); expect(platformWebView.amountOfReloadsOnCurrentUrl, 1); - controller.loadUrl('https://youtube.com'); + await controller.loadUrl('https://youtube.com'); expect(platformWebView.amountOfReloadsOnCurrentUrl, 0); }); diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 000000000000..648c38fb43ef --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,6 @@ +# This only exists so that we can include pedantic in the top level +# analysis_options.yaml. +name: plugins +dependencies: + pedantic: ^1.8.0 +publish_to: none