Fixed bug where we could accidently call a callback twice. (#43467)

diff --git a/packages/flutter/lib/src/services/binding.dart b/packages/flutter/lib/src/services/binding.dart
index 3e8972c..1553b36 100644
--- a/packages/flutter/lib/src/services/binding.dart
+++ b/packages/flutter/lib/src/services/binding.dart
@@ -200,6 +200,7 @@
         response = await handler(data);
       } else {
         ui.channelBuffers.push(channel, data, callback);
+        callback = null;
       }
     } catch (exception, stack) {
       FlutterError.reportError(FlutterErrorDetails(
@@ -209,7 +210,9 @@
         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 0000000..cf6e78e
--- /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<int> 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 a867b2a..d0d83e6 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 @@
         response = await handler(data);
       } else {
         ui.channelBuffers.push(channel, data, callback);
+        callback = null;
       }
     } catch (exception, stack) {
       FlutterError.reportError(FlutterErrorDetails(
@@ -91,7 +92,9 @@
         context: ErrorDescription('during a plugin platform message call'),
       ));
     } finally {
-      callback(response);
+      if (callback != null) {
+        callback(response);
+      }
     }
   }