[sensors] Migrate to null safety (#3423)

diff --git a/packages/sensors/CHANGELOG.md b/packages/sensors/CHANGELOG.md
index 8970f1e..682d377 100644
--- a/packages/sensors/CHANGELOG.md
+++ b/packages/sensors/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.5.0-nullsafety
+
+* Migrate to null safety.
+
 ## 0.4.2+8
 
 * Fix outdated links across a number of markdown files ([#3276](https://github.com/flutter/plugins/pull/3276))
diff --git a/packages/sensors/integration_test/sensors_test.dart b/packages/sensors/integration_test/sensors_test.dart
index ea1db03..348bda0 100644
--- a/packages/sensors/integration_test/sensors_test.dart
+++ b/packages/sensors/integration_test/sensors_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.9
+
 import 'dart:async';
 import 'package:flutter_test/flutter_test.dart';
 import 'package:sensors/sensors.dart';
diff --git a/packages/sensors/lib/sensors.dart b/packages/sensors/lib/sensors.dart
index 0b6f1b5..8f69255 100644
--- a/packages/sensors/lib/sensors.dart
+++ b/packages/sensors/lib/sensors.dart
@@ -121,38 +121,50 @@
   return GyroscopeEvent(list[0], list[1], list[2]);
 }
 
-Stream<AccelerometerEvent> _accelerometerEvents;
-Stream<GyroscopeEvent> _gyroscopeEvents;
-Stream<UserAccelerometerEvent> _userAccelerometerEvents;
+Stream<AccelerometerEvent>? _accelerometerEvents;
+Stream<GyroscopeEvent>? _gyroscopeEvents;
+Stream<UserAccelerometerEvent>? _userAccelerometerEvents;
 
 /// A broadcast stream of events from the device accelerometer.
 Stream<AccelerometerEvent> get accelerometerEvents {
-  if (_accelerometerEvents == null) {
-    _accelerometerEvents = _accelerometerEventChannel
-        .receiveBroadcastStream()
-        .map(
-            (dynamic event) => _listToAccelerometerEvent(event.cast<double>()));
+  Stream<AccelerometerEvent>? accelerometerEvents = _accelerometerEvents;
+  if (accelerometerEvents == null) {
+    accelerometerEvents =
+        _accelerometerEventChannel.receiveBroadcastStream().map(
+              (dynamic event) =>
+                  _listToAccelerometerEvent(event.cast<double>()),
+            );
+    _accelerometerEvents = accelerometerEvents;
   }
-  return _accelerometerEvents;
+
+  return accelerometerEvents;
 }
 
 /// A broadcast stream of events from the device gyroscope.
 Stream<GyroscopeEvent> get gyroscopeEvents {
-  if (_gyroscopeEvents == null) {
-    _gyroscopeEvents = _gyroscopeEventChannel
-        .receiveBroadcastStream()
-        .map((dynamic event) => _listToGyroscopeEvent(event.cast<double>()));
+  Stream<GyroscopeEvent>? gyroscopeEvents = _gyroscopeEvents;
+  if (gyroscopeEvents == null) {
+    gyroscopeEvents = _gyroscopeEventChannel.receiveBroadcastStream().map(
+          (dynamic event) => _listToGyroscopeEvent(event.cast<double>()),
+        );
+    _gyroscopeEvents = gyroscopeEvents;
   }
-  return _gyroscopeEvents;
+
+  return gyroscopeEvents;
 }
 
 /// Events from the device accelerometer with gravity removed.
 Stream<UserAccelerometerEvent> get userAccelerometerEvents {
-  if (_userAccelerometerEvents == null) {
-    _userAccelerometerEvents = _userAccelerometerEventChannel
-        .receiveBroadcastStream()
-        .map((dynamic event) =>
-            _listToUserAccelerometerEvent(event.cast<double>()));
+  Stream<UserAccelerometerEvent>? userAccelerometerEvents =
+      _userAccelerometerEvents;
+  if (userAccelerometerEvents == null) {
+    userAccelerometerEvents =
+        _userAccelerometerEventChannel.receiveBroadcastStream().map(
+              (dynamic event) =>
+                  _listToUserAccelerometerEvent(event.cast<double>()),
+            );
+    _userAccelerometerEvents = userAccelerometerEvents;
   }
-  return _userAccelerometerEvents;
+
+  return userAccelerometerEvents;
 }
diff --git a/packages/sensors/pubspec.yaml b/packages/sensors/pubspec.yaml
index 35feb4b..e9b0392 100644
--- a/packages/sensors/pubspec.yaml
+++ b/packages/sensors/pubspec.yaml
@@ -5,7 +5,7 @@
 # 0.4.y+z is compatible with 1.0.0, if you land a breaking change bump
 # the version to 2.0.0.
 # See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0
-version: 0.4.2+8
+version: 0.5.0-nullsafety
 
 flutter:
   plugin:
@@ -21,14 +21,14 @@
     sdk: flutter
 
 dev_dependencies:
-  test: ^1.3.0
+  test: ^1.16.0-nullsafety
   flutter_test:
     sdk: flutter
   integration_test:
     path: ../integration_test
-  mockito: ^4.1.1
-  pedantic: ^1.8.0
+  mockito: ^5.0.0-nullsafety.0
+  pedantic: ^1.10.0-nullsafety
 
 environment:
-  sdk: ">=2.1.0<3.0.0"
+  sdk: ">=2.12.0-0 <3.0.0"
   flutter: ">=1.12.13+hotfix.5"
diff --git a/packages/sensors/test/sensors_test.dart b/packages/sensors/test/sensors_test.dart
index 832a2f8..93e0959 100644
--- a/packages/sensors/test/sensors_test.dart
+++ b/packages/sensors/test/sensors_test.dart
@@ -52,16 +52,16 @@
 void _initializeFakeSensorChannel(String channelName, List<double> sensorData) {
   const StandardMethodCodec standardMethod = StandardMethodCodec();
 
-  void _emitEvent(ByteData event) {
-    ServicesBinding.instance.defaultBinaryMessenger.handlePlatformMessage(
+  void _emitEvent(ByteData? event) {
+    ServicesBinding.instance!.defaultBinaryMessenger.handlePlatformMessage(
       channelName,
       event,
-      (ByteData reply) {},
+      (ByteData? reply) {},
     );
   }
 
-  ServicesBinding.instance.defaultBinaryMessenger
-      .setMockMessageHandler(channelName, (ByteData message) async {
+  ServicesBinding.instance!.defaultBinaryMessenger
+      .setMockMessageHandler(channelName, (ByteData? message) async {
     final MethodCall methodCall = standardMethod.decodeMethodCall(message);
     if (methodCall.method == 'listen') {
       _emitEvent(standardMethod.encodeSuccessEnvelope(sensorData));
diff --git a/script/nnbd_plugins.sh b/script/nnbd_plugins.sh
index c676573..0e1d3c4 100644
--- a/script/nnbd_plugins.sh
+++ b/script/nnbd_plugins.sh
@@ -20,6 +20,7 @@
   "path_provider"
   "package_info"
   "plugin_platform_interface"
+  "sensors"
   "share"
   "shared_preferences"
   "url_launcher"