[various] Enable `avoid_dynamic_calls` (#6834)
* Enable the option
* Fix camera
* Fix webview
* Remove unnecessary 'call's from camera tests
* Fix maps
* Fix sign-in
* fix image_picker
* Fix IAP
* Fix shared_preferences
* Fix url_launcher_android
* Version bumps
* Fix tool
* Re-apply webview test fix
* Re-bump versions
* Fix one new tool issue
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 0e07b33..85f5bde 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -68,7 +68,7 @@
# - avoid_catching_errors # blocked on https://github.com/dart-lang/linter/issues/3023
- avoid_classes_with_only_static_members
- avoid_double_and_int_checks
- # - avoid_dynamic_calls # LOCAL CHANGE - Needs to be enabled and violations fixed.
+ - avoid_dynamic_calls
- avoid_empty_else
- avoid_equals_and_hash_code_on_mutable_classes
- avoid_escaping_inner_quotes
diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md
index 1b07c30..1a0b87e 100644
--- a/packages/camera/camera_android/CHANGELOG.md
+++ b/packages/camera/camera_android/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.10.2+1
+
+* Updates code for stricter lint checks.
+
## 0.10.2
* Remove usage of deprecated quiver Optional type.
diff --git a/packages/camera/camera_android/lib/src/android_camera.dart b/packages/camera/camera_android/lib/src/android_camera.dart
index 4b342ee..1a9c3d0 100644
--- a/packages/camera/camera_android/lib/src/android_camera.dart
+++ b/packages/camera/camera_android/lib/src/android_camera.dart
@@ -549,9 +549,9 @@
Future<dynamic> _handleDeviceMethodCall(MethodCall call) async {
switch (call.method) {
case 'orientation_changed':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_deviceEventStreamController.add(DeviceOrientationChangedEvent(
- deserializeDeviceOrientation(
- call.arguments['orientation']! as String)));
+ deserializeDeviceOrientation(arguments['orientation']! as String)));
break;
default:
throw MissingPluginException();
@@ -566,21 +566,23 @@
Future<dynamic> handleCameraMethodCall(MethodCall call, int cameraId) async {
switch (call.method) {
case 'initialized':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
cameraEventStreamController.add(CameraInitializedEvent(
cameraId,
- call.arguments['previewWidth']! as double,
- call.arguments['previewHeight']! as double,
- deserializeExposureMode(call.arguments['exposureMode']! as String),
- call.arguments['exposurePointSupported']! as bool,
- deserializeFocusMode(call.arguments['focusMode']! as String),
- call.arguments['focusPointSupported']! as bool,
+ arguments['previewWidth']! as double,
+ arguments['previewHeight']! as double,
+ deserializeExposureMode(arguments['exposureMode']! as String),
+ arguments['exposurePointSupported']! as bool,
+ deserializeFocusMode(arguments['focusMode']! as String),
+ arguments['focusPointSupported']! as bool,
));
break;
case 'resolution_changed':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
cameraEventStreamController.add(CameraResolutionChangedEvent(
cameraId,
- call.arguments['captureWidth']! as double,
- call.arguments['captureHeight']! as double,
+ arguments['captureWidth']! as double,
+ arguments['captureHeight']! as double,
));
break;
case 'camera_closing':
@@ -589,23 +591,32 @@
));
break;
case 'video_recorded':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
cameraEventStreamController.add(VideoRecordedEvent(
cameraId,
- XFile(call.arguments['path']! as String),
- call.arguments['maxVideoDuration'] != null
- ? Duration(
- milliseconds: call.arguments['maxVideoDuration']! as int)
+ XFile(arguments['path']! as String),
+ arguments['maxVideoDuration'] != null
+ ? Duration(milliseconds: arguments['maxVideoDuration']! as int)
: null,
));
break;
case 'error':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
cameraEventStreamController.add(CameraErrorEvent(
cameraId,
- call.arguments['description']! as String,
+ arguments['description']! as String,
));
break;
default:
throw MissingPluginException();
}
}
+
+ /// Returns the arguments of [call] as typed string-keyed Map.
+ ///
+ /// This does not do any type validation, so is only safe to call if the
+ /// arguments are known to be a map.
+ Map<String, Object?> _getArgumentDictionary(MethodCall call) {
+ return (call.arguments as Map<Object?, Object?>).cast<String, Object?>();
+ }
}
diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml
index 6f25af7..9d86a00 100644
--- a/packages/camera/camera_android/pubspec.yaml
+++ b/packages/camera/camera_android/pubspec.yaml
@@ -2,7 +2,7 @@
description: Android implementation of the camera plugin.
repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_android
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
-version: 0.10.2
+version: 0.10.2+1
environment:
sdk: ">=2.14.0 <3.0.0"
diff --git a/packages/camera/camera_android/test/android_camera_test.dart b/packages/camera/camera_android/test/android_camera_test.dart
index e35d0fd..bd55b0b 100644
--- a/packages/camera/camera_android/test/android_camera_test.dart
+++ b/packages/camera/camera_android/test/android_camera_test.dart
@@ -504,11 +504,13 @@
]);
expect(cameras.length, returnData.length);
for (int i = 0; i < returnData.length; i++) {
+ final Map<String, Object?> typedData =
+ (returnData[i] as Map<dynamic, dynamic>).cast<String, Object?>();
final CameraDescription cameraDescription = CameraDescription(
- name: returnData[i]['name']! as String,
+ name: typedData['name']! as String,
lensDirection:
- parseCameraLensDirection(returnData[i]['lensFacing']! as String),
- sensorOrientation: returnData[i]['sensorOrientation']! as int,
+ parseCameraLensDirection(typedData['lensFacing']! as String),
+ sensorOrientation: typedData['sensorOrientation']! as int,
);
expect(cameras[i], cameraDescription);
}
diff --git a/packages/camera/camera_android_camerax/lib/src/instance_manager.dart b/packages/camera/camera_android_camerax/lib/src/instance_manager.dart
index dd48610..8c6081c 100644
--- a/packages/camera/camera_android_camerax/lib/src/instance_manager.dart
+++ b/packages/camera/camera_android_camerax/lib/src/instance_manager.dart
@@ -124,22 +124,26 @@
/// This method also expects the host `InstanceManager` to have a strong
/// reference to the instance the identifier is associated with.
T? getInstanceWithWeakReference<T extends Object>(int identifier) {
- final Object? weakInstance = _weakInstances[identifier]?.target;
+ final T? weakInstance = _weakInstances[identifier]?.target as T?;
if (weakInstance == null) {
- final Object? strongInstance = _strongInstances[identifier];
+ final T? strongInstance = _strongInstances[identifier] as T?;
if (strongInstance != null) {
- final Object copy =
- _copyCallbacks[identifier]!(strongInstance)! as Object;
+ // This cast is safe since it matches the argument type for
+ // _addInstanceWithIdentifier, which is the only place _copyCallbacks
+ // is populated.
+ final T Function(T) copyCallback =
+ _copyCallbacks[identifier]! as T Function(T);
+ final T copy = copyCallback(strongInstance);
_identifiers[copy] = identifier;
- _weakInstances[identifier] = WeakReference<Object>(copy);
+ _weakInstances[identifier] = WeakReference<T>(copy);
_finalizer.attach(copy, identifier, detach: copy);
- return copy as T;
+ return copy;
}
- return strongInstance as T?;
+ return strongInstance;
}
- return weakInstance as T;
+ return weakInstance;
}
/// Retrieves the identifier associated with instance.
diff --git a/packages/camera/camera_avfoundation/CHANGELOG.md b/packages/camera/camera_avfoundation/CHANGELOG.md
index 9217f26..d9fc8c3 100644
--- a/packages/camera/camera_avfoundation/CHANGELOG.md
+++ b/packages/camera/camera_avfoundation/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.9.10+1
+
+* Updates code for stricter lint checks.
+
## 0.9.10
* Remove usage of deprecated quiver Optional type.
diff --git a/packages/camera/camera_avfoundation/lib/src/avfoundation_camera.dart b/packages/camera/camera_avfoundation/lib/src/avfoundation_camera.dart
index 011616d..11bda51 100644
--- a/packages/camera/camera_avfoundation/lib/src/avfoundation_camera.dart
+++ b/packages/camera/camera_avfoundation/lib/src/avfoundation_camera.dart
@@ -555,9 +555,9 @@
Future<dynamic> _handleDeviceMethodCall(MethodCall call) async {
switch (call.method) {
case 'orientation_changed':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_deviceEventStreamController.add(DeviceOrientationChangedEvent(
- deserializeDeviceOrientation(
- call.arguments['orientation']! as String)));
+ deserializeDeviceOrientation(arguments['orientation']! as String)));
break;
default:
throw MissingPluginException();
@@ -572,21 +572,23 @@
Future<dynamic> handleCameraMethodCall(MethodCall call, int cameraId) async {
switch (call.method) {
case 'initialized':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
cameraEventStreamController.add(CameraInitializedEvent(
cameraId,
- call.arguments['previewWidth']! as double,
- call.arguments['previewHeight']! as double,
- deserializeExposureMode(call.arguments['exposureMode']! as String),
- call.arguments['exposurePointSupported']! as bool,
- deserializeFocusMode(call.arguments['focusMode']! as String),
- call.arguments['focusPointSupported']! as bool,
+ arguments['previewWidth']! as double,
+ arguments['previewHeight']! as double,
+ deserializeExposureMode(arguments['exposureMode']! as String),
+ arguments['exposurePointSupported']! as bool,
+ deserializeFocusMode(arguments['focusMode']! as String),
+ arguments['focusPointSupported']! as bool,
));
break;
case 'resolution_changed':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
cameraEventStreamController.add(CameraResolutionChangedEvent(
cameraId,
- call.arguments['captureWidth']! as double,
- call.arguments['captureHeight']! as double,
+ arguments['captureWidth']! as double,
+ arguments['captureHeight']! as double,
));
break;
case 'camera_closing':
@@ -595,23 +597,32 @@
));
break;
case 'video_recorded':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
cameraEventStreamController.add(VideoRecordedEvent(
cameraId,
- XFile(call.arguments['path']! as String),
- call.arguments['maxVideoDuration'] != null
- ? Duration(
- milliseconds: call.arguments['maxVideoDuration']! as int)
+ XFile(arguments['path']! as String),
+ arguments['maxVideoDuration'] != null
+ ? Duration(milliseconds: arguments['maxVideoDuration']! as int)
: null,
));
break;
case 'error':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
cameraEventStreamController.add(CameraErrorEvent(
cameraId,
- call.arguments['description']! as String,
+ arguments['description']! as String,
));
break;
default:
throw MissingPluginException();
}
}
+
+ /// Returns the arguments of [call] as typed string-keyed Map.
+ ///
+ /// This does not do any type validation, so is only safe to call if the
+ /// arguments are known to be a map.
+ Map<String, Object?> _getArgumentDictionary(MethodCall call) {
+ return (call.arguments as Map<Object?, Object?>).cast<String, Object?>();
+ }
}
diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml
index aa1c110..975accf 100644
--- a/packages/camera/camera_avfoundation/pubspec.yaml
+++ b/packages/camera/camera_avfoundation/pubspec.yaml
@@ -2,7 +2,7 @@
description: iOS implementation of the camera plugin.
repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_avfoundation
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
-version: 0.9.10
+version: 0.9.10+1
environment:
sdk: ">=2.14.0 <3.0.0"
diff --git a/packages/camera/camera_avfoundation/test/avfoundation_camera_test.dart b/packages/camera/camera_avfoundation/test/avfoundation_camera_test.dart
index 8c5fad1..50d3e98 100644
--- a/packages/camera/camera_avfoundation/test/avfoundation_camera_test.dart
+++ b/packages/camera/camera_avfoundation/test/avfoundation_camera_test.dart
@@ -478,6 +478,9 @@
test('Should fetch CameraDescription instances for available cameras',
() async {
// Arrange
+ // This deliberately uses 'dynamic' since that's what actual platform
+ // channel results will be, so using typed mock data could mask type
+ // handling bugs in the code under test.
final List<dynamic> returnData = <dynamic>[
<String, dynamic>{
'name': 'Test 1',
@@ -504,11 +507,13 @@
]);
expect(cameras.length, returnData.length);
for (int i = 0; i < returnData.length; i++) {
+ final Map<String, Object?> typedData =
+ (returnData[i] as Map<dynamic, dynamic>).cast<String, Object?>();
final CameraDescription cameraDescription = CameraDescription(
- name: returnData[i]['name']! as String,
+ name: typedData['name']! as String,
lensDirection:
- parseCameraLensDirection(returnData[i]['lensFacing']! as String),
- sensorOrientation: returnData[i]['sensorOrientation']! as int,
+ parseCameraLensDirection(typedData['lensFacing']! as String),
+ sensorOrientation: typedData['sensorOrientation']! as int,
);
expect(cameras[i], cameraDescription);
}
diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md
index 5cde03c..55d93a3 100644
--- a/packages/camera/camera_platform_interface/CHANGELOG.md
+++ b/packages/camera/camera_platform_interface/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.3.3
+
+* Updates code for stricter lint checks.
+
## 2.3.2
* Updates MethodChannelCamera to have startVideoRecording call the newer startVideoCapturing.
diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart
index 34c3fa2..06c1ac6 100644
--- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart
+++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart
@@ -551,9 +551,9 @@
Future<dynamic> handleDeviceMethodCall(MethodCall call) async {
switch (call.method) {
case 'orientation_changed':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
deviceEventStreamController.add(DeviceOrientationChangedEvent(
- deserializeDeviceOrientation(
- call.arguments['orientation']! as String)));
+ deserializeDeviceOrientation(arguments['orientation']! as String)));
break;
default:
throw MissingPluginException();
@@ -568,21 +568,23 @@
Future<dynamic> handleCameraMethodCall(MethodCall call, int cameraId) async {
switch (call.method) {
case 'initialized':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
cameraEventStreamController.add(CameraInitializedEvent(
cameraId,
- call.arguments['previewWidth']! as double,
- call.arguments['previewHeight']! as double,
- deserializeExposureMode(call.arguments['exposureMode']! as String),
- call.arguments['exposurePointSupported']! as bool,
- deserializeFocusMode(call.arguments['focusMode']! as String),
- call.arguments['focusPointSupported']! as bool,
+ arguments['previewWidth']! as double,
+ arguments['previewHeight']! as double,
+ deserializeExposureMode(arguments['exposureMode']! as String),
+ arguments['exposurePointSupported']! as bool,
+ deserializeFocusMode(arguments['focusMode']! as String),
+ arguments['focusPointSupported']! as bool,
));
break;
case 'resolution_changed':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
cameraEventStreamController.add(CameraResolutionChangedEvent(
cameraId,
- call.arguments['captureWidth']! as double,
- call.arguments['captureHeight']! as double,
+ arguments['captureWidth']! as double,
+ arguments['captureHeight']! as double,
));
break;
case 'camera_closing':
@@ -591,23 +593,32 @@
));
break;
case 'video_recorded':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
cameraEventStreamController.add(VideoRecordedEvent(
cameraId,
- XFile(call.arguments['path']! as String),
- call.arguments['maxVideoDuration'] != null
- ? Duration(
- milliseconds: call.arguments['maxVideoDuration']! as int)
+ XFile(arguments['path']! as String),
+ arguments['maxVideoDuration'] != null
+ ? Duration(milliseconds: arguments['maxVideoDuration']! as int)
: null,
));
break;
case 'error':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
cameraEventStreamController.add(CameraErrorEvent(
cameraId,
- call.arguments['description']! as String,
+ arguments['description']! as String,
));
break;
default:
throw MissingPluginException();
}
}
+
+ /// Returns the arguments of [call] as typed string-keyed Map.
+ ///
+ /// This does not do any type validation, so is only safe to call if the
+ /// arguments are known to be a map.
+ Map<String, Object?> _getArgumentDictionary(MethodCall call) {
+ return (call.arguments as Map<Object?, Object?>).cast<String, Object?>();
+ }
}
diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml
index cb21a6c..54383cd 100644
--- a/packages/camera/camera_platform_interface/pubspec.yaml
+++ b/packages/camera/camera_platform_interface/pubspec.yaml
@@ -4,7 +4,7 @@
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
# NOTE: We strongly prefer non-breaking changes, even at the expense of a
# less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
-version: 2.3.2
+version: 2.3.3
environment:
sdk: '>=2.12.0 <3.0.0'
diff --git a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart
index a58f7b4..ed61515 100644
--- a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart
+++ b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart
@@ -484,11 +484,13 @@
]);
expect(cameras.length, returnData.length);
for (int i = 0; i < returnData.length; i++) {
+ final Map<String, Object?> typedData =
+ (returnData[i] as Map<dynamic, dynamic>).cast<String, Object?>();
final CameraDescription cameraDescription = CameraDescription(
- name: returnData[i]['name']! as String,
- lensDirection: parseCameraLensDirection(
- returnData[i]['lensFacing']! as String),
- sensorOrientation: returnData[i]['sensorOrientation']! as int,
+ name: typedData['name']! as String,
+ lensDirection:
+ parseCameraLensDirection(typedData['lensFacing']! as String),
+ sensorOrientation: typedData['sensorOrientation']! as int,
);
expect(cameras[i], cameraDescription);
}
diff --git a/packages/camera/camera_web/example/integration_test/camera_test.dart b/packages/camera/camera_web/example/integration_test/camera_test.dart
index 50451b9..705d775 100644
--- a/packages/camera/camera_web/example/integration_test/camera_test.dart
+++ b/packages/camera/camera_web/example/integration_test/camera_test.dart
@@ -1286,11 +1286,10 @@
capturedVideoPartTwo,
];
- videoDataAvailableListener
- ..call(FakeBlobEvent(capturedVideoPartOne))
- ..call(FakeBlobEvent(capturedVideoPartTwo));
+ videoDataAvailableListener(FakeBlobEvent(capturedVideoPartOne));
+ videoDataAvailableListener(FakeBlobEvent(capturedVideoPartTwo));
- videoRecordingStoppedListener.call(Event('stop'));
+ videoRecordingStoppedListener(Event('stop'));
final XFile videoFile = await videoFileFuture;
@@ -1378,7 +1377,7 @@
when(() => mediaRecorder.state).thenReturn('recording');
- videoDataAvailableListener.call(FakeBlobEvent(Blob(<Object>[])));
+ videoDataAvailableListener(FakeBlobEvent(Blob(<Object>[])));
await Future<void>.microtask(() {});
@@ -1412,7 +1411,7 @@
await camera.startVideoRecording();
- videoRecordingStoppedListener.call(Event('stop'));
+ videoRecordingStoppedListener(Event('stop'));
await Future<void>.microtask(() {});
@@ -1435,7 +1434,7 @@
await camera.startVideoRecording();
- videoRecordingStoppedListener.call(Event('stop'));
+ videoRecordingStoppedListener(Event('stop'));
await Future<void>.microtask(() {});
@@ -1464,7 +1463,7 @@
await camera.startVideoRecording();
- videoRecordingStoppedListener.call(Event('stop'));
+ videoRecordingStoppedListener(Event('stop'));
await Future<void>.microtask(() {});
@@ -1588,8 +1587,8 @@
return finalVideo!;
};
- videoDataAvailableListener.call(FakeBlobEvent(Blob(<Object>[])));
- videoRecordingStoppedListener.call(Event('stop'));
+ videoDataAvailableListener(FakeBlobEvent(Blob(<Object>[])));
+ videoRecordingStoppedListener(Event('stop'));
expect(
await streamQueue.next,
diff --git a/packages/camera/camera_windows/CHANGELOG.md b/packages/camera/camera_windows/CHANGELOG.md
index f46bb66..a6269b9 100644
--- a/packages/camera/camera_windows/CHANGELOG.md
+++ b/packages/camera/camera_windows/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.2.1+4
+
+* Updates code for stricter lint checks.
+
## 0.2.1+3
* Updates to latest camera platform interface but fails if user attempts to use streaming with recording (since streaming is currently unsupported on Windows).
diff --git a/packages/camera/camera_windows/lib/camera_windows.dart b/packages/camera/camera_windows/lib/camera_windows.dart
index 79dd305..4b0c158 100644
--- a/packages/camera/camera_windows/lib/camera_windows.dart
+++ b/packages/camera/camera_windows/lib/camera_windows.dart
@@ -399,24 +399,25 @@
);
break;
case 'video_recorded':
+ final Map<String, Object?> arguments =
+ (call.arguments as Map<Object?, Object?>).cast<String, Object?>();
+ final int? maxDuration = arguments['maxVideoDuration'] as int?;
// This is called if maxVideoDuration was given on record start.
cameraEventStreamController.add(
VideoRecordedEvent(
cameraId,
- XFile(call.arguments['path'] as String),
- call.arguments['maxVideoDuration'] != null
- ? Duration(
- milliseconds: call.arguments['maxVideoDuration'] as int,
- )
- : null,
+ XFile(arguments['path']! as String),
+ maxDuration != null ? Duration(milliseconds: maxDuration) : null,
),
);
break;
case 'error':
+ final Map<String, Object?> arguments =
+ (call.arguments as Map<Object?, Object?>).cast<String, Object?>();
cameraEventStreamController.add(
CameraErrorEvent(
cameraId,
- call.arguments['description'] as String,
+ arguments['description']! as String,
),
);
break;
diff --git a/packages/camera/camera_windows/pubspec.yaml b/packages/camera/camera_windows/pubspec.yaml
index 523ee14..d87491a 100644
--- a/packages/camera/camera_windows/pubspec.yaml
+++ b/packages/camera/camera_windows/pubspec.yaml
@@ -2,7 +2,7 @@
description: A Flutter plugin for getting information about and controlling the camera on Windows.
repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_windows
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
-version: 0.2.1+3
+version: 0.2.1+4
environment:
sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/camera/camera_windows/test/camera_windows_test.dart b/packages/camera/camera_windows/test/camera_windows_test.dart
index 615020e..8d7b5d3 100644
--- a/packages/camera/camera_windows/test/camera_windows_test.dart
+++ b/packages/camera/camera_windows/test/camera_windows_test.dart
@@ -335,11 +335,13 @@
]);
expect(cameras.length, returnData.length);
for (int i = 0; i < returnData.length; i++) {
+ final Map<String, Object?> typedData =
+ (returnData[i] as Map<dynamic, dynamic>).cast<String, Object?>();
final CameraDescription cameraDescription = CameraDescription(
- name: returnData[i]['name']! as String,
- lensDirection: plugin.parseCameraLensDirection(
- returnData[i]['lensFacing']! as String),
- sensorOrientation: returnData[i]['sensorOrientation']! as int,
+ name: typedData['name']! as String,
+ lensDirection: plugin
+ .parseCameraLensDirection(typedData['lensFacing']! as String),
+ sensorOrientation: typedData['sensorOrientation']! as int,
);
expect(cameras[i], cameraDescription);
}
diff --git a/packages/google_maps_flutter/google_maps_flutter/test/fake_maps_controllers.dart b/packages/google_maps_flutter/google_maps_flutter/test/fake_maps_controllers.dart
index 9fe6923..b2747c9 100644
--- a/packages/google_maps_flutter/google_maps_flutter/test/fake_maps_controllers.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/test/fake_maps_controllers.dart
@@ -93,7 +93,9 @@
Future<dynamic> onMethodCall(MethodCall call) {
switch (call.method) {
case 'map#update':
- updateOptions(call.arguments['options'] as Map<dynamic, dynamic>);
+ final Map<String, Object?> arguments =
+ (call.arguments as Map<Object?, Object?>).cast<String, Object?>();
+ updateOptions(arguments['options']! as Map<dynamic, dynamic>);
return Future<void>.sync(() {});
case 'markers#update':
updateMarkers(call.arguments as Map<dynamic, dynamic>?);
@@ -218,17 +220,18 @@
return result;
}
+ // Converts a list of points expressed as two-element lists of doubles into
+ // a list of `LatLng`s. All list items are assumed to be non-null.
List<LatLng> _deserializePoints(List<dynamic> points) {
- return points.map<LatLng>((dynamic list) {
- return LatLng(list[0] as double, list[1] as double);
+ return points.map<LatLng>((dynamic item) {
+ final List<Object?> list = item as List<Object?>;
+ return LatLng(list[0]! as double, list[1]! as double);
}).toList();
}
List<List<LatLng>> _deserializeHoles(List<dynamic> holes) {
return holes.map<List<LatLng>>((dynamic hole) {
- return hole.map<LatLng>((dynamic list) {
- return LatLng(list[0] as double, list[1] as double);
- }).toList() as List<LatLng>;
+ return _deserializePoints(hole as List<dynamic>);
}).toList();
}
diff --git a/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md
index 7b697b4..66c5fcf 100644
--- a/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md
+++ b/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.4.2
+
+* Updates code for stricter lint checks.
+
## 2.4.1
* Update `androidx.test.espresso:espresso-core` to 3.5.1.
diff --git a/packages/google_maps_flutter/google_maps_flutter_android/lib/src/google_maps_flutter_android.dart b/packages/google_maps_flutter/google_maps_flutter_android/lib/src/google_maps_flutter_android.dart
index 11af3fe..0188bb1 100644
--- a/packages/google_maps_flutter/google_maps_flutter_android/lib/src/google_maps_flutter_android.dart
+++ b/packages/google_maps_flutter/google_maps_flutter_android/lib/src/google_maps_flutter_android.dart
@@ -190,81 +190,93 @@
_mapEventStreamController.add(CameraMoveStartedEvent(mapId));
break;
case 'camera#onMove':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(CameraMoveEvent(
mapId,
- CameraPosition.fromMap(call.arguments['position'])!,
+ CameraPosition.fromMap(arguments['position'])!,
));
break;
case 'camera#onIdle':
_mapEventStreamController.add(CameraIdleEvent(mapId));
break;
case 'marker#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MarkerTapEvent(
mapId,
- MarkerId(call.arguments['markerId'] as String),
+ MarkerId(arguments['markerId']! as String),
));
break;
case 'marker#onDragStart':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MarkerDragStartEvent(
mapId,
- LatLng.fromJson(call.arguments['position'])!,
- MarkerId(call.arguments['markerId'] as String),
+ LatLng.fromJson(arguments['position'])!,
+ MarkerId(arguments['markerId']! as String),
));
break;
case 'marker#onDrag':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MarkerDragEvent(
mapId,
- LatLng.fromJson(call.arguments['position'])!,
- MarkerId(call.arguments['markerId'] as String),
+ LatLng.fromJson(arguments['position'])!,
+ MarkerId(arguments['markerId']! as String),
));
break;
case 'marker#onDragEnd':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MarkerDragEndEvent(
mapId,
- LatLng.fromJson(call.arguments['position'])!,
- MarkerId(call.arguments['markerId'] as String),
+ LatLng.fromJson(arguments['position'])!,
+ MarkerId(arguments['markerId']! as String),
));
break;
case 'infoWindow#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(InfoWindowTapEvent(
mapId,
- MarkerId(call.arguments['markerId'] as String),
+ MarkerId(arguments['markerId']! as String),
));
break;
case 'polyline#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(PolylineTapEvent(
mapId,
- PolylineId(call.arguments['polylineId'] as String),
+ PolylineId(arguments['polylineId']! as String),
));
break;
case 'polygon#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(PolygonTapEvent(
mapId,
- PolygonId(call.arguments['polygonId'] as String),
+ PolygonId(arguments['polygonId']! as String),
));
break;
case 'circle#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(CircleTapEvent(
mapId,
- CircleId(call.arguments['circleId'] as String),
+ CircleId(arguments['circleId']! as String),
));
break;
case 'map#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MapTapEvent(
mapId,
- LatLng.fromJson(call.arguments['position'])!,
+ LatLng.fromJson(arguments['position'])!,
));
break;
case 'map#onLongPress':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MapLongPressEvent(
mapId,
- LatLng.fromJson(call.arguments['position'])!,
+ LatLng.fromJson(arguments['position'])!,
));
break;
case 'tileOverlay#getTile':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
final Map<TileOverlayId, TileOverlay>? tileOverlaysForThisMap =
_tileOverlays[mapId];
- final String tileOverlayId = call.arguments['tileOverlayId'] as String;
+ final String tileOverlayId = arguments['tileOverlayId']! as String;
final TileOverlay? tileOverlay =
tileOverlaysForThisMap?[TileOverlayId(tileOverlayId)];
final TileProvider? tileProvider = tileOverlay?.tileProvider;
@@ -272,9 +284,9 @@
return TileProvider.noTile.toJson();
}
final Tile tile = await tileProvider.getTile(
- call.arguments['x'] as int,
- call.arguments['y'] as int,
- call.arguments['zoom'] as int?,
+ arguments['x']! as int,
+ arguments['y']! as int,
+ arguments['zoom'] as int?,
);
return tile.toJson();
default:
@@ -282,6 +294,14 @@
}
}
+ /// Returns the arguments of [call] as typed string-keyed Map.
+ ///
+ /// This does not do any type validation, so is only safe to call if the
+ /// arguments are known to be a map.
+ Map<String, Object?> _getArgumentDictionary(MethodCall call) {
+ return (call.arguments as Map<Object?, Object?>).cast<String, Object?>();
+ }
+
@override
Future<void> updateMapOptions(
Map<String, dynamic> optionsUpdate, {
diff --git a/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml
index ee7a61d..492193e 100644
--- a/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml
+++ b/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml
@@ -2,7 +2,7 @@
description: Android implementation of the google_maps_flutter plugin.
repository: https://github.com/flutter/plugins/tree/main/packages/google_maps_flutter/google_maps_flutter_android
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22
-version: 2.4.1
+version: 2.4.2
environment:
sdk: ">=2.14.0 <3.0.0"
diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md
index e5f232d..fa135d8 100644
--- a/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md
+++ b/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md
@@ -1,5 +1,6 @@
-## NEXT
+## 2.1.13
+* Updates code for stricter lint checks.
* Updates code for new analysis options.
* Re-enable XCUITests: testUserInterface.
* Remove unnecessary `RunnerUITests` target from Podfile of the example app.
diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/lib/src/google_maps_flutter_ios.dart b/packages/google_maps_flutter/google_maps_flutter_ios/lib/src/google_maps_flutter_ios.dart
index 5298377..a0b46f0 100644
--- a/packages/google_maps_flutter/google_maps_flutter_ios/lib/src/google_maps_flutter_ios.dart
+++ b/packages/google_maps_flutter/google_maps_flutter_ios/lib/src/google_maps_flutter_ios.dart
@@ -172,81 +172,93 @@
_mapEventStreamController.add(CameraMoveStartedEvent(mapId));
break;
case 'camera#onMove':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(CameraMoveEvent(
mapId,
- CameraPosition.fromMap(call.arguments['position'])!,
+ CameraPosition.fromMap(arguments['position'])!,
));
break;
case 'camera#onIdle':
_mapEventStreamController.add(CameraIdleEvent(mapId));
break;
case 'marker#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MarkerTapEvent(
mapId,
- MarkerId(call.arguments['markerId'] as String),
+ MarkerId(arguments['markerId']! as String),
));
break;
case 'marker#onDragStart':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MarkerDragStartEvent(
mapId,
- LatLng.fromJson(call.arguments['position'])!,
- MarkerId(call.arguments['markerId'] as String),
+ LatLng.fromJson(arguments['position'])!,
+ MarkerId(arguments['markerId']! as String),
));
break;
case 'marker#onDrag':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MarkerDragEvent(
mapId,
- LatLng.fromJson(call.arguments['position'])!,
- MarkerId(call.arguments['markerId'] as String),
+ LatLng.fromJson(arguments['position'])!,
+ MarkerId(arguments['markerId']! as String),
));
break;
case 'marker#onDragEnd':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MarkerDragEndEvent(
mapId,
- LatLng.fromJson(call.arguments['position'])!,
- MarkerId(call.arguments['markerId'] as String),
+ LatLng.fromJson(arguments['position'])!,
+ MarkerId(arguments['markerId']! as String),
));
break;
case 'infoWindow#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(InfoWindowTapEvent(
mapId,
- MarkerId(call.arguments['markerId'] as String),
+ MarkerId(arguments['markerId']! as String),
));
break;
case 'polyline#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(PolylineTapEvent(
mapId,
- PolylineId(call.arguments['polylineId'] as String),
+ PolylineId(arguments['polylineId']! as String),
));
break;
case 'polygon#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(PolygonTapEvent(
mapId,
- PolygonId(call.arguments['polygonId'] as String),
+ PolygonId(arguments['polygonId']! as String),
));
break;
case 'circle#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(CircleTapEvent(
mapId,
- CircleId(call.arguments['circleId'] as String),
+ CircleId(arguments['circleId']! as String),
));
break;
case 'map#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MapTapEvent(
mapId,
- LatLng.fromJson(call.arguments['position'])!,
+ LatLng.fromJson(arguments['position'])!,
));
break;
case 'map#onLongPress':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MapLongPressEvent(
mapId,
- LatLng.fromJson(call.arguments['position'])!,
+ LatLng.fromJson(arguments['position'])!,
));
break;
case 'tileOverlay#getTile':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
final Map<TileOverlayId, TileOverlay>? tileOverlaysForThisMap =
_tileOverlays[mapId];
- final String tileOverlayId = call.arguments['tileOverlayId'] as String;
+ final String tileOverlayId = arguments['tileOverlayId']! as String;
final TileOverlay? tileOverlay =
tileOverlaysForThisMap?[TileOverlayId(tileOverlayId)];
final TileProvider? tileProvider = tileOverlay?.tileProvider;
@@ -254,9 +266,9 @@
return TileProvider.noTile.toJson();
}
final Tile tile = await tileProvider.getTile(
- call.arguments['x'] as int,
- call.arguments['y'] as int,
- call.arguments['zoom'] as int?,
+ arguments['x']! as int,
+ arguments['y']! as int,
+ arguments['zoom'] as int?,
);
return tile.toJson();
default:
@@ -264,6 +276,14 @@
}
}
+ /// Returns the arguments of [call] as typed string-keyed Map.
+ ///
+ /// This does not do any type validation, so is only safe to call if the
+ /// arguments are known to be a map.
+ Map<String, Object?> _getArgumentDictionary(MethodCall call) {
+ return (call.arguments as Map<Object?, Object?>).cast<String, Object?>();
+ }
+
@override
Future<void> updateMapOptions(
Map<String, dynamic> optionsUpdate, {
diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_ios/pubspec.yaml
index 7ca13a9..579b243 100644
--- a/packages/google_maps_flutter/google_maps_flutter_ios/pubspec.yaml
+++ b/packages/google_maps_flutter/google_maps_flutter_ios/pubspec.yaml
@@ -2,7 +2,7 @@
description: iOS implementation of the google_maps_flutter plugin.
repository: https://github.com/flutter/plugins/tree/main/packages/google_maps_flutter/google_maps_flutter_ios
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22
-version: 2.1.12
+version: 2.1.13
environment:
sdk: ">=2.14.0 <3.0.0"
diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md
index a41d1fe..307b700 100644
--- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md
+++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.2.5
+
+* Updates code for stricter lint checks.
+
## 2.2.4
* Updates code for `no_leading_underscores_for_local_identifiers` lint.
diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/method_channel/method_channel_google_maps_flutter.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/method_channel/method_channel_google_maps_flutter.dart
index e17510f..3fd860e 100644
--- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/method_channel/method_channel_google_maps_flutter.dart
+++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/method_channel/method_channel_google_maps_flutter.dart
@@ -175,81 +175,93 @@
_mapEventStreamController.add(CameraMoveStartedEvent(mapId));
break;
case 'camera#onMove':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(CameraMoveEvent(
mapId,
- CameraPosition.fromMap(call.arguments['position'])!,
+ CameraPosition.fromMap(arguments['position'])!,
));
break;
case 'camera#onIdle':
_mapEventStreamController.add(CameraIdleEvent(mapId));
break;
case 'marker#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MarkerTapEvent(
mapId,
- MarkerId(call.arguments['markerId'] as String),
+ MarkerId(arguments['markerId']! as String),
));
break;
case 'marker#onDragStart':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MarkerDragStartEvent(
mapId,
- LatLng.fromJson(call.arguments['position'])!,
- MarkerId(call.arguments['markerId'] as String),
+ LatLng.fromJson(arguments['position'])!,
+ MarkerId(arguments['markerId']! as String),
));
break;
case 'marker#onDrag':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MarkerDragEvent(
mapId,
- LatLng.fromJson(call.arguments['position'])!,
- MarkerId(call.arguments['markerId'] as String),
+ LatLng.fromJson(arguments['position'])!,
+ MarkerId(arguments['markerId']! as String),
));
break;
case 'marker#onDragEnd':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MarkerDragEndEvent(
mapId,
- LatLng.fromJson(call.arguments['position'])!,
- MarkerId(call.arguments['markerId'] as String),
+ LatLng.fromJson(arguments['position'])!,
+ MarkerId(arguments['markerId']! as String),
));
break;
case 'infoWindow#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(InfoWindowTapEvent(
mapId,
- MarkerId(call.arguments['markerId'] as String),
+ MarkerId(arguments['markerId']! as String),
));
break;
case 'polyline#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(PolylineTapEvent(
mapId,
- PolylineId(call.arguments['polylineId'] as String),
+ PolylineId(arguments['polylineId']! as String),
));
break;
case 'polygon#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(PolygonTapEvent(
mapId,
- PolygonId(call.arguments['polygonId'] as String),
+ PolygonId(arguments['polygonId']! as String),
));
break;
case 'circle#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(CircleTapEvent(
mapId,
- CircleId(call.arguments['circleId'] as String),
+ CircleId(arguments['circleId']! as String),
));
break;
case 'map#onTap':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MapTapEvent(
mapId,
- LatLng.fromJson(call.arguments['position'])!,
+ LatLng.fromJson(arguments['position'])!,
));
break;
case 'map#onLongPress':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
_mapEventStreamController.add(MapLongPressEvent(
mapId,
- LatLng.fromJson(call.arguments['position'])!,
+ LatLng.fromJson(arguments['position'])!,
));
break;
case 'tileOverlay#getTile':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
final Map<TileOverlayId, TileOverlay>? tileOverlaysForThisMap =
_tileOverlays[mapId];
- final String tileOverlayId = call.arguments['tileOverlayId'] as String;
+ final String tileOverlayId = arguments['tileOverlayId']! as String;
final TileOverlay? tileOverlay =
tileOverlaysForThisMap?[TileOverlayId(tileOverlayId)];
final TileProvider? tileProvider = tileOverlay?.tileProvider;
@@ -257,9 +269,9 @@
return TileProvider.noTile.toJson();
}
final Tile tile = await tileProvider.getTile(
- call.arguments['x'] as int,
- call.arguments['y'] as int,
- call.arguments['zoom'] as int?,
+ arguments['x']! as int,
+ arguments['y']! as int,
+ arguments['zoom'] as int?,
);
return tile.toJson();
default:
@@ -267,6 +279,14 @@
}
}
+ /// Returns the arguments of [call] as typed string-keyed Map.
+ ///
+ /// This does not do any type validation, so is only safe to call if the
+ /// arguments are known to be a map.
+ Map<String, Object?> _getArgumentDictionary(MethodCall call) {
+ return (call.arguments as Map<Object?, Object?>).cast<String, Object?>();
+ }
+
@override
Future<void> updateMapOptions(
Map<String, dynamic> optionsUpdate, {
diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml
index 5639ee8..40b058a 100644
--- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml
+++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml
@@ -4,7 +4,7 @@
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22
# NOTE: We strongly prefer non-breaking changes, even at the expense of a
# less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
-version: 2.2.4
+version: 2.2.5
environment:
sdk: '>=2.12.0 <3.0.0'
diff --git a/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md
index 2333f7d..3bbc08a 100644
--- a/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md
+++ b/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md
@@ -1,5 +1,6 @@
-## NEXT
+## 0.4.0+4
+* Updates code for stricter lint checks.
* Updates code for `no_leading_underscores_for_local_identifiers` lint.
## 0.4.0+3
diff --git a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/convert.dart b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/convert.dart
index 2b09950..d5f27ee 100644
--- a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/convert.dart
+++ b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/convert.dart
@@ -416,31 +416,46 @@
// Translates a [CameraUpdate] into operations on a [gmaps.GMap].
void _applyCameraUpdate(gmaps.GMap map, CameraUpdate update) {
+ // Casts [value] to a JSON dictionary (string -> nullable object). [value]
+ // must be a non-null JSON dictionary.
+ Map<String, Object?> asJsonObject(dynamic value) {
+ return (value as Map<Object?, Object?>).cast<String, Object?>();
+ }
+
+ // Casts [value] to a JSON list. [value] must be a non-null JSON list.
+ List<Object?> asJsonList(dynamic value) {
+ return value as List<Object?>;
+ }
+
final List<dynamic> json = update.toJson() as List<dynamic>;
switch (json[0]) {
case 'newCameraPosition':
- map.heading = json[1]['bearing'] as num?;
- map.zoom = json[1]['zoom'] as num?;
+ final Map<String, Object?> position = asJsonObject(json[1]);
+ final List<Object?> latLng = asJsonList(position['target']);
+ map.heading = position['bearing'] as num?;
+ map.zoom = position['zoom'] as num?;
map.panTo(
- gmaps.LatLng(
- json[1]['target'][0] as num?,
- json[1]['target'][1] as num?,
- ),
+ gmaps.LatLng(latLng[0] as num?, latLng[1] as num?),
);
- map.tilt = json[1]['tilt'] as num?;
+ map.tilt = position['tilt'] as num?;
break;
case 'newLatLng':
- map.panTo(gmaps.LatLng(json[1][0] as num?, json[1][1] as num?));
+ final List<Object?> latLng = asJsonList(json[1]);
+ map.panTo(gmaps.LatLng(latLng[0] as num?, latLng[1] as num?));
break;
case 'newLatLngZoom':
+ final List<Object?> latLng = asJsonList(json[1]);
map.zoom = json[2] as num?;
- map.panTo(gmaps.LatLng(json[1][0] as num?, json[1][1] as num?));
+ map.panTo(gmaps.LatLng(latLng[0] as num?, latLng[1] as num?));
break;
case 'newLatLngBounds':
+ final List<Object?> latLngPair = asJsonList(json[1]);
+ final List<Object?> latLng1 = asJsonList(latLngPair[0]);
+ final List<Object?> latLng2 = asJsonList(latLngPair[1]);
map.fitBounds(
gmaps.LatLngBounds(
- gmaps.LatLng(json[1][0][0] as num?, json[1][0][1] as num?),
- gmaps.LatLng(json[1][1][0] as num?, json[1][1][1] as num?),
+ gmaps.LatLng(latLng1[0] as num?, latLng1[1] as num?),
+ gmaps.LatLng(latLng2[0] as num?, latLng2[1] as num?),
),
);
// padding = json[2];
@@ -456,10 +471,11 @@
final int newZoomDelta =
zoomDelta < 0 ? zoomDelta.floor() : zoomDelta.ceil();
if (json.length == 3) {
+ final List<Object?> latLng = asJsonList(json[2]);
// With focus
try {
focusLatLng =
- _pixelToLatLng(map, json[2][0] as int, json[2][1] as int);
+ _pixelToLatLng(map, latLng[0]! as int, latLng[1]! as int);
} catch (e) {
// https://github.com/a14n/dart-google-maps/issues/87
// print('Error computing new focus LatLng. JS Error: ' + e.toString());
diff --git a/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml
index 572d911..6278ab0 100644
--- a/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml
+++ b/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml
@@ -2,7 +2,7 @@
description: Web platform implementation of google_maps_flutter
repository: https://github.com/flutter/plugins/tree/main/packages/google_maps_flutter/google_maps_flutter_web
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22
-version: 0.4.0+3
+version: 0.4.0+4
environment:
sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/google_sign_in/google_sign_in/CHANGELOG.md b/packages/google_sign_in/google_sign_in/CHANGELOG.md
index 9349784..c7ddb6b 100644
--- a/packages/google_sign_in/google_sign_in/CHANGELOG.md
+++ b/packages/google_sign_in/google_sign_in/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 5.4.3
+
+* Updates code for stricter lint checks.
+
## 5.4.2
* Updates minimum Flutter version to 2.10.
diff --git a/packages/google_sign_in/google_sign_in/example/lib/main.dart b/packages/google_sign_in/google_sign_in/example/lib/main.dart
index 889993b..271069e 100644
--- a/packages/google_sign_in/google_sign_in/example/lib/main.dart
+++ b/packages/google_sign_in/google_sign_in/example/lib/main.dart
@@ -86,12 +86,14 @@
String? _pickFirstNamedContact(Map<String, dynamic> data) {
final List<dynamic>? connections = data['connections'] as List<dynamic>?;
final Map<String, dynamic>? contact = connections?.firstWhere(
- (dynamic contact) => contact['names'] != null,
+ (dynamic contact) => (contact as Map<Object?, dynamic>)['names'] != null,
orElse: () => null,
) as Map<String, dynamic>?;
if (contact != null) {
- final Map<String, dynamic>? name = contact['names'].firstWhere(
- (dynamic name) => name['displayName'] != null,
+ final List<dynamic> names = contact['names'] as List<dynamic>;
+ final Map<String, dynamic>? name = names.firstWhere(
+ (dynamic name) =>
+ (name as Map<Object?, dynamic>)['displayName'] != null,
orElse: () => null,
) as Map<String, dynamic>?;
if (name != null) {
diff --git a/packages/google_sign_in/google_sign_in/lib/google_sign_in.dart b/packages/google_sign_in/google_sign_in/lib/google_sign_in.dart
index 3ae0223..8e908dc 100644
--- a/packages/google_sign_in/google_sign_in/lib/google_sign_in.dart
+++ b/packages/google_sign_in/google_sign_in/lib/google_sign_in.dart
@@ -267,7 +267,8 @@
// Future that completes when we've finished calling `init` on the native side
Future<void>? _initialization;
- Future<GoogleSignInAccount?> _callMethod(Function method) async {
+ Future<GoogleSignInAccount?> _callMethod(
+ Future<dynamic> Function() method) async {
await _ensureInitialized();
final dynamic response = await method();
@@ -324,7 +325,7 @@
/// method call may be skipped, if there's already [_currentUser] information.
/// This is used from the [signIn] and [signInSilently] methods.
Future<GoogleSignInAccount?> _addMethodCall(
- Function method, {
+ Future<dynamic> Function() method, {
bool canSkipCall = false,
}) async {
Future<GoogleSignInAccount?> response;
diff --git a/packages/google_sign_in/google_sign_in/pubspec.yaml b/packages/google_sign_in/google_sign_in/pubspec.yaml
index c32dee7..f6e1faf 100644
--- a/packages/google_sign_in/google_sign_in/pubspec.yaml
+++ b/packages/google_sign_in/google_sign_in/pubspec.yaml
@@ -3,7 +3,7 @@
for signing in with a Google account on Android and iOS.
repository: https://github.com/flutter/plugins/tree/main/packages/google_sign_in/google_sign_in
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+google_sign_in%22
-version: 5.4.2
+version: 5.4.3
environment:
diff --git a/packages/google_sign_in/google_sign_in_android/test/google_sign_in_android_test.dart b/packages/google_sign_in/google_sign_in_android/test/google_sign_in_android_test.dart
index c081418..2565836 100644
--- a/packages/google_sign_in/google_sign_in_android/test/google_sign_in_android_test.dart
+++ b/packages/google_sign_in/google_sign_in_android/test/google_sign_in_android_test.dart
@@ -99,7 +99,7 @@
});
test('Other functions pass through arguments to the channel', () async {
- final Map<Function, Matcher> tests = <Function, Matcher>{
+ final Map<void Function(), Matcher> tests = <void Function(), Matcher>{
() {
googleSignIn.init(
hostedDomain: 'example.com',
@@ -152,7 +152,7 @@
googleSignIn.isSignedIn: isMethodCall('isSignedIn', arguments: null),
};
- for (final Function f in tests.keys) {
+ for (final void Function() f in tests.keys) {
f();
}
diff --git a/packages/google_sign_in/google_sign_in_ios/test/google_sign_in_ios_test.dart b/packages/google_sign_in/google_sign_in_ios/test/google_sign_in_ios_test.dart
index 4584298..0fee1af 100644
--- a/packages/google_sign_in/google_sign_in_ios/test/google_sign_in_ios_test.dart
+++ b/packages/google_sign_in/google_sign_in_ios/test/google_sign_in_ios_test.dart
@@ -114,7 +114,7 @@
});
test('Other functions pass through arguments to the channel', () async {
- final Map<Function, Matcher> tests = <Function, Matcher>{
+ final Map<void Function(), Matcher> tests = <void Function(), Matcher>{
() {
googleSignIn.init(
hostedDomain: 'example.com',
@@ -155,7 +155,7 @@
googleSignIn.isSignedIn: isMethodCall('isSignedIn', arguments: null),
};
- for (final Function f in tests.keys) {
+ for (final void Function() f in tests.keys) {
f();
}
diff --git a/packages/google_sign_in/google_sign_in_platform_interface/test/method_channel_google_sign_in_test.dart b/packages/google_sign_in/google_sign_in_platform_interface/test/method_channel_google_sign_in_test.dart
index 944ad34..0972d0b 100644
--- a/packages/google_sign_in/google_sign_in_platform_interface/test/method_channel_google_sign_in_test.dart
+++ b/packages/google_sign_in/google_sign_in_platform_interface/test/method_channel_google_sign_in_test.dart
@@ -95,7 +95,7 @@
});
test('Other functions pass through arguments to the channel', () async {
- final Map<Function, Matcher> tests = <Function, Matcher>{
+ final Map<void Function(), Matcher> tests = <void Function(), Matcher>{
() {
googleSignIn.init(
hostedDomain: 'example.com',
@@ -132,7 +132,7 @@
googleSignIn.isSignedIn: isMethodCall('isSignedIn', arguments: null),
};
- for (final Function f in tests.keys) {
+ for (final void Function() f in tests.keys) {
f();
}
diff --git a/packages/image_picker/image_picker_windows/test/image_picker_windows_test.dart b/packages/image_picker/image_picker_windows/test/image_picker_windows_test.dart
index 3b27c08..f8adde4 100644
--- a/packages/image_picker/image_picker_windows/test/image_picker_windows_test.dart
+++ b/packages/image_picker/image_picker_windows/test/image_picker_windows_test.dart
@@ -15,6 +15,12 @@
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
+ // Returns the captured type groups from a mock call result, assuming that
+ // exactly one call was made and only the type groups were captured.
+ List<XTypeGroup> capturedTypeGroups(VerificationResult result) {
+ return result.captured.single as List<XTypeGroup>;
+ }
+
group('$ImagePickerWindows()', () {
final ImagePickerWindows plugin = ImagePickerWindows();
late MockFileSelectorPlatform mockFileSelectorPlatform;
@@ -42,12 +48,10 @@
test('pickImage passes the accepted type groups correctly', () async {
await plugin.pickImage(source: ImageSource.gallery);
- expect(
- verify(mockFileSelectorPlatform.openFile(
- acceptedTypeGroups: captureAnyNamed('acceptedTypeGroups')))
- .captured
- .single[0]
- .extensions,
+ final VerificationResult result = verify(
+ mockFileSelectorPlatform.openFile(
+ acceptedTypeGroups: captureAnyNamed('acceptedTypeGroups')));
+ expect(capturedTypeGroups(result)[0].extensions,
ImagePickerWindows.imageFormats);
});
@@ -60,12 +64,10 @@
test('getImage passes the accepted type groups correctly', () async {
await plugin.getImage(source: ImageSource.gallery);
- expect(
- verify(mockFileSelectorPlatform.openFile(
- acceptedTypeGroups: captureAnyNamed('acceptedTypeGroups')))
- .captured
- .single[0]
- .extensions,
+ final VerificationResult result = verify(
+ mockFileSelectorPlatform.openFile(
+ acceptedTypeGroups: captureAnyNamed('acceptedTypeGroups')));
+ expect(capturedTypeGroups(result)[0].extensions,
ImagePickerWindows.imageFormats);
});
@@ -78,12 +80,10 @@
test('getMultiImage passes the accepted type groups correctly', () async {
await plugin.getMultiImage();
- expect(
- verify(mockFileSelectorPlatform.openFiles(
- acceptedTypeGroups: captureAnyNamed('acceptedTypeGroups')))
- .captured
- .single[0]
- .extensions,
+ final VerificationResult result = verify(
+ mockFileSelectorPlatform.openFiles(
+ acceptedTypeGroups: captureAnyNamed('acceptedTypeGroups')));
+ expect(capturedTypeGroups(result)[0].extensions,
ImagePickerWindows.imageFormats);
});
});
@@ -91,12 +91,10 @@
test('pickVideo passes the accepted type groups correctly', () async {
await plugin.pickVideo(source: ImageSource.gallery);
- expect(
- verify(mockFileSelectorPlatform.openFile(
- acceptedTypeGroups: captureAnyNamed('acceptedTypeGroups')))
- .captured
- .single[0]
- .extensions,
+ final VerificationResult result = verify(
+ mockFileSelectorPlatform.openFile(
+ acceptedTypeGroups: captureAnyNamed('acceptedTypeGroups')));
+ expect(capturedTypeGroups(result)[0].extensions,
ImagePickerWindows.videoFormats);
});
@@ -109,12 +107,10 @@
test('getVideo passes the accepted type groups correctly', () async {
await plugin.getVideo(source: ImageSource.gallery);
- expect(
- verify(mockFileSelectorPlatform.openFile(
- acceptedTypeGroups: captureAnyNamed('acceptedTypeGroups')))
- .captured
- .single[0]
- .extensions,
+ final VerificationResult result = verify(
+ mockFileSelectorPlatform.openFile(
+ acceptedTypeGroups: captureAnyNamed('acceptedTypeGroups')));
+ expect(capturedTypeGroups(result)[0].extensions,
ImagePickerWindows.videoFormats);
});
diff --git a/packages/in_app_purchase/in_app_purchase_android/CHANGELOG.md b/packages/in_app_purchase/in_app_purchase_android/CHANGELOG.md
index 4aa14a8..11192c3 100644
--- a/packages/in_app_purchase/in_app_purchase_android/CHANGELOG.md
+++ b/packages/in_app_purchase/in_app_purchase_android/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.2.3+8
+
+* Updates code for stricter lint checks.
+
## 0.2.3+7
* Updates code for new analysis options.
diff --git a/packages/in_app_purchase/in_app_purchase_android/lib/src/billing_client_wrappers/billing_client_wrapper.dart b/packages/in_app_purchase/in_app_purchase_android/lib/src/billing_client_wrappers/billing_client_wrapper.dart
index b64eaab..2d4a3f9 100644
--- a/packages/in_app_purchase/in_app_purchase_android/lib/src/billing_client_wrappers/billing_client_wrapper.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/lib/src/billing_client_wrappers/billing_client_wrapper.dart
@@ -343,8 +343,12 @@
(call.arguments as Map<dynamic, dynamic>).cast<String, dynamic>()));
break;
case _kOnBillingServiceDisconnected:
- final int handle = call.arguments['handle'] as int;
- await _callbacks[_kOnBillingServiceDisconnected]![handle]();
+ final int handle =
+ (call.arguments as Map<Object?, Object?>)['handle']! as int;
+ final List<OnBillingServiceDisconnected> onDisconnected =
+ _callbacks[_kOnBillingServiceDisconnected]!
+ .cast<OnBillingServiceDisconnected>();
+ onDisconnected[handle]();
break;
}
}
diff --git a/packages/in_app_purchase/in_app_purchase_android/pubspec.yaml b/packages/in_app_purchase/in_app_purchase_android/pubspec.yaml
index d70e5df..663f56f 100644
--- a/packages/in_app_purchase/in_app_purchase_android/pubspec.yaml
+++ b/packages/in_app_purchase/in_app_purchase_android/pubspec.yaml
@@ -2,7 +2,7 @@
description: An implementation for the Android platform of the Flutter `in_app_purchase` plugin. This uses the Android BillingClient APIs.
repository: https://github.com/flutter/plugins/tree/main/packages/in_app_purchase/in_app_purchase_android
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+in_app_purchase%22
-version: 0.2.3+7
+version: 0.2.3+8
environment:
sdk: ">=2.14.0 <3.0.0"
diff --git a/packages/in_app_purchase/in_app_purchase_android/test/in_app_purchase_android_platform_test.dart b/packages/in_app_purchase/in_app_purchase_android/test/in_app_purchase_android_platform_test.dart
index b6055cc..70e519c 100644
--- a/packages/in_app_purchase/in_app_purchase_android/test/in_app_purchase_android_platform_test.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/test/in_app_purchase_android_platform_test.dart
@@ -426,7 +426,8 @@
name: consumeMethodName,
value: buildBillingResultMap(expectedBillingResultForConsume),
additionalStepBeforeReturn: (dynamic args) {
- final String purchaseToken = args['purchaseToken'] as String;
+ final String purchaseToken =
+ (args as Map<Object?, Object?>)['purchaseToken']! as String;
consumeCompleter.complete(purchaseToken);
});
@@ -540,7 +541,8 @@
name: consumeMethodName,
value: buildBillingResultMap(expectedBillingResultForConsume),
additionalStepBeforeReturn: (dynamic args) {
- final String purchaseToken = args['purchaseToken'] as String;
+ final String purchaseToken =
+ (args as Map<Object?, Object?>)['purchaseToken']! as String;
consumeCompleter.complete(purchaseToken);
});
@@ -617,7 +619,8 @@
name: consumeMethodName,
value: buildBillingResultMap(expectedBillingResultForConsume),
additionalStepBeforeReturn: (dynamic args) {
- final String purchaseToken = args['purchaseToken'] as String;
+ final String purchaseToken =
+ (args as Map<Object?, Object?>)['purchaseToken']! as String;
consumeCompleter.complete(purchaseToken);
});
@@ -682,7 +685,8 @@
name: consumeMethodName,
value: buildBillingResultMap(expectedBillingResultForConsume),
additionalStepBeforeReturn: (dynamic args) {
- final String purchaseToken = args['purchaseToken'] as String;
+ final String purchaseToken =
+ (args as Map<Object?, Object?>)['purchaseToken']! as String;
consumeCompleter.complete(purchaseToken);
});
diff --git a/packages/in_app_purchase/in_app_purchase_storekit/CHANGELOG.md b/packages/in_app_purchase/in_app_purchase_storekit/CHANGELOG.md
index 3839419..434caf4 100644
--- a/packages/in_app_purchase/in_app_purchase_storekit/CHANGELOG.md
+++ b/packages/in_app_purchase/in_app_purchase_storekit/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.3.4+1
+
+* Updates code for stricter lint checks.
+
## 0.3.4
* Adds macOS as a supported platform.
diff --git a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart
index d360a2d..859946b 100644
--- a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart
+++ b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart
@@ -245,11 +245,13 @@
}
case 'shouldAddStorePayment':
{
+ final Map<Object?, Object?> arguments =
+ call.arguments as Map<Object?, Object?>;
final SKPaymentWrapper payment = SKPaymentWrapper.fromJson(
- (call.arguments['payment'] as Map<dynamic, dynamic>)
+ (arguments['payment']! as Map<dynamic, dynamic>)
.cast<String, dynamic>());
final SKProductWrapper product = SKProductWrapper.fromJson(
- (call.arguments['product'] as Map<dynamic, dynamic>)
+ (arguments['product']! as Map<dynamic, dynamic>)
.cast<String, dynamic>());
return Future<void>(() {
if (observer.shouldAddStorePayment(
@@ -290,12 +292,14 @@
final SKPaymentQueueDelegateWrapper delegate = _paymentQueueDelegate!;
switch (call.method) {
case 'shouldContinueTransaction':
+ final Map<Object?, Object?> arguments =
+ call.arguments as Map<Object?, Object?>;
final SKPaymentTransactionWrapper transaction =
SKPaymentTransactionWrapper.fromJson(
- (call.arguments['transaction'] as Map<dynamic, dynamic>)
+ (arguments['transaction']! as Map<dynamic, dynamic>)
.cast<String, dynamic>());
final SKStorefrontWrapper storefront = SKStorefrontWrapper.fromJson(
- (call.arguments['storefront'] as Map<dynamic, dynamic>)
+ (arguments['storefront']! as Map<dynamic, dynamic>)
.cast<String, dynamic>());
return delegate.shouldContinueTransaction(transaction, storefront);
case 'shouldShowPriceConsent':
diff --git a/packages/in_app_purchase/in_app_purchase_storekit/pubspec.yaml b/packages/in_app_purchase/in_app_purchase_storekit/pubspec.yaml
index f45b3ac..339d123 100644
--- a/packages/in_app_purchase/in_app_purchase_storekit/pubspec.yaml
+++ b/packages/in_app_purchase/in_app_purchase_storekit/pubspec.yaml
@@ -2,7 +2,7 @@
description: An implementation for the iOS and macOS platforms of the Flutter `in_app_purchase` plugin. This uses the StoreKit Framework.
repository: https://github.com/flutter/plugins/tree/main/packages/in_app_purchase/in_app_purchase_storekit
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+in_app_purchase%22
-version: 0.3.4
+version: 0.3.4+1
environment:
sdk: ">=2.14.0 <3.0.0"
diff --git a/packages/in_app_purchase/in_app_purchase_storekit/test/fakes/fake_storekit_platform.dart b/packages/in_app_purchase/in_app_purchase_storekit/test/fakes/fake_storekit_platform.dart
index e6b9696..dfc715c 100644
--- a/packages/in_app_purchase/in_app_purchase_storekit/test/fakes/fake_storekit_platform.dart
+++ b/packages/in_app_purchase/in_app_purchase_storekit/test/fakes/fake_storekit_platform.dart
@@ -169,14 +169,15 @@
receiptData = 'refreshed receipt data';
return Future<void>.sync(() {});
case '-[InAppPurchasePlugin addPayment:result:]':
- final String id = call.arguments['productIdentifier'] as String;
- final int quantity = call.arguments['quantity'] as int;
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
+ final String id = arguments['productIdentifier']! as String;
+ final int quantity = arguments['quantity']! as int;
// Keep the received paymentDiscount parameter when testing payment with discount.
- if (call.arguments['applicationUsername'] == 'userWithDiscount') {
- if (call.arguments['paymentDiscount'] != null) {
- final Map<dynamic, dynamic> discountArgument =
- call.arguments['paymentDiscount'] as Map<dynamic, dynamic>;
+ if (arguments['applicationUsername']! == 'userWithDiscount') {
+ final Map<dynamic, dynamic>? discountArgument =
+ arguments['paymentDiscount'] as Map<dynamic, dynamic>?;
+ if (discountArgument != null) {
discountReceived = discountArgument.cast<String, dynamic>();
} else {
discountReceived = <String, dynamic>{};
@@ -210,9 +211,10 @@
}
break;
case '-[InAppPurchasePlugin finishTransaction:result:]':
+ final Map<String, Object?> arguments = _getArgumentDictionary(call);
finishedTransactions.add(createPurchasedTransaction(
- call.arguments['productIdentifier'] as String,
- call.arguments['transactionIdentifier'] as String,
+ arguments['productIdentifier']! as String,
+ arguments['transactionIdentifier']! as String,
quantity: transactions.first.payment.quantity));
break;
case '-[SKPaymentQueue startObservingTransactionQueue]':
@@ -224,4 +226,12 @@
}
return Future<void>.sync(() {});
}
+
+ /// Returns the arguments of [call] as typed string-keyed Map.
+ ///
+ /// This does not do any type validation, so is only safe to call if the
+ /// arguments are known to be a map.
+ Map<String, Object?> _getArgumentDictionary(MethodCall call) {
+ return (call.arguments as Map<Object?, Object?>).cast<String, Object?>();
+ }
}
diff --git a/packages/shared_preferences/shared_preferences_android/test/shared_preferences_android_test.dart b/packages/shared_preferences/shared_preferences_android/test/shared_preferences_android_test.dart
index d9c9213..fb67648 100644
--- a/packages/shared_preferences/shared_preferences_android/test/shared_preferences_android_test.dart
+++ b/packages/shared_preferences/shared_preferences_android/test/shared_preferences_android_test.dart
@@ -33,13 +33,20 @@
setUp(() async {
testData = InMemorySharedPreferencesStore.empty();
+ Map<String, Object?> getArgumentDictionary(MethodCall call) {
+ return (call.arguments as Map<Object?, Object?>)
+ .cast<String, Object?>();
+ }
+
channel.setMockMethodCallHandler((MethodCall methodCall) async {
log.add(methodCall);
if (methodCall.method == 'getAll') {
return testData.getAll();
}
if (methodCall.method == 'remove') {
- final String key = methodCall.arguments['key']! as String;
+ final Map<String, Object?> arguments =
+ getArgumentDictionary(methodCall);
+ final String key = arguments['key']! as String;
return testData.remove(key);
}
if (methodCall.method == 'clear') {
@@ -49,8 +56,10 @@
final Match? match = setterRegExp.matchAsPrefix(methodCall.method);
if (match?.groupCount == 1) {
final String valueType = match!.group(1)!;
- final String key = methodCall.arguments['key'] as String;
- final Object value = methodCall.arguments['value'] as Object;
+ final Map<String, Object?> arguments =
+ getArgumentDictionary(methodCall);
+ final String key = arguments['key']! as String;
+ final Object value = arguments['value']!;
return testData.setValue(valueType, key, value);
}
fail('Unexpected method call: ${methodCall.method}');
diff --git a/packages/shared_preferences/shared_preferences_platform_interface/test/method_channel_shared_preferences_test.dart b/packages/shared_preferences/shared_preferences_platform_interface/test/method_channel_shared_preferences_test.dart
index ed4ecc7..da333cf 100644
--- a/packages/shared_preferences/shared_preferences_platform_interface/test/method_channel_shared_preferences_test.dart
+++ b/packages/shared_preferences/shared_preferences_platform_interface/test/method_channel_shared_preferences_test.dart
@@ -31,13 +31,20 @@
setUp(() async {
testData = InMemorySharedPreferencesStore.empty();
+ Map<String, Object?> getArgumentDictionary(MethodCall call) {
+ return (call.arguments as Map<Object?, Object?>)
+ .cast<String, Object?>();
+ }
+
channel.setMockMethodCallHandler((MethodCall methodCall) async {
log.add(methodCall);
if (methodCall.method == 'getAll') {
return testData.getAll();
}
if (methodCall.method == 'remove') {
- final String key = (methodCall.arguments['key'] as String?)!;
+ final Map<String, Object?> arguments =
+ getArgumentDictionary(methodCall);
+ final String key = arguments['key']! as String;
return testData.remove(key);
}
if (methodCall.method == 'clear') {
@@ -47,8 +54,10 @@
final Match? match = setterRegExp.matchAsPrefix(methodCall.method);
if (match?.groupCount == 1) {
final String valueType = match!.group(1)!;
- final String key = (methodCall.arguments['key'] as String?)!;
- final Object value = (methodCall.arguments['value'] as Object?)!;
+ final Map<String, Object?> arguments =
+ getArgumentDictionary(methodCall);
+ final String key = arguments['key']! as String;
+ final Object value = arguments['value']!;
return testData.setValue(valueType, key, value);
}
fail('Unexpected method call: ${methodCall.method}');
diff --git a/packages/url_launcher/url_launcher_android/test/url_launcher_android_test.dart b/packages/url_launcher/url_launcher_android/test/url_launcher_android_test.dart
index eebd8cd..b8ccc2c 100644
--- a/packages/url_launcher/url_launcher_android/test/url_launcher_android_test.dart
+++ b/packages/url_launcher/url_launcher_android/test/url_launcher_android_test.dart
@@ -61,7 +61,8 @@
const String genericUrl = 'http://flutter.dev';
channel.setMockMethodCallHandler((MethodCall methodCall) async {
log.add(methodCall);
- return methodCall.arguments['url'] != specificUrl;
+ return (methodCall.arguments as Map<Object?, Object?>)['url'] !=
+ specificUrl;
});
final UrlLauncherAndroid launcher = UrlLauncherAndroid();
@@ -69,7 +70,7 @@
expect(canLaunch, true);
expect(log.length, 2);
- expect(log[1].arguments['url'], genericUrl);
+ expect((log[1].arguments as Map<Object?, Object?>)['url'], genericUrl);
});
test('checks a generic URL if an https URL returns false', () async {
@@ -77,7 +78,8 @@
const String genericUrl = 'https://flutter.dev';
channel.setMockMethodCallHandler((MethodCall methodCall) async {
log.add(methodCall);
- return methodCall.arguments['url'] != specificUrl;
+ return (methodCall.arguments as Map<Object?, Object?>)['url'] !=
+ specificUrl;
});
final UrlLauncherAndroid launcher = UrlLauncherAndroid();
@@ -85,7 +87,7 @@
expect(canLaunch, true);
expect(log.length, 2);
- expect(log[1].arguments['url'], genericUrl);
+ expect((log[1].arguments as Map<Object?, Object?>)['url'], genericUrl);
});
test('does not a generic URL if a non-web URL returns false', () async {
diff --git a/packages/webview_flutter/webview_flutter_android/example/integration_test/legacy/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_android/example/integration_test/legacy/webview_flutter_test.dart
index 57d3399..180175a 100644
--- a/packages/webview_flutter/webview_flutter_android/example/integration_test/legacy/webview_flutter_test.dart
+++ b/packages/webview_flutter/webview_flutter_android/example/integration_test/legacy/webview_flutter_test.dart
@@ -985,6 +985,11 @@
final Map<String, dynamic> viewportRectRelativeToViewport =
jsonDecode(viewportRectJSON) as Map<String, dynamic>;
+ num getDomRectComponent(
+ Map<String, dynamic> rectAsJson, String component) {
+ return rectAsJson[component]! as num;
+ }
+
// Check that the input is originally outside of the viewport.
final String initialInputClientRectJSON =
@@ -994,8 +999,9 @@
jsonDecode(initialInputClientRectJSON) as Map<String, dynamic>;
expect(
- initialInputClientRectRelativeToViewport['bottom'] <=
- viewportRectRelativeToViewport['bottom'],
+ getDomRectComponent(
+ initialInputClientRectRelativeToViewport, 'bottom') <=
+ getDomRectComponent(viewportRectRelativeToViewport, 'bottom'),
isFalse);
await controller.runJavascript('inputEl.focus()');
@@ -1009,21 +1015,22 @@
jsonDecode(lastInputClientRectJSON) as Map<String, dynamic>;
expect(
- lastInputClientRectRelativeToViewport['top'] >=
- viewportRectRelativeToViewport['top'],
+ getDomRectComponent(lastInputClientRectRelativeToViewport, 'top') >=
+ getDomRectComponent(viewportRectRelativeToViewport, 'top'),
isTrue);
expect(
- lastInputClientRectRelativeToViewport['bottom'] <=
- viewportRectRelativeToViewport['bottom'],
+ getDomRectComponent(
+ lastInputClientRectRelativeToViewport, 'bottom') <=
+ getDomRectComponent(viewportRectRelativeToViewport, 'bottom'),
isTrue);
expect(
- lastInputClientRectRelativeToViewport['left'] >=
- viewportRectRelativeToViewport['left'],
+ getDomRectComponent(lastInputClientRectRelativeToViewport, 'left') >=
+ getDomRectComponent(viewportRectRelativeToViewport, 'left'),
isTrue);
expect(
- lastInputClientRectRelativeToViewport['right'] <=
- viewportRectRelativeToViewport['right'],
+ getDomRectComponent(lastInputClientRectRelativeToViewport, 'right') <=
+ getDomRectComponent(viewportRectRelativeToViewport, 'right'),
isTrue);
});
});
diff --git a/packages/webview_flutter/webview_flutter_android/test/legacy/surface_android_test.dart b/packages/webview_flutter/webview_flutter_android/test/legacy/surface_android_test.dart
index 1657e1b..196e7cc 100644
--- a/packages/webview_flutter/webview_flutter_android/test/legacy/surface_android_test.dart
+++ b/packages/webview_flutter/webview_flutter_android/test/legacy/surface_android_test.dart
@@ -21,9 +21,12 @@
(MethodCall call) async {
log.add(call);
if (call.method == 'resize') {
+ final Map<String, Object?> arguments =
+ (call.arguments as Map<Object?, Object?>)
+ .cast<String, Object?>();
return <String, Object?>{
- 'width': call.arguments['width'],
- 'height': call.arguments['height'],
+ 'width': arguments['width'],
+ 'height': arguments['height'],
};
}
},
diff --git a/packages/webview_flutter/webview_flutter_android/test/legacy/webview_android_widget_test.dart b/packages/webview_flutter/webview_flutter_android/test/legacy/webview_android_widget_test.dart
index 909607a..22c161a 100644
--- a/packages/webview_flutter/webview_flutter_android/test/legacy/webview_android_widget_test.dart
+++ b/packages/webview_flutter/webview_flutter_android/test/legacy/webview_android_widget_test.dart
@@ -210,8 +210,10 @@
),
);
- final List<dynamic> javaScriptChannels =
- verify(mockWebView.addJavaScriptChannel(captureAny)).captured;
+ final List<android_webview.JavaScriptChannel> javaScriptChannels =
+ verify(mockWebView.addJavaScriptChannel(captureAny))
+ .captured
+ .cast<android_webview.JavaScriptChannel>();
expect(javaScriptChannels[0].channelName, 'a');
expect(javaScriptChannels[1].channelName, 'b');
});
@@ -656,8 +658,10 @@
await buildWidget(tester);
await testController.addJavascriptChannels(<String>{'c', 'd'});
- final List<dynamic> javaScriptChannels =
- verify(mockWebView.addJavaScriptChannel(captureAny)).captured;
+ final List<android_webview.JavaScriptChannel> javaScriptChannels =
+ verify(mockWebView.addJavaScriptChannel(captureAny))
+ .captured
+ .cast<android_webview.JavaScriptChannel>();
expect(javaScriptChannels[0].channelName, 'c');
expect(javaScriptChannels[1].channelName, 'd');
});
@@ -667,8 +671,10 @@
await testController.addJavascriptChannels(<String>{'c', 'd'});
await testController.removeJavascriptChannels(<String>{'c', 'd'});
- final List<dynamic> javaScriptChannels =
- verify(mockWebView.removeJavaScriptChannel(captureAny)).captured;
+ final List<android_webview.JavaScriptChannel> javaScriptChannels =
+ verify(mockWebView.removeJavaScriptChannel(captureAny))
+ .captured
+ .cast<android_webview.JavaScriptChannel>();
expect(javaScriptChannels[0].channelName, 'c');
expect(javaScriptChannels[1].channelName, 'd');
});
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
index 7ae38d3..b4ad2a1 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 3.0.2
+
+* Updates code for stricter lint checks.
+
## 3.0.1
* Adds support for retrieving navigation type with internal class.
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart
index cc901a4..4d10db9 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart
+++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart
@@ -353,9 +353,9 @@
// unsupported. This also goes for `null` and `undefined` on iOS 14+. For
// example, when running a void function. For ease of use, this specific
// error is ignored when no return value is expected.
- if (exception.details is! NSError ||
- exception.details.code !=
- WKErrorCode.javaScriptResultTypeIsUnsupported) {
+ final Object? details = exception.details;
+ if (details is! NSError ||
+ details.code != WKErrorCode.javaScriptResultTypeIsUnsupported) {
rethrow;
}
}
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart
index 4821941..dc90906 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart
+++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart
@@ -269,9 +269,9 @@
// unsupported. This also goes for `null` and `undefined` on iOS 14+. For
// example, when running a void function. For ease of use, this specific
// error is ignored when no return value is expected.
- if (exception.details is! NSError ||
- exception.details.code !=
- WKErrorCode.javaScriptResultTypeIsUnsupported) {
+ final Object? details = exception.details;
+ if (details is! NSError ||
+ details.code != WKErrorCode.javaScriptResultTypeIsUnsupported) {
rethrow;
}
}
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
index 27a6a78..85440f6 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
+++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
@@ -2,7 +2,7 @@
description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control.
repository: https://github.com/flutter/plugins/tree/main/packages/webview_flutter/webview_flutter_wkwebview
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
-version: 3.0.1
+version: 3.0.2
environment:
sdk: ">=2.17.0 <3.0.0"
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.dart
index da7ce9b..7982be1 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.dart
+++ b/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.dart
@@ -137,13 +137,13 @@
(WidgetTester tester) async {
await buildWidget(tester);
- final dynamic onCreateWebView = verify(
- mockWebViewWidgetProxy.createUIDelgate(
+ final void Function(WKWebView, WKWebViewConfiguration, WKNavigationAction)
+ onCreateWebView = verify(mockWebViewWidgetProxy.createUIDelgate(
onCreateWebView: captureAnyNamed('onCreateWebView')))
- .captured
- .single
- as void Function(
- WKWebView, WKWebViewConfiguration, WKNavigationAction);
+ .captured
+ .single
+ as void Function(
+ WKWebView, WKWebViewConfiguration, WKNavigationAction);
const NSUrlRequest request = NSUrlRequest(url: 'https://google.com');
onCreateWebView(
@@ -989,7 +989,7 @@
testWidgets('onPageStarted', (WidgetTester tester) async {
await buildWidget(tester);
- final dynamic didStartProvisionalNavigation =
+ final void Function(WKWebView, String) didStartProvisionalNavigation =
verify(mockWebViewWidgetProxy.createNavigationDelegate(
didFinishNavigation: anyNamed('didFinishNavigation'),
didStartProvisionalNavigation:
@@ -1010,7 +1010,7 @@
testWidgets('onPageFinished', (WidgetTester tester) async {
await buildWidget(tester);
- final dynamic didFinishNavigation =
+ final void Function(WKWebView, String) didFinishNavigation =
verify(mockWebViewWidgetProxy.createNavigationDelegate(
didFinishNavigation: captureAnyNamed('didFinishNavigation'),
didStartProvisionalNavigation:
@@ -1032,7 +1032,7 @@
(WidgetTester tester) async {
await buildWidget(tester);
- final dynamic didFailNavigation =
+ final void Function(WKWebView, NSError) didFailNavigation =
verify(mockWebViewWidgetProxy.createNavigationDelegate(
didFinishNavigation: anyNamed('didFinishNavigation'),
didStartProvisionalNavigation:
@@ -1069,7 +1069,7 @@
(WidgetTester tester) async {
await buildWidget(tester);
- final dynamic didFailProvisionalNavigation =
+ final void Function(WKWebView, NSError) didFailProvisionalNavigation =
verify(mockWebViewWidgetProxy.createNavigationDelegate(
didFinishNavigation: anyNamed('didFinishNavigation'),
didStartProvisionalNavigation:
@@ -1110,7 +1110,7 @@
(WidgetTester tester) async {
await buildWidget(tester);
- final dynamic webViewWebContentProcessDidTerminate =
+ final void Function(WKWebView) webViewWebContentProcessDidTerminate =
verify(mockWebViewWidgetProxy.createNavigationDelegate(
didFinishNavigation: anyNamed('didFinishNavigation'),
didStartProvisionalNavigation:
@@ -1142,7 +1142,8 @@
(WidgetTester tester) async {
await buildWidget(tester, hasNavigationDelegate: true);
- final dynamic decidePolicyForNavigationAction =
+ final Future<WKNavigationActionPolicy> Function(
+ WKWebView, WKNavigationAction) decidePolicyForNavigationAction =
verify(mockWebViewWidgetProxy.createNavigationDelegate(
didFinishNavigation: anyNamed('didFinishNavigation'),
didStartProvisionalNavigation:
@@ -1191,15 +1192,13 @@
},
));
- final dynamic observeValue = verify(
- mockWebViewWidgetProxy.createWebView(any,
- observeValue: captureAnyNamed('observeValue')))
- .captured
- .single as void Function(
- String keyPath,
- NSObject object,
- Map<NSKeyValueChangeKey, Object?> change,
- );
+ final void Function(String, NSObject, Map<NSKeyValueChangeKey, Object?>)
+ observeValue = verify(mockWebViewWidgetProxy.createWebView(any,
+ observeValue: captureAnyNamed('observeValue')))
+ .captured
+ .single
+ as void Function(
+ String, NSObject, Map<NSKeyValueChangeKey, Object?>);
observeValue(
'estimatedProgress',
@@ -1234,15 +1233,14 @@
await buildWidget(tester);
await testController.addJavascriptChannels(<String>{'hello'});
- final dynamic didReceiveScriptMessage = verify(
- mockWebViewWidgetProxy.createScriptMessageHandler(
- didReceiveScriptMessage:
- captureAnyNamed('didReceiveScriptMessage')))
- .captured
- .single as void Function(
- WKUserContentController userContentController,
- WKScriptMessage message,
- );
+ final void Function(WKUserContentController, WKScriptMessage)
+ didReceiveScriptMessage = verify(
+ mockWebViewWidgetProxy.createScriptMessageHandler(
+ didReceiveScriptMessage:
+ captureAnyNamed('didReceiveScriptMessage')))
+ .captured
+ .single
+ as void Function(WKUserContentController, WKScriptMessage);
didReceiveScriptMessage(
mockUserContentController,
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart
index a2b456e..401aebf 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart
+++ b/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart
@@ -116,13 +116,15 @@
completion(true),
);
- final List<WKWebsiteDataTypeEnumData> typeData =
+ final List<dynamic> capturedArgs =
verify(mockPlatformHostApi.removeDataOfTypes(
instanceManager.getIdentifier(websiteDataStore),
captureAny,
5.0,
- )).captured.single.cast<WKWebsiteDataTypeEnumData>()
- as List<WKWebsiteDataTypeEnumData>;
+ )).captured;
+ final List<WKWebsiteDataTypeEnumData> typeData =
+ (capturedArgs.single as List<Object?>)
+ .cast<WKWebsiteDataTypeEnumData>();
expect(typeData.single.value, WKWebsiteDataTypeEnum.cookies);
});
diff --git a/script/tool/lib/src/common/git_version_finder.dart b/script/tool/lib/src/common/git_version_finder.dart
index b135424..3965ae0 100644
--- a/script/tool/lib/src/common/git_version_finder.dart
+++ b/script/tool/lib/src/common/git_version_finder.dart
@@ -88,7 +88,8 @@
if (fileContent.trim().isEmpty) {
return null;
}
- final String? versionString = loadYaml(fileContent)['version'] as String?;
+ final YamlMap fileYaml = loadYaml(fileContent) as YamlMap;
+ final String? versionString = fileYaml['version'] as String?;
return versionString == null ? null : Version.parse(versionString);
}
diff --git a/script/tool/lib/src/common/pub_version_finder.dart b/script/tool/lib/src/common/pub_version_finder.dart
index 572cb91..c24ec42 100644
--- a/script/tool/lib/src/common/pub_version_finder.dart
+++ b/script/tool/lib/src/common/pub_version_finder.dart
@@ -44,11 +44,13 @@
result: PubVersionFinderResult.fail,
httpResponse: response);
}
- final List<Version> versions =
- (json.decode(response.body)['versions'] as List<dynamic>)
- .map<Version>((final dynamic versionString) =>
- Version.parse(versionString as String))
- .toList();
+ final Map<Object?, Object?> responseBody =
+ json.decode(response.body) as Map<Object?, Object?>;
+ final List<Version> versions = (responseBody['versions']! as List<Object?>)
+ .cast<String>()
+ .map<Version>(
+ (final String versionString) => Version.parse(versionString))
+ .toList();
return PubVersionFinderResponse(
versions: versions,
diff --git a/script/tool/lib/src/create_all_packages_app_command.dart b/script/tool/lib/src/create_all_packages_app_command.dart
index 4660413..e7719e9 100644
--- a/script/tool/lib/src/create_all_packages_app_command.dart
+++ b/script/tool/lib/src/create_all_packages_app_command.dart
@@ -244,24 +244,23 @@
###''';
}
- String _pubspecMapString(Map<String, dynamic> values) {
+ String _pubspecMapString(Map<String, Object?> values) {
final StringBuffer buffer = StringBuffer();
- for (final MapEntry<String, dynamic> entry in values.entries) {
+ for (final MapEntry<String, Object?> entry in values.entries) {
buffer.writeln();
- if (entry.value is VersionConstraint) {
- String value = entry.value.toString();
+ final Object? entryValue = entry.value;
+ if (entryValue is VersionConstraint) {
+ String value = entryValue.toString();
// Range constraints require quoting.
if (value.startsWith('>') || value.startsWith('<')) {
value = "'$value'";
}
buffer.write(' ${entry.key}: $value');
- } else if (entry.value is SdkDependency) {
- final SdkDependency dep = entry.value as SdkDependency;
- buffer.write(' ${entry.key}: \n sdk: ${dep.sdk}');
- } else if (entry.value is PathDependency) {
- final PathDependency dep = entry.value as PathDependency;
- String depPath = dep.path;
+ } else if (entryValue is SdkDependency) {
+ buffer.write(' ${entry.key}: \n sdk: ${entryValue.sdk}');
+ } else if (entryValue is PathDependency) {
+ String depPath = entryValue.path;
if (path.style == p.Style.windows) {
// Posix-style path separators are preferred in pubspec.yaml (and
// using a consistent format makes unit testing simpler), so convert.
@@ -278,7 +277,7 @@
buffer.write(' ${entry.key}: \n path: $depPath');
} else {
throw UnimplementedError(
- 'Not available for type: ${entry.value.runtimeType}',
+ 'Not available for type: ${entryValue.runtimeType}',
);
}
}
diff --git a/script/tool/lib/src/dependabot_check_command.dart b/script/tool/lib/src/dependabot_check_command.dart
index 5aa762e..77b44e1 100644
--- a/script/tool/lib/src/dependabot_check_command.dart
+++ b/script/tool/lib/src/dependabot_check_command.dart
@@ -58,8 +58,9 @@
const String typeKey = 'package-ecosystem';
const String dirKey = 'directory';
_gradleDirs = entries
- .where((dynamic entry) => entry[typeKey] == 'gradle')
- .map((dynamic entry) => (entry as YamlMap)[dirKey] as String)
+ .cast<YamlMap>()
+ .where((YamlMap entry) => entry[typeKey] == 'gradle')
+ .map((YamlMap entry) => entry[dirKey] as String)
.toSet();
}
diff --git a/script/tool/lib/src/format_command.dart b/script/tool/lib/src/format_command.dart
index 8198f6d..43c450c 100644
--- a/script/tool/lib/src/format_command.dart
+++ b/script/tool/lib/src/format_command.dart
@@ -298,13 +298,13 @@
Future<List<String>> _whichAll(String command) async {
try {
final io.ProcessResult result =
- await processRunner.run('which', <String>['-a', command]);
+ await processRunner.run('which', <String>['-a', command]);
if (result.exitCode != 0) {
return <String>[];
}
- final String stdout = result.stdout.trim() as String;
+ final String stdout = (result.stdout as String).trim();
if (stdout.isEmpty) {
return <String>[];
}
diff --git a/script/tool/lib/src/pubspec_check_command.dart b/script/tool/lib/src/pubspec_check_command.dart
index 79ef1e1..5682ba0 100644
--- a/script/tool/lib/src/pubspec_check_command.dart
+++ b/script/tool/lib/src/pubspec_check_command.dart
@@ -244,8 +244,8 @@
required RepositoryPackage package,
}) {
if (_isImplementationPackage(package)) {
- final String? implements =
- pubspec.flutter!['plugin']!['implements'] as String?;
+ final YamlMap pluginSection = pubspec.flutter!['plugin'] as YamlMap;
+ final String? implements = pluginSection['implements'] as String?;
final String expectedImplements = package.directory.parent.basename;
if (implements == null) {
return 'Missing "implements: $expectedImplements" in "plugin" section.';
@@ -265,19 +265,20 @@
Pubspec pubspec, {
required RepositoryPackage package,
}) {
- final dynamic platformsEntry = pubspec.flutter!['plugin']!['platforms'];
- if (platformsEntry == null) {
+ final YamlMap pluginSection = pubspec.flutter!['plugin'] as YamlMap;
+ final YamlMap? platforms = pluginSection['platforms'] as YamlMap?;
+ if (platforms == null) {
logWarning('Does not implement any platforms');
return null;
}
- final YamlMap platforms = platformsEntry as YamlMap;
final String packageName = package.directory.basename;
// Validate that the default_package entries look correct (e.g., no typos).
final Set<String> defaultPackages = <String>{};
- for (final MapEntry<dynamic, dynamic> platformEntry in platforms.entries) {
+ for (final MapEntry<Object?, Object?> platformEntry in platforms.entries) {
+ final YamlMap platformDetails = platformEntry.value! as YamlMap;
final String? defaultPackage =
- platformEntry.value['default_package'] as String?;
+ platformDetails['default_package'] as String?;
if (defaultPackage != null) {
defaultPackages.add(defaultPackage);
if (!defaultPackage.startsWith('${packageName}_')) {
diff --git a/script/tool/lib/src/readme_check_command.dart b/script/tool/lib/src/readme_check_command.dart
index e3fbc7b..cbbb8b8 100644
--- a/script/tool/lib/src/readme_check_command.dart
+++ b/script/tool/lib/src/readme_check_command.dart
@@ -234,7 +234,8 @@
}
// Validate that the supported OS lists match.
- final dynamic platformsEntry = pubspec.flutter!['plugin']!['platforms'];
+ final YamlMap pluginSection = pubspec.flutter!['plugin'] as YamlMap;
+ final dynamic platformsEntry = pluginSection['platforms'];
if (platformsEntry == null) {
logWarning('Plugin not support any platforms');
return null;
diff --git a/script/tool/test/common/git_version_finder_test.dart b/script/tool/test/common/git_version_finder_test.dart
index d5a5dd4..538b72a 100644
--- a/script/tool/test/common/git_version_finder_test.dart
+++ b/script/tool/test/common/git_version_finder_test.dart
@@ -22,12 +22,14 @@
gitDir = MockGitDir();
when(gitDir.runCommand(any, throwOnError: anyNamed('throwOnError')))
.thenAnswer((Invocation invocation) {
- gitDirCommands.add(invocation.positionalArguments[0] as List<String>?);
+ final List<String> arguments =
+ invocation.positionalArguments[0]! as List<String>;
+ gitDirCommands.add(arguments);
final MockProcessResult mockProcessResult = MockProcessResult();
- if (invocation.positionalArguments[0][0] == 'diff') {
+ if (arguments[0] == 'diff') {
when<String?>(mockProcessResult.stdout as String?)
.thenReturn(gitDiffResponse);
- } else if (invocation.positionalArguments[0][0] == 'merge-base') {
+ } else if (arguments[0] == 'merge-base') {
when<String?>(mockProcessResult.stdout as String?)
.thenReturn(mergeBaseResponse);
}
diff --git a/script/tool/test/common/package_looping_command_test.dart b/script/tool/test/common/package_looping_command_test.dart
index f90d58e..34f346c 100644
--- a/script/tool/test/common/package_looping_command_test.dart
+++ b/script/tool/test/common/package_looping_command_test.dart
@@ -110,8 +110,10 @@
final MockGitDir gitDir = MockGitDir();
when(gitDir.runCommand(any, throwOnError: anyNamed('throwOnError')))
.thenAnswer((Invocation invocation) {
+ final List<String> arguments =
+ invocation.positionalArguments[0]! as List<String>;
final MockProcessResult mockProcessResult = MockProcessResult();
- if (invocation.positionalArguments[0][0] == 'diff') {
+ if (arguments[0] == 'diff') {
when<String?>(mockProcessResult.stdout as String?)
.thenReturn(gitDiffResponse);
}