fix cast NPE in invokeListMethod and invokeMapMathod (#30760)
diff --git a/packages/flutter/lib/src/services/platform_channel.dart b/packages/flutter/lib/src/services/platform_channel.dart index 51c0dbb..6fcaca5 100644 --- a/packages/flutter/lib/src/services/platform_channel.dart +++ b/packages/flutter/lib/src/services/platform_channel.dart
@@ -314,7 +314,7 @@ /// * [invokeMethod], which this call delegates to. Future<List<T>> invokeListMethod<T>(String method, [ dynamic arguments ]) async { final List<dynamic> result = await invokeMethod<List<dynamic>>(method, arguments); - return result.cast<T>(); + return result?.cast<T>(); } /// An implementation of [invokeMethod] that can return typed maps. @@ -328,7 +328,7 @@ /// * [invokeMethod], which this call delegates to. Future<Map<K, V>> invokeMapMethod<K, V>(String method, [ dynamic arguments ]) async { final Map<dynamic, dynamic> result = await invokeMethod<Map<dynamic, dynamic>>(method, arguments); - return result.cast<K, V>(); + return result?.cast<K, V>(); } /// Sets a callback for receiving method calls on this channel.
diff --git a/packages/flutter/test/services/platform_channel_test.dart b/packages/flutter/test/services/platform_channel_test.dart index 243a254..9b11080 100644 --- a/packages/flutter/test/services/platform_channel_test.dart +++ b/packages/flutter/test/services/platform_channel_test.dart
@@ -69,6 +69,21 @@ expect(await channel.invokeListMethod<String>('sayHello', 'hello'), <String>['hello', 'world']); }); + test('can invoke list method and get null result', () async { + BinaryMessages.setMockMessageHandler( + 'ch7', + (ByteData message) async { + final Map<dynamic, dynamic> methodCall = jsonMessage.decodeMessage(message); + if (methodCall['method'] == 'sayHello') { + return jsonMessage.encodeMessage(<dynamic>[null]); + } else { + return jsonMessage.encodeMessage(<dynamic>['unknown', null, null]); + } + }, + ); + expect(await channel.invokeListMethod<String>('sayHello', 'hello'), null); + }); + test('can invoke map method and get result', () async { BinaryMessages.setMockMessageHandler( @@ -86,6 +101,21 @@ expect(await channel.invokeMapMethod<String, String>('sayHello', 'hello'), <String, String>{'hello': 'world'}); }); + test('can invoke map method and get null result', () async { + BinaryMessages.setMockMessageHandler( + 'ch7', + (ByteData message) async { + final Map<dynamic, dynamic> methodCall = jsonMessage.decodeMessage(message); + if (methodCall['method'] == 'sayHello') { + return jsonMessage.encodeMessage(<dynamic>[null]); + } else { + return jsonMessage.encodeMessage(<dynamic>['unknown', null, null]); + } + }, + ); + expect(await channel.invokeMapMethod<String, String>('sayHello', 'hello'), null); + }); + test('can invoke method and get error', () async { BinaryMessages.setMockMessageHandler( 'ch7',