[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"