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