diff --git a/packages/flutter/lib/src/services/binding.dart b/packages/flutter/lib/src/services/binding.dart index 3e8972cc07..1553b368c7 100644 --- a/packages/flutter/lib/src/services/binding.dart +++ b/packages/flutter/lib/src/services/binding.dart @@ -200,6 +200,7 @@ class _DefaultBinaryMessenger extends BinaryMessenger { response = await handler(data); } else { ui.channelBuffers.push(channel, data, callback); + callback = null; } } catch (exception, stack) { FlutterError.reportError(FlutterErrorDetails( @@ -209,7 +210,9 @@ class _DefaultBinaryMessenger extends BinaryMessenger { context: ErrorDescription('during a platform message callback'), )); } finally { - callback(response); + if (callback != null) { + callback(response); + } } } diff --git a/packages/flutter/test/services/default_binary_messenger_test.dart b/packages/flutter/test/services/default_binary_messenger_test.dart new file mode 100644 index 0000000000..cf6e78e7ce --- /dev/null +++ b/packages/flutter/test/services/default_binary_messenger_test.dart @@ -0,0 +1,37 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; +import 'dart:typed_data'; +import 'dart:ui' as ui; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + ByteData _makeByteData(String str) { + final List list = utf8.encode(str); + final ByteBuffer buffer = + list is Uint8List ? list.buffer : Uint8List.fromList(list).buffer; + return ByteData.view(buffer); + } + + test('default binary messenger calls callback once', () async { + int count = 0; + const String channel = 'foo'; + ServicesBinding.instance.defaultBinaryMessenger.handlePlatformMessage( + channel, _makeByteData('bar'), (ByteData message) async { + count += 1; + return null; + }); + expect(count, equals(0)); + await ui.channelBuffers.drain(channel, + (ByteData data, ui.PlatformMessageResponseCallback callback) { + callback(null); + return null; + }); + expect(count, equals(1)); + }); +} diff --git a/packages/flutter_web_plugins/lib/src/plugin_registry.dart b/packages/flutter_web_plugins/lib/src/plugin_registry.dart index a867b2ad58..d0d83e6753 100644 --- a/packages/flutter_web_plugins/lib/src/plugin_registry.dart +++ b/packages/flutter_web_plugins/lib/src/plugin_registry.dart @@ -82,6 +82,7 @@ class _PlatformBinaryMessenger extends BinaryMessenger { response = await handler(data); } else { ui.channelBuffers.push(channel, data, callback); + callback = null; } } catch (exception, stack) { FlutterError.reportError(FlutterErrorDetails( @@ -91,7 +92,9 @@ class _PlatformBinaryMessenger extends BinaryMessenger { context: ErrorDescription('during a plugin platform message call'), )); } finally { - callback(response); + if (callback != null) { + callback(response); + } } }