Skip to content

Commit 894640f

Browse files
authored
[pigeon] fixes event channel dart instance name usage and adds test (#8483)
fixes event channel dart instance name usage and adds test fixes flutter/flutter#161813
1 parent ac08525 commit 894640f

File tree

14 files changed

+197
-10
lines changed

14 files changed

+197
-10
lines changed

packages/pigeon/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 22.7.4
2+
3+
* [dart] Fixes bug with multi-instance event channel support.
4+
15
## 22.7.3
26

37
* Adds compatibility with `analyzer` 7.x.*.

packages/pigeon/example/app/lib/src/event_channel_messages.g.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ Stream<PlatformEvent> streamEvents({String instanceName = ''}) {
9393
if (instanceName.isNotEmpty) {
9494
instanceName = '.$instanceName';
9595
}
96-
const EventChannel streamEventsChannel = EventChannel(
97-
'dev.flutter.pigeon.pigeon_example_package.EventChannelMethods.streamEvents',
96+
final EventChannel streamEventsChannel = EventChannel(
97+
'dev.flutter.pigeon.pigeon_example_package.EventChannelMethods.streamEvents$instanceName',
9898
pigeonMethodCodec);
9999
return streamEventsChannel.receiveBroadcastStream().map((dynamic event) {
100100
return event as PlatformEvent;

packages/pigeon/lib/dart_generator.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -556,8 +556,8 @@ final BinaryMessenger? ${varNamePrefix}binaryMessenger;
556556
if (instanceName.isNotEmpty) {
557557
instanceName = '.\$instanceName';
558558
}
559-
const EventChannel ${func.name}Channel =
560-
EventChannel('${makeChannelName(api, func, dartPackageName)}', $_pigeonMethodChannelCodec);
559+
final EventChannel ${func.name}Channel =
560+
EventChannel('${makeChannelName(api, func, dartPackageName)}\$instanceName', $_pigeonMethodChannelCodec);
561561
return ${func.name}Channel.receiveBroadcastStream().map((dynamic event) {
562562
return event as ${func.returnType.baseName};
563563
});

packages/pigeon/lib/generator_tools.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import 'ast.dart';
1414
/// The current version of pigeon.
1515
///
1616
/// This must match the version in pubspec.yaml.
17-
const String pigeonVersion = '22.7.3';
17+
const String pigeonVersion = '22.7.4';
1818

1919
/// Read all the content from [stdin] to a String.
2020
String readStdin() {

packages/pigeon/pigeons/event_channel_tests.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,4 +141,5 @@ class ClassEvent extends PlatformEvent {
141141
abstract class EventChannelMethods {
142142
int streamInts();
143143
PlatformEvent streamEvents();
144+
int streamConsistentNumbers();
144145
}

packages/pigeon/platform_tests/shared_test_plugin_code/lib/integration_tests.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2865,6 +2865,7 @@ void runPigeonIntegrationTests(TargetGenerator targetGenerator) {
28652865
TargetGenerator.kotlin,
28662866
TargetGenerator.swift
28672867
];
2868+
28682869
testWidgets('event channel sends continuous ints', (_) async {
28692870
final Stream<int> events = streamInts();
28702871
final List<int> listEvents = await events.toList();
@@ -2912,6 +2913,24 @@ void runPigeonIntegrationTests(TargetGenerator targetGenerator) {
29122913
});
29132914
await completer.future;
29142915
}, skip: !eventChannelSupported.contains(targetGenerator));
2916+
2917+
testWidgets('event channels handle multiple instances', (_) async {
2918+
final Completer<void> completer1 = Completer<void>();
2919+
final Completer<void> completer2 = Completer<void>();
2920+
final Stream<int> events1 = streamConsistentNumbers(instanceName: '1');
2921+
final Stream<int> events2 = streamConsistentNumbers(instanceName: '2');
2922+
2923+
events1.listen((int event) {
2924+
expect(event, 1);
2925+
}).onDone(() => completer1.complete());
2926+
2927+
events2.listen((int event) {
2928+
expect(event, 2);
2929+
}).onDone(() => completer2.complete());
2930+
2931+
await completer1.future;
2932+
await completer2.future;
2933+
}, skip: !eventChannelSupported.contains(targetGenerator));
29152934
}
29162935

29172936
class _FlutterApiTestImplementation implements FlutterIntegrationCoreApi {

packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/event_channel_tests.gen.dart

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -432,8 +432,8 @@ Stream<int> streamInts({String instanceName = ''}) {
432432
if (instanceName.isNotEmpty) {
433433
instanceName = '.$instanceName';
434434
}
435-
const EventChannel streamIntsChannel = EventChannel(
436-
'dev.flutter.pigeon.pigeon_integration_tests.EventChannelMethods.streamInts',
435+
final EventChannel streamIntsChannel = EventChannel(
436+
'dev.flutter.pigeon.pigeon_integration_tests.EventChannelMethods.streamInts$instanceName',
437437
pigeonMethodCodec);
438438
return streamIntsChannel.receiveBroadcastStream().map((dynamic event) {
439439
return event as int;
@@ -444,10 +444,24 @@ Stream<PlatformEvent> streamEvents({String instanceName = ''}) {
444444
if (instanceName.isNotEmpty) {
445445
instanceName = '.$instanceName';
446446
}
447-
const EventChannel streamEventsChannel = EventChannel(
448-
'dev.flutter.pigeon.pigeon_integration_tests.EventChannelMethods.streamEvents',
447+
final EventChannel streamEventsChannel = EventChannel(
448+
'dev.flutter.pigeon.pigeon_integration_tests.EventChannelMethods.streamEvents$instanceName',
449449
pigeonMethodCodec);
450450
return streamEventsChannel.receiveBroadcastStream().map((dynamic event) {
451451
return event as PlatformEvent;
452452
});
453453
}
454+
455+
Stream<int> streamConsistentNumbers({String instanceName = ''}) {
456+
if (instanceName.isNotEmpty) {
457+
instanceName = '.$instanceName';
458+
}
459+
final EventChannel streamConsistentNumbersChannel = EventChannel(
460+
'dev.flutter.pigeon.pigeon_integration_tests.EventChannelMethods.streamConsistentNumbers$instanceName',
461+
pigeonMethodCodec);
462+
return streamConsistentNumbersChannel
463+
.receiveBroadcastStream()
464+
.map((dynamic event) {
465+
return event as int;
466+
});
467+
}

packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/EventChannelTests.gen.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,3 +470,22 @@ abstract class StreamEventsStreamHandler : PigeonEventChannelWrapper<PlatformEve
470470
}
471471
}
472472
}
473+
474+
abstract class StreamConsistentNumbersStreamHandler : PigeonEventChannelWrapper<Long> {
475+
companion object {
476+
fun register(
477+
messenger: BinaryMessenger,
478+
streamHandler: StreamConsistentNumbersStreamHandler,
479+
instanceName: String = ""
480+
) {
481+
var channelName: String =
482+
"dev.flutter.pigeon.pigeon_integration_tests.EventChannelMethods.streamConsistentNumbers"
483+
if (instanceName.isNotEmpty()) {
484+
channelName += ".$instanceName"
485+
}
486+
val internalStreamHandler = PigeonStreamHandler<Long>(streamHandler)
487+
EventChannel(messenger, channelName, EventChannelTestsPigeonMethodCodec)
488+
.setStreamHandler(internalStreamHandler)
489+
}
490+
}
491+
}

packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/TestPlugin.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ class TestPlugin : FlutterPlugin, HostIntegrationCoreApi {
3131

3232
StreamEventsStreamHandler.register(binding.binaryMessenger, SendClass)
3333
StreamIntsStreamHandler.register(binding.binaryMessenger, SendInts)
34+
StreamConsistentNumbersStreamHandler.register(
35+
binding.binaryMessenger, SendConsistentNumbers(1), "1")
36+
StreamConsistentNumbersStreamHandler.register(
37+
binding.binaryMessenger, SendConsistentNumbers(2), "2")
3438
}
3539

3640
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
@@ -927,3 +931,27 @@ object SendClass : StreamEventsStreamHandler() {
927931
handler.postDelayed(r, 10)
928932
}
929933
}
934+
935+
class SendConsistentNumbers(private val numberToSend: Long) :
936+
StreamConsistentNumbersStreamHandler() {
937+
private val handler = Handler(Looper.getMainLooper())
938+
939+
override fun onListen(p0: Any?, sink: PigeonEventSink<Long>) {
940+
var count: Int = 0
941+
val r: Runnable =
942+
object : Runnable {
943+
override fun run() {
944+
if (count >= 10) {
945+
sink.endOfStream()
946+
} else {
947+
handler.post {
948+
sink.success(numberToSend)
949+
count++
950+
}
951+
handler.postDelayed(this, 10)
952+
}
953+
}
954+
}
955+
handler.postDelayed(r, 10)
956+
}
957+
}

packages/pigeon/platform_tests/test_plugin/ios/Classes/EventChannelTests.gen.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,3 +574,21 @@ class StreamEventsStreamHandler: PigeonEventChannelWrapper<PlatformEvent> {
574574
channel.setStreamHandler(internalStreamHandler)
575575
}
576576
}
577+
578+
class StreamConsistentNumbersStreamHandler: PigeonEventChannelWrapper<Int64> {
579+
static func register(
580+
with messenger: FlutterBinaryMessenger,
581+
instanceName: String = "",
582+
streamHandler: StreamConsistentNumbersStreamHandler
583+
) {
584+
var channelName =
585+
"dev.flutter.pigeon.pigeon_integration_tests.EventChannelMethods.streamConsistentNumbers"
586+
if !instanceName.isEmpty {
587+
channelName += ".\(instanceName)"
588+
}
589+
let internalStreamHandler = PigeonStreamHandler<Int64>(wrapper: streamHandler)
590+
let channel = FlutterEventChannel(
591+
name: channelName, binaryMessenger: messenger, codec: eventChannelTestsPigeonMethodCodec)
592+
channel.setStreamHandler(internalStreamHandler)
593+
}
594+
}

0 commit comments

Comments
 (0)