Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/pigeon/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 26.3.5

* [swift] Adds `CaseIterable` conformance to generated enums.

## 26.3.4

* [kotlin] Updates generated error class to inherit from `RuntimeException`
Expand Down
24 changes: 12 additions & 12 deletions packages/pigeon/example/app/ios/Runner/EventChannelMessages.g.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ private func doubleEqualsEventChannelMessages(_ lhs: Double, _ rhs: Double) -> B

private func doubleHashEventChannelMessages(_ value: Double, _ hasher: inout Hasher) {
if value.isNaN {
hasher.combine(0x7FF8_0000_0000_0000)
hasher.combine(0x7FF8000000000000)
} else {
// Normalize -0.0 to 0.0
hasher.combine(value == 0 ? 0 : value)
Expand Down Expand Up @@ -132,6 +132,7 @@ func deepHashEventChannelMessages(value: Any?, hasher: inout Hasher) {
}
}


/// Generated class from Pigeon that represents data sent in messages.
/// This protocol should not be extended by any user class outside of the generated file.
protocol PlatformEvent {
Expand All @@ -142,6 +143,7 @@ protocol PlatformEvent {
struct IntEvent: PlatformEvent {
var data: Int64


// swift-format-ignore: AlwaysUseLowerCamelCase
static func fromList(_ pigeonVar_list: [Any?]) -> IntEvent? {
let data = pigeonVar_list[0] as! Int64
Expand Down Expand Up @@ -172,6 +174,7 @@ struct IntEvent: PlatformEvent {
struct StringEvent: PlatformEvent {
var data: String


// swift-format-ignore: AlwaysUseLowerCamelCase
static func fromList(_ pigeonVar_list: [Any?]) -> StringEvent? {
let data = pigeonVar_list[0] as! String
Expand Down Expand Up @@ -236,12 +239,11 @@ private class EventChannelMessagesPigeonCodecReaderWriter: FlutterStandardReader
}

class EventChannelMessagesPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable {
static let shared = EventChannelMessagesPigeonCodec(
readerWriter: EventChannelMessagesPigeonCodecReaderWriter())
static let shared = EventChannelMessagesPigeonCodec(readerWriter: EventChannelMessagesPigeonCodecReaderWriter())
}

var eventChannelMessagesPigeonMethodCodec = FlutterStandardMethodCodec(
readerWriter: EventChannelMessagesPigeonCodecReaderWriter())
var eventChannelMessagesPigeonMethodCodec = FlutterStandardMethodCodec(readerWriter: EventChannelMessagesPigeonCodecReaderWriter());


private class PigeonStreamHandler<ReturnType>: NSObject, FlutterStreamHandler {
private let wrapper: PigeonEventChannelWrapper<ReturnType>
Expand Down Expand Up @@ -293,18 +295,16 @@ class PigeonEventSink<ReturnType> {
}

class StreamEventsStreamHandler: PigeonEventChannelWrapper<PlatformEvent> {
static func register(
with messenger: FlutterBinaryMessenger,
instanceName: String = "",
streamHandler: StreamEventsStreamHandler
) {
static func register(with messenger: FlutterBinaryMessenger,
instanceName: String = "",
streamHandler: StreamEventsStreamHandler) {
var channelName = "dev.flutter.pigeon.pigeon_example_package.EventChannelMethods.streamEvents"
if !instanceName.isEmpty {
channelName += ".\(instanceName)"
}
let internalStreamHandler = PigeonStreamHandler<PlatformEvent>(wrapper: streamHandler)
let channel = FlutterEventChannel(
name: channelName, binaryMessenger: messenger, codec: eventChannelMessagesPigeonMethodCodec)
let channel = FlutterEventChannel(name: channelName, binaryMessenger: messenger, codec: eventChannelMessagesPigeonMethodCodec)
channel.setStreamHandler(internalStreamHandler)
}
}

51 changes: 16 additions & 35 deletions packages/pigeon/example/app/ios/Runner/Messages.g.swift
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,7 @@ private func wrapError(_ error: Any) -> [Any?] {
}

private func createConnectionError(withChannelName channelName: String) -> PigeonError {
return PigeonError(
code: "channel-error", message: "Unable to establish connection on channel: '\(channelName)'.",
details: "")
return PigeonError(code: "channel-error", message: "Unable to establish connection on channel: '\(channelName)'.", details: "")
}

private func isNullish(_ value: Any?) -> Bool {
Expand All @@ -79,7 +77,7 @@ private func doubleEqualsMessages(_ lhs: Double, _ rhs: Double) -> Bool {

private func doubleHashMessages(_ value: Double, _ hasher: inout Hasher) {
if value.isNaN {
hasher.combine(0x7FF8_0000_0000_0000)
hasher.combine(0x7FF8000000000000)
} else {
// Normalize -0.0 to 0.0
hasher.combine(value == 0 ? 0 : value)
Expand Down Expand Up @@ -182,7 +180,8 @@ func deepHashMessages(value: Any?, hasher: inout Hasher) {
}
}

enum Code: Int {

enum Code: Int, CaseIterable {
case one = 0
case two = 1
}
Expand All @@ -194,6 +193,7 @@ struct MessageData: Hashable {
var code: Code
var data: [String: String]


// swift-format-ignore: AlwaysUseLowerCamelCase
static func fromList(_ pigeonVar_list: [Any?]) -> MessageData? {
let name: String? = nilOrValue(pigeonVar_list[0])
Expand All @@ -220,9 +220,7 @@ struct MessageData: Hashable {
if Swift.type(of: lhs) != Swift.type(of: rhs) {
return false
}
return deepEqualsMessages(lhs.name, rhs.name)
&& deepEqualsMessages(lhs.description, rhs.description)
&& deepEqualsMessages(lhs.code, rhs.code) && deepEqualsMessages(lhs.data, rhs.data)
return deepEqualsMessages(lhs.name, rhs.name) && deepEqualsMessages(lhs.description, rhs.description) && deepEqualsMessages(lhs.code, rhs.code) && deepEqualsMessages(lhs.data, rhs.data)
}

func hash(into hasher: inout Hasher) {
Expand Down Expand Up @@ -279,6 +277,7 @@ class MessagesPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable {
static let shared = MessagesPigeonCodec(readerWriter: MessagesPigeonCodecReaderWriter())
}


/// Generated protocol from Pigeon that represents a handler of messages from Flutter.
protocol ExampleHostApi {
func getHostLanguage() throws -> String
Expand All @@ -290,14 +289,9 @@ protocol ExampleHostApi {
class ExampleHostApiSetup {
static var codec: FlutterStandardMessageCodec { MessagesPigeonCodec.shared }
/// Sets up an instance of `ExampleHostApi` to handle messages through the `binaryMessenger`.
static func setUp(
binaryMessenger: FlutterBinaryMessenger, api: ExampleHostApi?, messageChannelSuffix: String = ""
) {
static func setUp(binaryMessenger: FlutterBinaryMessenger, api: ExampleHostApi?, messageChannelSuffix: String = "") {
let channelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : ""
let getHostLanguageChannel = FlutterBasicMessageChannel(
name:
"dev.flutter.pigeon.pigeon_example_package.ExampleHostApi.getHostLanguage\(channelSuffix)",
binaryMessenger: binaryMessenger, codec: codec)
let getHostLanguageChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.pigeon_example_package.ExampleHostApi.getHostLanguage\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
if let api = api {
getHostLanguageChannel.setMessageHandler { _, reply in
do {
Expand All @@ -310,9 +304,7 @@ class ExampleHostApiSetup {
} else {
getHostLanguageChannel.setMessageHandler(nil)
}
let addChannel = FlutterBasicMessageChannel(
name: "dev.flutter.pigeon.pigeon_example_package.ExampleHostApi.add\(channelSuffix)",
binaryMessenger: binaryMessenger, codec: codec)
let addChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.pigeon_example_package.ExampleHostApi.add\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
if let api = api {
addChannel.setMessageHandler { message, reply in
let args = message as! [Any?]
Expand All @@ -328,9 +320,7 @@ class ExampleHostApiSetup {
} else {
addChannel.setMessageHandler(nil)
}
let sendMessageChannel = FlutterBasicMessageChannel(
name: "dev.flutter.pigeon.pigeon_example_package.ExampleHostApi.sendMessage\(channelSuffix)",
binaryMessenger: binaryMessenger, codec: codec)
let sendMessageChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.pigeon_example_package.ExampleHostApi.sendMessage\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
if let api = api {
sendMessageChannel.setMessageHandler { message, reply in
let args = message as! [Any?]
Expand All @@ -351,8 +341,7 @@ class ExampleHostApiSetup {
}
/// Generated protocol from Pigeon that represents Flutter messages that can be called from Swift.
protocol MessageFlutterApiProtocol {
func flutterMethod(
aString aStringArg: String?, completion: @escaping (Result<String, PigeonError>) -> Void)
func flutterMethod(aString aStringArg: String?, completion: @escaping (Result<String, PigeonError>) -> Void)
}
class MessageFlutterApi: MessageFlutterApiProtocol {
private let binaryMessenger: FlutterBinaryMessenger
Expand All @@ -364,13 +353,9 @@ class MessageFlutterApi: MessageFlutterApiProtocol {
var codec: MessagesPigeonCodec {
return MessagesPigeonCodec.shared
}
func flutterMethod(
aString aStringArg: String?, completion: @escaping (Result<String, PigeonError>) -> Void
) {
let channelName: String =
"dev.flutter.pigeon.pigeon_example_package.MessageFlutterApi.flutterMethod\(messageChannelSuffix)"
let channel = FlutterBasicMessageChannel(
name: channelName, binaryMessenger: binaryMessenger, codec: codec)
func flutterMethod(aString aStringArg: String?, completion: @escaping (Result<String, PigeonError>) -> Void) {
let channelName: String = "dev.flutter.pigeon.pigeon_example_package.MessageFlutterApi.flutterMethod\(messageChannelSuffix)"
let channel = FlutterBasicMessageChannel(name: channelName, binaryMessenger: binaryMessenger, codec: codec)
channel.sendMessage([aStringArg] as [Any?]) { response in
guard let listResponse = response as? [Any?] else {
completion(.failure(createConnectionError(withChannelName: channelName)))
Expand All @@ -382,11 +367,7 @@ class MessageFlutterApi: MessageFlutterApiProtocol {
let details: String? = nilOrValue(listResponse[2])
completion(.failure(PigeonError(code: code, message: message, details: details)))
} else if listResponse[0] == nil {
completion(
.failure(
PigeonError(
code: "null-error",
message: "Flutter api returned null value for non-null return value.", details: "")))
completion(.failure(PigeonError(code: "null-error", message: "Flutter api returned null value for non-null return value.", details: "")))
} else {
let result = listResponse[0] as! String
completion(.success(result))
Expand Down
58 changes: 33 additions & 25 deletions packages/pigeon/example/app/lib/src/event_channel_messages.g.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import 'dart:typed_data' show Float64List, Int32List, Int64List;

import 'package:flutter/services.dart';
import 'package:meta/meta.dart' show immutable, protected, visibleForTesting;

bool _deepEquals(Object? a, Object? b) {
if (identical(a, b)) {
return true;
Expand All @@ -24,9 +23,8 @@ bool _deepEquals(Object? a, Object? b) {
}
if (a is List && b is List) {
return a.length == b.length &&
a.indexed.every(
((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]),
);
a.indexed
.every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]));
}
if (a is Map && b is Map) {
if (a.length != b.length) {
Expand Down Expand Up @@ -75,24 +73,31 @@ int _deepHash(Object? value) {
return value.hashCode;
}

sealed class PlatformEvent {}

sealed class PlatformEvent {
}

class IntEvent extends PlatformEvent {
IntEvent({required this.data});
IntEvent({
required this.data,
});

int data;

List<Object?> _toList() {
return <Object?>[data];
return <Object?>[
data,
];
}

Object encode() {
return _toList();
}
return _toList(); }

static IntEvent decode(Object result) {
result as List<Object?>;
return IntEvent(data: result[0]! as int);
return IntEvent(
data: result[0]! as int,
);
}

@override
Expand All @@ -113,21 +118,26 @@ class IntEvent extends PlatformEvent {
}

class StringEvent extends PlatformEvent {
StringEvent({required this.data});
StringEvent({
required this.data,
});

String data;

List<Object?> _toList() {
return <Object?>[data];
return <Object?>[
data,
];
}

Object encode() {
return _toList();
}
return _toList(); }

static StringEvent decode(Object result) {
result as List<Object?>;
return StringEvent(data: result[0]! as String);
return StringEvent(
data: result[0]! as String,
);
}

@override
Expand All @@ -147,17 +157,18 @@ class StringEvent extends PlatformEvent {
int get hashCode => _deepHash(<Object?>[runtimeType, ..._toList()]);
}


class _PigeonCodec extends StandardMessageCodec {
const _PigeonCodec();
@override
void writeValue(WriteBuffer buffer, Object? value) {
if (value is int) {
buffer.putUint8(4);
buffer.putInt64(value);
} else if (value is IntEvent) {
} else if (value is IntEvent) {
buffer.putUint8(129);
writeValue(buffer, value.encode());
} else if (value is StringEvent) {
} else if (value is StringEvent) {
buffer.putUint8(130);
writeValue(buffer, value.encode());
} else {
Expand All @@ -178,19 +189,16 @@ class _PigeonCodec extends StandardMessageCodec {
}
}

const StandardMethodCodec pigeonMethodCodec = StandardMethodCodec(
_PigeonCodec(),
);
const StandardMethodCodec pigeonMethodCodec = StandardMethodCodec(_PigeonCodec());

Stream<PlatformEvent> streamEvents({String instanceName = ''}) {
Stream<PlatformEvent> streamEvents( {String instanceName = ''}) {
if (instanceName.isNotEmpty) {
instanceName = '.$instanceName';
}
final EventChannel streamEventsChannel = EventChannel(
'dev.flutter.pigeon.pigeon_example_package.EventChannelMethods.streamEvents$instanceName',
pigeonMethodCodec,
);
final EventChannel streamEventsChannel =
EventChannel('dev.flutter.pigeon.pigeon_example_package.EventChannelMethods.streamEvents$instanceName', pigeonMethodCodec);
return streamEventsChannel.receiveBroadcastStream().map((dynamic event) {
return event as PlatformEvent;
});
}

Loading