Fixed bug where we could accidently call a callback twice. (#43467)
This commit is contained in:
parent
05c3f7b6a1
commit
53dcf92f7d
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
});
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user