[various] Prepare plugin repo for binding API improvements (#4137)

diff --git a/packages/battery/battery_platform_interface/test/method_channel_battery_test.dart b/packages/battery/battery_platform_interface/test/method_channel_battery_test.dart
index 6a312ee..6975828 100644
--- a/packages/battery/battery_platform_interface/test/method_channel_battery_test.dart
+++ b/packages/battery/battery_platform_interface/test/method_channel_battery_test.dart
@@ -32,13 +32,14 @@
           .setMockMethodCallHandler((MethodCall methodCall) async {
         switch (methodCall.method) {
           case 'listen':
-            await ServicesBinding.instance!.defaultBinaryMessenger
+            await _ambiguate(ServicesBinding.instance)!
+                .defaultBinaryMessenger
                 .handlePlatformMessage(
-              methodChannelBattery.eventChannel.name,
-              methodChannelBattery.eventChannel.codec
-                  .encodeSuccessEnvelope('full'),
-              (_) {},
-            );
+                  methodChannelBattery.eventChannel.name,
+                  methodChannelBattery.eventChannel.codec
+                      .encodeSuccessEnvelope('full'),
+                  (_) {},
+                );
             break;
           case 'cancel':
           default:
@@ -61,3 +62,10 @@
     });
   });
 }
+
+/// This allows a value of type T or T? to be treated as a value of type T?.
+///
+/// We use this so that APIs that have become non-nullable can still be used
+/// with `!` and `?` on the stable branch.
+// TODO(ianh): Remove this once we roll stable in late 2021.
+T? _ambiguate<T>(T? value) => value;
diff --git a/packages/camera/camera/example/lib/main.dart b/packages/camera/camera/example/lib/main.dart
index 536e95d..16d585d 100644
--- a/packages/camera/camera/example/lib/main.dart
+++ b/packages/camera/camera/example/lib/main.dart
@@ -68,7 +68,7 @@
   @override
   void initState() {
     super.initState();
-    WidgetsBinding.instance?.addObserver(this);
+    _ambiguate(WidgetsBinding.instance)?.addObserver(this);
 
     _flashModeControlRowAnimationController = AnimationController(
       duration: const Duration(milliseconds: 300),
@@ -951,3 +951,10 @@
   }
   runApp(CameraApp());
 }
+
+/// This allows a value of type T or T? to be treated as a value of type T?.
+///
+/// We use this so that APIs that have become non-nullable can still be used
+/// with `!` and `?` on the stable branch.
+// TODO(ianh): Remove this once we roll stable in late 2021.
+T? _ambiguate<T>(T? value) => value;
diff --git a/packages/connectivity/connectivity_platform_interface/test/method_channel_connectivity_test.dart b/packages/connectivity/connectivity_platform_interface/test/method_channel_connectivity_test.dart
index 38f4ac3..b69feae 100644
--- a/packages/connectivity/connectivity_platform_interface/test/method_channel_connectivity_test.dart
+++ b/packages/connectivity/connectivity_platform_interface/test/method_channel_connectivity_test.dart
@@ -42,13 +42,14 @@
           .setMockMethodCallHandler((MethodCall methodCall) async {
         switch (methodCall.method) {
           case 'listen':
-            await ServicesBinding.instance!.defaultBinaryMessenger
+            await _ambiguate(ServicesBinding.instance)!
+                .defaultBinaryMessenger
                 .handlePlatformMessage(
-              methodChannelConnectivity.eventChannel.name,
-              methodChannelConnectivity.eventChannel.codec
-                  .encodeSuccessEnvelope('wifi'),
-              (_) {},
-            );
+                  methodChannelConnectivity.eventChannel.name,
+                  methodChannelConnectivity.eventChannel.codec
+                      .encodeSuccessEnvelope('wifi'),
+                  (_) {},
+                );
             break;
           case 'cancel':
           default:
@@ -151,3 +152,10 @@
     });
   });
 }
+
+/// This allows a value of type T or T? to be treated as a value of type T?.
+///
+/// We use this so that APIs that have become non-nullable can still be used
+/// with `!` and `?` on the stable branch.
+// TODO(ianh): Remove this once we roll stable in late 2021.
+T? _ambiguate<T>(T? value) => value;
diff --git a/packages/sensors/test/sensors_test.dart b/packages/sensors/test/sensors_test.dart
index 659c658..bce3afe 100644
--- a/packages/sensors/test/sensors_test.dart
+++ b/packages/sensors/test/sensors_test.dart
@@ -52,14 +52,17 @@
   const StandardMethodCodec standardMethod = StandardMethodCodec();
 
   void _emitEvent(ByteData? event) {
-    ServicesBinding.instance!.defaultBinaryMessenger.handlePlatformMessage(
-      channelName,
-      event,
-      (ByteData? reply) {},
-    );
+    _ambiguate(ServicesBinding.instance)!
+        .defaultBinaryMessenger
+        .handlePlatformMessage(
+          channelName,
+          event,
+          (ByteData? reply) {},
+        );
   }
 
-  ServicesBinding.instance!.defaultBinaryMessenger
+  _ambiguate(ServicesBinding.instance)!
+      .defaultBinaryMessenger
       .setMockMessageHandler(channelName, (ByteData? message) async {
     final MethodCall methodCall = standardMethod.decodeMethodCall(message);
     if (methodCall.method == 'listen') {
@@ -73,3 +76,10 @@
     }
   });
 }
+
+/// This allows a value of type T or T? to be treated as a value of type T?.
+///
+/// We use this so that APIs that have become non-nullable can still be used
+/// with `!` and `?` on the stable branch.
+// TODO(ianh): Remove this once we roll stable in late 2021.
+T? _ambiguate<T>(T? value) => value;
diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md
index 135057b..b082d1b 100644
--- a/packages/video_player/video_player/CHANGELOG.md
+++ b/packages/video_player/video_player/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 2.1.9
+
+* Silenced warnings that may occur during build when using a very
+  recent version of Flutter relating to null safety.
+
 ## 2.1.8
 
 * Refactor `FLTCMTimeToMillis` to support indefinite streams. Fixes [#48670](https://github.com/flutter/flutter/issues/48670).
diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart
index d5bd7d2..1708d49 100644
--- a/packages/video_player/video_player/lib/video_player.dart
+++ b/packages/video_player/video_player/lib/video_player.dart
@@ -573,7 +573,7 @@
   final VideoPlayerController _controller;
 
   void initialize() {
-    WidgetsBinding.instance!.addObserver(this);
+    _ambiguate(WidgetsBinding.instance)!.addObserver(this);
   }
 
   @override
@@ -593,7 +593,7 @@
   }
 
   void dispose() {
-    WidgetsBinding.instance!.removeObserver(this);
+    _ambiguate(WidgetsBinding.instance)!.removeObserver(this);
   }
 }
 
@@ -949,3 +949,10 @@
     );
   }
 }
+
+/// This allows a value of type T or T? to be treated as a value of type T?.
+///
+/// We use this so that APIs that have become non-nullable can still be used
+/// with `!` and `?` on the stable branch.
+// TODO(ianh): Remove this once we roll stable in late 2021.
+T? _ambiguate<T>(T? value) => value;
diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml
index cf03129..c24377f 100644
--- a/packages/video_player/video_player/pubspec.yaml
+++ b/packages/video_player/video_player/pubspec.yaml
@@ -3,7 +3,7 @@
   widgets on Android, iOS, and web.
 repository: https://github.com/flutter/plugins/tree/master/packages/video_player/video_player
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22
-version: 2.1.8
+version: 2.1.9
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart
index 33a5b34..9da7161 100644
--- a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart
+++ b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart
@@ -232,13 +232,16 @@
     });
 
     test('videoEventsFor', () async {
-      ServicesBinding.instance?.defaultBinaryMessenger.setMockMessageHandler(
+      _ambiguate(ServicesBinding.instance)
+          ?.defaultBinaryMessenger
+          .setMockMessageHandler(
         "flutter.io/videoPlayer/videoEvents123",
         (ByteData? message) async {
           final MethodCall methodCall =
               const StandardMethodCodec().decodeMethodCall(message);
           if (methodCall.method == 'listen') {
-            await ServicesBinding.instance?.defaultBinaryMessenger
+            await _ambiguate(ServicesBinding.instance)
+                ?.defaultBinaryMessenger
                 .handlePlatformMessage(
                     "flutter.io/videoPlayer/videoEvents123",
                     const StandardMethodCodec()
@@ -250,7 +253,8 @@
                     }),
                     (ByteData? data) {});
 
-            await ServicesBinding.instance?.defaultBinaryMessenger
+            await _ambiguate(ServicesBinding.instance)
+                ?.defaultBinaryMessenger
                 .handlePlatformMessage(
                     "flutter.io/videoPlayer/videoEvents123",
                     const StandardMethodCodec()
@@ -259,7 +263,8 @@
                     }),
                     (ByteData? data) {});
 
-            await ServicesBinding.instance?.defaultBinaryMessenger
+            await _ambiguate(ServicesBinding.instance)
+                ?.defaultBinaryMessenger
                 .handlePlatformMessage(
                     "flutter.io/videoPlayer/videoEvents123",
                     const StandardMethodCodec()
@@ -272,7 +277,8 @@
                     }),
                     (ByteData? data) {});
 
-            await ServicesBinding.instance?.defaultBinaryMessenger
+            await _ambiguate(ServicesBinding.instance)
+                ?.defaultBinaryMessenger
                 .handlePlatformMessage(
                     "flutter.io/videoPlayer/videoEvents123",
                     const StandardMethodCodec()
@@ -281,7 +287,8 @@
                     }),
                     (ByteData? data) {});
 
-            await ServicesBinding.instance?.defaultBinaryMessenger
+            await _ambiguate(ServicesBinding.instance)
+                ?.defaultBinaryMessenger
                 .handlePlatformMessage(
                     "flutter.io/videoPlayer/videoEvents123",
                     const StandardMethodCodec()
@@ -325,3 +332,10 @@
     });
   });
 }
+
+/// This allows a value of type T or T? to be treated as a value of type T?.
+///
+/// We use this so that APIs that have become non-nullable can still be used
+/// with `!` and `?` on the stable branch.
+// TODO(ianh): Remove this once we roll stable in late 2021.
+T? _ambiguate<T>(T? value) => value;
diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart
index 4360484..5efee6d 100644
--- a/packages/webview_flutter/test/webview_flutter_test.dart
+++ b/packages/webview_flutter/test/webview_flutter_test.dart
@@ -1019,7 +1019,8 @@
     };
     final ByteData data = codec
         .encodeMethodCall(MethodCall('javascriptChannelMessage', arguments));
-    ServicesBinding.instance!.defaultBinaryMessenger
+    _ambiguate(ServicesBinding.instance)!
+        .defaultBinaryMessenger
         .handlePlatformMessage(channel.name, data, (ByteData? data) {});
   }
 
@@ -1038,7 +1039,8 @@
     };
     final ByteData data =
         codec.encodeMethodCall(MethodCall('navigationRequest', arguments));
-    ServicesBinding.instance!.defaultBinaryMessenger
+    _ambiguate(ServicesBinding.instance)!
+        .defaultBinaryMessenger
         .handlePlatformMessage(channel.name, data, (ByteData? data) {
       final bool allow = codec.decodeEnvelope(data!);
       if (allow) {
@@ -1055,11 +1057,13 @@
       <dynamic, dynamic>{'url': currentUrl},
     ));
 
-    ServicesBinding.instance!.defaultBinaryMessenger.handlePlatformMessage(
-      channel.name,
-      data,
-      (ByteData? data) {},
-    );
+    _ambiguate(ServicesBinding.instance)!
+        .defaultBinaryMessenger
+        .handlePlatformMessage(
+          channel.name,
+          data,
+          (ByteData? data) {},
+        );
   }
 
   void fakeOnPageFinishedCallback() {
@@ -1070,11 +1074,13 @@
       <dynamic, dynamic>{'url': currentUrl},
     ));
 
-    ServicesBinding.instance!.defaultBinaryMessenger.handlePlatformMessage(
-      channel.name,
-      data,
-      (ByteData? data) {},
-    );
+    _ambiguate(ServicesBinding.instance)!
+        .defaultBinaryMessenger
+        .handlePlatformMessage(
+          channel.name,
+          data,
+          (ByteData? data) {},
+        );
   }
 
   void fakeOnProgressCallback(int progress) {
@@ -1085,7 +1091,8 @@
       <dynamic, dynamic>{'progress': progress},
     ));
 
-    ServicesBinding.instance!.defaultBinaryMessenger
+    _ambiguate(ServicesBinding.instance)!
+        .defaultBinaryMessenger
         .handlePlatformMessage(channel.name, data, (ByteData? data) {});
   }
 
@@ -1244,3 +1251,10 @@
             .matches(creationParams.javascriptChannelNames, matchState);
   }
 }
+
+/// This allows a value of type T or T? to be treated as a value of type T?.
+///
+/// We use this so that APIs that have become non-nullable can still be used
+/// with `!` and `?` on the stable branch.
+// TODO(ianh): Remove this once we roll stable in late 2021.
+T? _ambiguate<T>(T? value) => value;