From 05659f080b26d53ef153ea81667d6755a8951a42 Mon Sep 17 00:00:00 2001 From: Ian Hickson Date: Mon, 5 Jul 2021 15:06:21 -0700 Subject: [PATCH] [various] Prepare plugin repo for binding API improvements Since plugins also have to work with the stable branch, we can't actually take advantage of the changes right away, so we muddle the issue in the meantime. Prep for flutter/flutter#83843 See also https://github.com/flutter/plugins/pull/4136 --- .../test/method_channel_battery_test.dart | 20 +++++++--- packages/camera/camera/example/lib/main.dart | 9 ++++- .../method_channel_connectivity_test.dart | 20 +++++++--- packages/sensors/test/sensors_test.dart | 22 +++++++--- .../video_player/video_player/CHANGELOG.md | 5 +++ .../video_player/lib/video_player.dart | 11 ++++- .../video_player/video_player/pubspec.yaml | 2 +- .../method_channel_video_player_test.dart | 26 +++++++++--- .../test/webview_flutter_test.dart | 40 +++++++++++++------ 9 files changed, 114 insertions(+), 41 deletions(-) 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 6a312ee73ef2..697582843a95 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 @@ void main() { .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 @@ void main() { }); }); } + +/// 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? value) => value; diff --git a/packages/camera/camera/example/lib/main.dart b/packages/camera/camera/example/lib/main.dart index 536e95de9c8b..16d585db9308 100644 --- a/packages/camera/camera/example/lib/main.dart +++ b/packages/camera/camera/example/lib/main.dart @@ -68,7 +68,7 @@ class _CameraExampleHomeState extends State @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 @@ Future main() async { } 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? 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 38f4ac38b156..b69feae252eb 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 @@ void main() { .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 @@ void main() { }); }); } + +/// 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? value) => value; diff --git a/packages/sensors/test/sensors_test.dart b/packages/sensors/test/sensors_test.dart index 659c658c3604..bce3afe6205b 100644 --- a/packages/sensors/test/sensors_test.dart +++ b/packages/sensors/test/sensors_test.dart @@ -52,14 +52,17 @@ void _initializeFakeSensorChannel(String channelName, List sensorData) { 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 @@ void _initializeFakeSensorChannel(String channelName, List sensorData) { } }); } + +/// 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? value) => value; diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 135057b403eb..b082d1b66980 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 d5bd7d2f222d..1708d49d678b 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 @@ class _VideoAppLifeCycleObserver extends Object with WidgetsBindingObserver { final VideoPlayerController _controller; void initialize() { - WidgetsBinding.instance!.addObserver(this); + _ambiguate(WidgetsBinding.instance)!.addObserver(this); } @override @@ -593,7 +593,7 @@ class _VideoAppLifeCycleObserver extends Object with WidgetsBindingObserver { } void dispose() { - WidgetsBinding.instance!.removeObserver(this); + _ambiguate(WidgetsBinding.instance)!.removeObserver(this); } } @@ -949,3 +949,10 @@ class ClosedCaption extends StatelessWidget { ); } } + +/// 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? value) => value; diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index cf0312916b01..c24377fc1b8b 100644 --- a/packages/video_player/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for displaying inline video with other Flutter 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 33a5b34b615d..9da71617e66a 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 @@ void main() { }); 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 @@ void main() { }), (ByteData? data) {}); - await ServicesBinding.instance?.defaultBinaryMessenger + await _ambiguate(ServicesBinding.instance) + ?.defaultBinaryMessenger .handlePlatformMessage( "flutter.io/videoPlayer/videoEvents123", const StandardMethodCodec() @@ -259,7 +263,8 @@ void main() { }), (ByteData? data) {}); - await ServicesBinding.instance?.defaultBinaryMessenger + await _ambiguate(ServicesBinding.instance) + ?.defaultBinaryMessenger .handlePlatformMessage( "flutter.io/videoPlayer/videoEvents123", const StandardMethodCodec() @@ -272,7 +277,8 @@ void main() { }), (ByteData? data) {}); - await ServicesBinding.instance?.defaultBinaryMessenger + await _ambiguate(ServicesBinding.instance) + ?.defaultBinaryMessenger .handlePlatformMessage( "flutter.io/videoPlayer/videoEvents123", const StandardMethodCodec() @@ -281,7 +287,8 @@ void main() { }), (ByteData? data) {}); - await ServicesBinding.instance?.defaultBinaryMessenger + await _ambiguate(ServicesBinding.instance) + ?.defaultBinaryMessenger .handlePlatformMessage( "flutter.io/videoPlayer/videoEvents123", const StandardMethodCodec() @@ -325,3 +332,10 @@ void main() { }); }); } + +/// 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? value) => value; diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart index 4360484408b5..5efee6d9952d 100644 --- a/packages/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/test/webview_flutter_test.dart @@ -1019,7 +1019,8 @@ class FakePlatformWebView { }; 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 @@ class FakePlatformWebView { }; 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 @@ class FakePlatformWebView { {'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 @@ class FakePlatformWebView { {'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 @@ class FakePlatformWebView { {'progress': progress}, )); - ServicesBinding.instance!.defaultBinaryMessenger + _ambiguate(ServicesBinding.instance)! + .defaultBinaryMessenger .handlePlatformMessage(channel.name, data, (ByteData? data) {}); } @@ -1244,3 +1251,10 @@ class MatchesCreationParams extends Matcher { .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? value) => value;