Unverified Commit 53dcf92f authored by gaaclarke's avatar gaaclarke Committed by GitHub

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

parent 05c3f7b6
...@@ -200,6 +200,7 @@ class _DefaultBinaryMessenger extends BinaryMessenger { ...@@ -200,6 +200,7 @@ class _DefaultBinaryMessenger extends BinaryMessenger {
response = await handler(data); response = await handler(data);
} else { } else {
ui.channelBuffers.push(channel, data, callback); ui.channelBuffers.push(channel, data, callback);
callback = null;
} }
} catch (exception, stack) { } catch (exception, stack) {
FlutterError.reportError(FlutterErrorDetails( FlutterError.reportError(FlutterErrorDetails(
...@@ -209,7 +210,9 @@ class _DefaultBinaryMessenger extends BinaryMessenger { ...@@ -209,7 +210,9 @@ class _DefaultBinaryMessenger extends BinaryMessenger {
context: ErrorDescription('during a platform message callback'), context: ErrorDescription('during a platform message callback'),
)); ));
} finally { } finally {
callback(response); if (callback != null) {
callback(response);
}
} }
} }
......
// 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));
});
}
...@@ -82,6 +82,7 @@ class _PlatformBinaryMessenger extends BinaryMessenger { ...@@ -82,6 +82,7 @@ class _PlatformBinaryMessenger extends BinaryMessenger {
response = await handler(data); response = await handler(data);
} else { } else {
ui.channelBuffers.push(channel, data, callback); ui.channelBuffers.push(channel, data, callback);
callback = null;
} }
} catch (exception, stack) { } catch (exception, stack) {
FlutterError.reportError(FlutterErrorDetails( FlutterError.reportError(FlutterErrorDetails(
...@@ -91,7 +92,9 @@ class _PlatformBinaryMessenger extends BinaryMessenger { ...@@ -91,7 +92,9 @@ class _PlatformBinaryMessenger extends BinaryMessenger {
context: ErrorDescription('during a plugin platform message call'), context: ErrorDescription('during a plugin platform message call'),
)); ));
} finally { } finally {
callback(response); if (callback != null) {
callback(response);
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment