[camera_platform_interface] Migrate to null safety (#3497)
diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md
index ff73991..ab3d559 100644
--- a/packages/camera/camera_platform_interface/CHANGELOG.md
+++ b/packages/camera/camera_platform_interface/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.0.0-nullsafety
+
+- Migrate to null safety.
+
## 1.6.0
- Added VideoRecordedEvent to support ending a video recording in the native implementation.
diff --git a/packages/camera/camera_platform_interface/lib/src/events/camera_event.dart b/packages/camera/camera_platform_interface/lib/src/events/camera_event.dart
index ad99583..20aa41c 100644
--- a/packages/camera/camera_platform_interface/lib/src/events/camera_event.dart
+++ b/packages/camera/camera_platform_interface/lib/src/events/camera_event.dart
@@ -70,12 +70,12 @@
CameraInitializedEvent(
int cameraId,
this.previewWidth,
- this.previewHeight, [
+ this.previewHeight,
this.exposureMode,
- this.exposurePointSupported = false,
+ this.exposurePointSupported,
this.focusMode,
- this.focusPointSupported = false,
- ]) : super(cameraId);
+ this.focusPointSupported,
+ ) : super(cameraId);
/// Converts the supplied [Map] to an instance of the [CameraInitializedEvent]
/// class.
@@ -242,7 +242,7 @@
final XFile file;
/// Maximum duration of the recorded video.
- final Duration maxVideoDuration;
+ final Duration? maxVideoDuration;
/// Build a VideoRecordedEvent triggered from the camera with the `cameraId`.
///
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 36a2c92..3537a5c 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
@@ -11,6 +11,7 @@
import 'package:camera_platform_interface/src/types/image_format_group.dart';
import 'package:camera_platform_interface/src/utils/utils.dart';
import 'package:cross_file/cross_file.dart';
+import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:meta/meta.dart';
@@ -58,8 +59,13 @@
@override
Future<List<CameraDescription>> availableCameras() async {
try {
- final List<Map<dynamic, dynamic>> cameras = await _channel
+ final cameras = await _channel
.invokeListMethod<Map<dynamic, dynamic>>('availableCameras');
+
+ if (cameras == null) {
+ return <CameraDescription>[];
+ }
+
return cameras.map((Map<dynamic, dynamic> camera) {
return CameraDescription(
name: camera['name'],
@@ -75,30 +81,30 @@
@override
Future<int> createCamera(
CameraDescription cameraDescription,
- ResolutionPreset resolutionPreset, {
- bool enableAudio,
+ ResolutionPreset? resolutionPreset, {
+ bool enableAudio = true,
}) async {
try {
- final Map<String, dynamic> reply =
- await _channel.invokeMapMethod<String, dynamic>(
- 'create',
- <String, dynamic>{
- 'cameraName': cameraDescription.name,
- 'resolutionPreset': resolutionPreset != null
- ? _serializeResolutionPreset(resolutionPreset)
- : null,
- 'enableAudio': enableAudio,
- },
- );
- return reply['cameraId'];
+ final reply = await _channel
+ .invokeMapMethod<String, dynamic>('create', <String, dynamic>{
+ 'cameraName': cameraDescription.name,
+ 'resolutionPreset': resolutionPreset != null
+ ? _serializeResolutionPreset(resolutionPreset)
+ : null,
+ 'enableAudio': enableAudio,
+ });
+
+ return reply!['cameraId'];
} on PlatformException catch (e) {
throw CameraException(e.code, e.message);
}
}
@override
- Future<void> initializeCamera(int cameraId,
- {ImageFormatGroup imageFormatGroup}) {
+ Future<void> initializeCamera(
+ int cameraId, {
+ ImageFormatGroup imageFormatGroup = ImageFormatGroup.unknown,
+ }) {
_channels.putIfAbsent(cameraId, () {
final channel = MethodChannel('flutter.io/cameraPlugin/camera$cameraId');
channel.setMethodCallHandler(
@@ -125,15 +131,16 @@
@override
Future<void> dispose(int cameraId) async {
+ if (_channels.containsKey(cameraId)) {
+ final cameraChannel = _channels[cameraId];
+ cameraChannel?.setMethodCallHandler(null);
+ _channels.remove(cameraId);
+ }
+
await _channel.invokeMethod<void>(
'dispose',
<String, dynamic>{'cameraId': cameraId},
);
-
- if (_channels.containsKey(cameraId)) {
- _channels[cameraId].setMethodCallHandler(null);
- _channels.remove(cameraId);
- }
}
@override
@@ -169,7 +176,9 @@
@override
Future<void> lockCaptureOrientation(
- int cameraId, DeviceOrientation orientation) async {
+ int cameraId,
+ DeviceOrientation orientation,
+ ) async {
await _channel.invokeMethod<String>(
'lockCaptureOrientation',
<String, dynamic>{
@@ -189,10 +198,18 @@
@override
Future<XFile> takePicture(int cameraId) async {
- String path = await _channel.invokeMethod<String>(
+ final path = await _channel.invokeMethod<String>(
'takePicture',
<String, dynamic>{'cameraId': cameraId},
);
+
+ if (path == null) {
+ throw CameraException(
+ 'INVALID_PATH',
+ 'The platform "$defaultTargetPlatform" did not return a path while reporting success. The platform should always return a valid path or report an error.',
+ );
+ }
+
return XFile(path);
}
@@ -202,7 +219,7 @@
@override
Future<void> startVideoRecording(int cameraId,
- {Duration maxVideoDuration}) async {
+ {Duration? maxVideoDuration}) async {
await _channel.invokeMethod<void>(
'startVideoRecording',
<String, dynamic>{
@@ -214,10 +231,18 @@
@override
Future<XFile> stopVideoRecording(int cameraId) async {
- String path = await _channel.invokeMethod<String>(
+ final path = await _channel.invokeMethod<String>(
'stopVideoRecording',
<String, dynamic>{'cameraId': cameraId},
);
+
+ if (path == null) {
+ throw CameraException(
+ 'INVALID_PATH',
+ 'The platform "$defaultTargetPlatform" did not return a path while reporting success. The platform should always return a valid path or report an error.',
+ );
+ }
+
return XFile(path);
}
@@ -255,9 +280,10 @@
);
@override
- Future<void> setExposurePoint(int cameraId, Point<double> point) {
+ Future<void> setExposurePoint(int cameraId, Point<double>? point) {
assert(point == null || point.x >= 0 && point.x <= 1);
assert(point == null || point.y >= 0 && point.y <= 1);
+
return _channel.invokeMethod<void>(
'setExposurePoint',
<String, dynamic>{
@@ -270,35 +296,47 @@
}
@override
- Future<double> getMinExposureOffset(int cameraId) =>
- _channel.invokeMethod<double>(
- 'getMinExposureOffset',
- <String, dynamic>{'cameraId': cameraId},
- );
+ Future<double> getMinExposureOffset(int cameraId) async {
+ final minExposureOffset = await _channel.invokeMethod<double>(
+ 'getMinExposureOffset',
+ <String, dynamic>{'cameraId': cameraId},
+ );
+
+ return minExposureOffset!;
+ }
@override
- Future<double> getMaxExposureOffset(int cameraId) =>
- _channel.invokeMethod<double>(
- 'getMaxExposureOffset',
- <String, dynamic>{'cameraId': cameraId},
- );
+ Future<double> getMaxExposureOffset(int cameraId) async {
+ final maxExposureOffset = await _channel.invokeMethod<double>(
+ 'getMaxExposureOffset',
+ <String, dynamic>{'cameraId': cameraId},
+ );
+
+ return maxExposureOffset!;
+ }
@override
- Future<double> getExposureOffsetStepSize(int cameraId) =>
- _channel.invokeMethod<double>(
- 'getExposureOffsetStepSize',
- <String, dynamic>{'cameraId': cameraId},
- );
+ Future<double> getExposureOffsetStepSize(int cameraId) async {
+ final stepSize = await _channel.invokeMethod<double>(
+ 'getExposureOffsetStepSize',
+ <String, dynamic>{'cameraId': cameraId},
+ );
+
+ return stepSize!;
+ }
@override
- Future<double> setExposureOffset(int cameraId, double offset) =>
- _channel.invokeMethod<double>(
- 'setExposureOffset',
- <String, dynamic>{
- 'cameraId': cameraId,
- 'offset': offset,
- },
- );
+ Future<double> setExposureOffset(int cameraId, double offset) async {
+ final appliedOffset = await _channel.invokeMethod<double>(
+ 'setExposureOffset',
+ <String, dynamic>{
+ 'cameraId': cameraId,
+ 'offset': offset,
+ },
+ );
+
+ return appliedOffset!;
+ }
@override
Future<void> setFocusMode(int cameraId, FocusMode mode) =>
@@ -311,9 +349,10 @@
);
@override
- Future<void> setFocusPoint(int cameraId, Point<double> point) {
+ Future<void> setFocusPoint(int cameraId, Point<double>? point) {
assert(point == null || point.x >= 0 && point.x <= 1);
assert(point == null || point.y >= 0 && point.y <= 1);
+
return _channel.invokeMethod<void>(
'setFocusPoint',
<String, dynamic>{
@@ -326,16 +365,24 @@
}
@override
- Future<double> getMaxZoomLevel(int cameraId) => _channel.invokeMethod<double>(
- 'getMaxZoomLevel',
- <String, dynamic>{'cameraId': cameraId},
- );
+ Future<double> getMaxZoomLevel(int cameraId) async {
+ final maxZoomLevel = await _channel.invokeMethod<double>(
+ 'getMaxZoomLevel',
+ <String, dynamic>{'cameraId': cameraId},
+ );
+
+ return maxZoomLevel!;
+ }
@override
- Future<double> getMinZoomLevel(int cameraId) => _channel.invokeMethod<double>(
- 'getMinZoomLevel',
- <String, dynamic>{'cameraId': cameraId},
- );
+ Future<double> getMinZoomLevel(int cameraId) async {
+ final minZoomLevel = await _channel.invokeMethod<double>(
+ 'getMinZoomLevel',
+ <String, dynamic>{'cameraId': cameraId},
+ );
+
+ return minZoomLevel!;
+ }
@override
Future<void> setZoomLevel(int cameraId, double zoom) async {
diff --git a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart
index e1faecf..916922f 100644
--- a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart
+++ b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart
@@ -51,8 +51,8 @@
/// Creates an uninitialized camera instance and returns the cameraId.
Future<int> createCamera(
CameraDescription cameraDescription,
- ResolutionPreset resolutionPreset, {
- bool enableAudio,
+ ResolutionPreset? resolutionPreset, {
+ bool enableAudio = true,
}) {
throw UnimplementedError('createCamera() is not implemented.');
}
@@ -62,8 +62,10 @@
/// [imageFormatGroup] is used to specify the image formatting used.
/// On Android this defaults to ImageFormat.YUV_420_888 and applies only to the imageStream.
/// On iOS this defaults to kCVPixelFormatType_32BGRA.
- Future<void> initializeCamera(int cameraId,
- {ImageFormatGroup imageFormatGroup}) {
+ Future<void> initializeCamera(
+ int cameraId, {
+ ImageFormatGroup imageFormatGroup = ImageFormatGroup.unknown,
+ }) {
throw UnimplementedError('initializeCamera() is not implemented.');
}
@@ -130,7 +132,7 @@
/// meaning the recording will continue until manually stopped.
/// With [maxVideoDuration] set the video is returned in a [VideoRecordedEvent]
/// through the [onVideoRecordedEvent] stream when the set duration is reached.
- Future<void> startVideoRecording(int cameraId, {Duration maxVideoDuration}) {
+ Future<void> startVideoRecording(int cameraId, {Duration? maxVideoDuration}) {
throw UnimplementedError('startVideoRecording() is not implemented.');
}
@@ -160,7 +162,10 @@
}
/// Sets the exposure point for automatically determining the exposure values.
- Future<void> setExposurePoint(int cameraId, Point<double> point) {
+ ///
+ /// Supplying `null` for the [point] argument will result in resetting to the
+ /// original exposure point value.
+ Future<void> setExposurePoint(int cameraId, Point<double>? point) {
throw UnimplementedError('setExposurePoint() is not implemented.');
}
@@ -202,7 +207,10 @@
}
/// Sets the focus point for automatically determining the focus values.
- Future<void> setFocusPoint(int cameraId, Point<double> point) {
+ ///
+ /// Supplying `null` for the [point] argument will result in resetting to the
+ /// original focus point value.
+ Future<void> setFocusPoint(int cameraId, Point<double>? point) {
throw UnimplementedError('setFocusPoint() is not implemented.');
}
diff --git a/packages/camera/camera_platform_interface/lib/src/types/camera_description.dart b/packages/camera/camera_platform_interface/lib/src/types/camera_description.dart
index c19af1f..9707bd3 100644
--- a/packages/camera/camera_platform_interface/lib/src/types/camera_description.dart
+++ b/packages/camera/camera_platform_interface/lib/src/types/camera_description.dart
@@ -17,7 +17,11 @@
/// Properties of a camera device.
class CameraDescription {
/// Creates a new camera description with the given properties.
- CameraDescription({this.name, this.lensDirection, this.sensorOrientation});
+ CameraDescription({
+ required this.name,
+ required this.lensDirection,
+ required this.sensorOrientation,
+ });
/// The name of the camera device.
final String name;
diff --git a/packages/camera/camera_platform_interface/lib/src/types/camera_exception.dart b/packages/camera/camera_platform_interface/lib/src/types/camera_exception.dart
index 3da659f..59f3e4e 100644
--- a/packages/camera/camera_platform_interface/lib/src/types/camera_exception.dart
+++ b/packages/camera/camera_platform_interface/lib/src/types/camera_exception.dart
@@ -13,7 +13,7 @@
String code;
/// Textual description of the error.
- String description;
+ String? description;
@override
String toString() => 'CameraException($code, $description)';
diff --git a/packages/camera/camera_platform_interface/lib/src/types/exposure_mode.dart b/packages/camera/camera_platform_interface/lib/src/types/exposure_mode.dart
index 7fbfbaf..836f538 100644
--- a/packages/camera/camera_platform_interface/lib/src/types/exposure_mode.dart
+++ b/packages/camera/camera_platform_interface/lib/src/types/exposure_mode.dart
@@ -13,7 +13,6 @@
/// Returns the exposure mode as a String.
String serializeExposureMode(ExposureMode exposureMode) {
- if (exposureMode == null) return null;
switch (exposureMode) {
case ExposureMode.locked:
return 'locked';
@@ -26,7 +25,6 @@
/// Returns the exposure mode for a given String.
ExposureMode deserializeExposureMode(String str) {
- if (str == null) return null;
switch (str) {
case "locked":
return ExposureMode.locked;
diff --git a/packages/camera/camera_platform_interface/lib/src/types/focus_mode.dart b/packages/camera/camera_platform_interface/lib/src/types/focus_mode.dart
index ad5e9a2..8da2a90 100644
--- a/packages/camera/camera_platform_interface/lib/src/types/focus_mode.dart
+++ b/packages/camera/camera_platform_interface/lib/src/types/focus_mode.dart
@@ -13,7 +13,6 @@
/// Returns the focus mode as a String.
String serializeFocusMode(FocusMode focusMode) {
- if (focusMode == null) return null;
switch (focusMode) {
case FocusMode.locked:
return 'locked';
@@ -26,7 +25,6 @@
/// Returns the focus mode for a given String.
FocusMode deserializeFocusMode(String str) {
- if (str == null) return null;
switch (str) {
case "locked":
return FocusMode.locked;
diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml
index c7ec720..a063765 100644
--- a/packages/camera/camera_platform_interface/pubspec.yaml
+++ b/packages/camera/camera_platform_interface/pubspec.yaml
@@ -3,23 +3,23 @@
homepage: https://github.com/flutter/plugins/tree/master/packages/camera/camera_platform_interface
# 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: 1.6.0
+version: 2.0.0-nullsafety
dependencies:
flutter:
sdk: flutter
- meta: ^1.0.5
- plugin_platform_interface: ^1.0.1
- cross_file: ^0.1.0
- stream_transform: ^1.2.0
+ meta: ^1.3.0-nullsafety.6
+ plugin_platform_interface: ^1.1.0-nullsafety.2
+ cross_file: ^0.3.0-nullsafety
+ stream_transform: ^2.0.0-nullsafety.0
dev_dependencies:
flutter_test:
sdk: flutter
- async: ^2.4.2
- mockito: ^4.1.1
- pedantic: ^1.8.0
+ async: ^2.5.0-nullsafety.3
+ mockito: ^5.0.0-nullsafety.5
+ pedantic: ^1.10.0-nullsafety.3
environment:
- sdk: ">=2.7.0 <3.0.0"
+ sdk: '>=2.12.0-0 <3.0.0'
flutter: ">=1.22.0"
diff --git a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart
index 8baf5da..a96df84 100644
--- a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart
+++ b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart
@@ -4,6 +4,7 @@
import 'package:camera_platform_interface/camera_platform_interface.dart';
import 'package:camera_platform_interface/src/method_channel/method_channel_camera.dart';
+import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
@@ -117,7 +118,8 @@
// Act & Assert
expect(
- () => cameraPlatform.lockCaptureOrientation(1, null),
+ () => cameraPlatform.lockCaptureOrientation(
+ 1, DeviceOrientation.portraitUp),
throwsUnimplementedError,
);
});
@@ -155,7 +157,14 @@
// Act & Assert
expect(
- () => cameraPlatform.createCamera(null, null),
+ () => cameraPlatform.createCamera(
+ CameraDescription(
+ name: 'back',
+ lensDirection: CameraLensDirection.back,
+ sensorOrientation: 0,
+ ),
+ ResolutionPreset.high,
+ ),
throwsUnimplementedError,
);
});
@@ -168,7 +177,7 @@
// Act & Assert
expect(
- () => cameraPlatform.initializeCamera(null),
+ () => cameraPlatform.initializeCamera(1),
throwsUnimplementedError,
);
});
@@ -220,7 +229,7 @@
// Act & Assert
expect(
- () => cameraPlatform.setFlashMode(1, null),
+ () => cameraPlatform.setFlashMode(1, FlashMode.auto),
throwsUnimplementedError,
);
});
@@ -233,7 +242,7 @@
// Act & Assert
expect(
- () => cameraPlatform.setExposureMode(1, null),
+ () => cameraPlatform.setExposureMode(1, ExposureMode.auto),
throwsUnimplementedError,
);
});
@@ -298,7 +307,7 @@
// Act & Assert
expect(
- () => cameraPlatform.setExposureOffset(1, null),
+ () => cameraPlatform.setExposureOffset(1, 2.0),
throwsUnimplementedError,
);
});
@@ -311,7 +320,7 @@
// Act & Assert
expect(
- () => cameraPlatform.setFocusMode(1, null),
+ () => cameraPlatform.setFocusMode(1, FocusMode.auto),
throwsUnimplementedError,
);
});
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 7e91463..7633de8 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
@@ -37,7 +37,10 @@
// Act
final cameraId = await camera.createCamera(
- CameraDescription(name: 'Test'),
+ CameraDescription(
+ name: 'Test',
+ lensDirection: CameraLensDirection.back,
+ sensorOrientation: 0),
ResolutionPreset.high,
);
@@ -48,7 +51,7 @@
arguments: {
'cameraName': 'Test',
'resolutionPreset': 'high',
- 'enableAudio': null
+ 'enableAudio': true
},
),
]);
@@ -70,7 +73,11 @@
// Act
expect(
() => camera.createCamera(
- CameraDescription(name: 'Test'),
+ CameraDescription(
+ name: 'Test',
+ lensDirection: CameraLensDirection.back,
+ sensorOrientation: 0,
+ ),
ResolutionPreset.high,
),
throwsA(
@@ -97,7 +104,11 @@
// Act
expect(
() => camera.createCamera(
- CameraDescription(name: 'Test'),
+ CameraDescription(
+ name: 'Test',
+ lensDirection: CameraLensDirection.back,
+ sensorOrientation: 0,
+ ),
ResolutionPreset.high,
),
throwsA(
@@ -122,7 +133,11 @@
});
final camera = MethodChannelCamera();
final cameraId = await camera.createCamera(
- CameraDescription(name: 'Test'),
+ CameraDescription(
+ name: 'Test',
+ lensDirection: CameraLensDirection.back,
+ sensorOrientation: 0,
+ ),
ResolutionPreset.high,
);
@@ -165,7 +180,11 @@
final camera = MethodChannelCamera();
final cameraId = await camera.createCamera(
- CameraDescription(name: 'Test'),
+ CameraDescription(
+ name: 'Test',
+ lensDirection: CameraLensDirection.back,
+ sensorOrientation: 0,
+ ),
ResolutionPreset.high,
);
Future<void> initializeFuture = camera.initializeCamera(cameraId);
@@ -197,8 +216,8 @@
});
group('Event Tests', () {
- MethodChannelCamera camera;
- int cameraId;
+ late MethodChannelCamera camera;
+ late int cameraId;
setUp(() async {
MethodChannelMock(
channelName: 'plugins.flutter.io/camera',
@@ -209,7 +228,11 @@
);
camera = MethodChannelCamera();
cameraId = await camera.createCamera(
- CameraDescription(name: 'Test'),
+ CameraDescription(
+ name: 'Test',
+ lensDirection: CameraLensDirection.back,
+ sensorOrientation: 0,
+ ),
ResolutionPreset.high,
);
Future<void> initializeFuture = camera.initializeCamera(cameraId);
@@ -352,8 +375,9 @@
});
group('Function Tests', () {
- MethodChannelCamera camera;
- int cameraId;
+ late MethodChannelCamera camera;
+ late int cameraId;
+
setUp(() async {
MethodChannelMock(
channelName: 'plugins.flutter.io/camera',
@@ -364,7 +388,11 @@
);
camera = MethodChannelCamera();
cameraId = await camera.createCamera(
- CameraDescription(name: 'Test'),
+ CameraDescription(
+ name: 'Test',
+ lensDirection: CameraLensDirection.back,
+ sensorOrientation: 0,
+ ),
ResolutionPreset.high,
);
Future<void> initializeFuture = camera.initializeCamera(cameraId);
diff --git a/packages/camera/camera_platform_interface/test/utils/method_channel_mock.dart b/packages/camera/camera_platform_interface/test/utils/method_channel_mock.dart
index cdf393f..fdbd9a1 100644
--- a/packages/camera/camera_platform_interface/test/utils/method_channel_mock.dart
+++ b/packages/camera/camera_platform_interface/test/utils/method_channel_mock.dart
@@ -5,15 +5,15 @@
import 'package:flutter/services.dart';
class MethodChannelMock {
- final Duration delay;
+ final Duration? delay;
final MethodChannel methodChannel;
final Map<String, dynamic> methods;
final log = <MethodCall>[];
MethodChannelMock({
- String channelName,
+ required String channelName,
this.delay,
- this.methods,
+ required this.methods,
}) : methodChannel = MethodChannel(channelName) {
methodChannel.setMockMethodCallHandler(_handler);
}
diff --git a/script/nnbd_plugins.sh b/script/nnbd_plugins.sh
index 1e57db9..81ec693 100644
--- a/script/nnbd_plugins.sh
+++ b/script/nnbd_plugins.sh
@@ -7,6 +7,7 @@
readonly NNBD_PLUGINS_LIST=(
"android_intent"
"battery"
+ "camera"
"connectivity"
"cross_file"
"device_info"