Warning: Pigeon is experimental and unsupported. It can be removed or changed at any time.
Pigeon is a code generator tool to make communication between Flutter and the host platform type-safe and easier.
Currently Pigeon only supports generating Objective-C code for usage on iOS and calling host functions from Flutter.
Pigeon generates all the code that is needed to communicate between Flutter and the host platform, there is no extra runtime requirement. A plugin author doesn't need to worry about conflicting versions of Pigeon.
ios/Runner.xcworkspace
XCode project for compilation.abstract class
with either HostApi()
or FlutterApi()
as metadata. The former being for procedures that are defined on the host platform and the latter for procedures that are defined in Dart.import 'package:pigeon/pigeon_lib.dart'; class SearchRequest { String query; } class SearchReply { String result; } @HostApi() abstract class Api { SearchReply search(SearchRequest request); }
pub run pigeon \ --input pigeons/message.dart \ --dart_out lib/pigeon.dart \ --objc_header_out ios/Runner/pigeon.h \ --objc_source_out ios/Runner/pigeon.m
#import "AppDelegate.h" #import <Flutter/Flutter.h> #import "pigeon.h" @interface MyApi : NSObject <Api> @end @implementation MyApi -(SearchReply*)search:(SearchRequest*)request { SearchReply *reply = [[SearchReply alloc] init]; reply.result = [NSString stringWithFormat:@"Hi %@!", request.query]; return reply; } @end - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey, id> *)launchOptions { MyApi *api = [[MyApi alloc] init]; ApiSetup(getFlutterEngine().binaryMessenger, api); return YES; }
import 'pigeon.dart'; void main() { testWidgets("test pigeon", (WidgetTester tester) async { SearchRequest request = SearchRequest()..query = "Aaron"; Api api = Api(); SearchReply reply = await api.search(request); expect(reply.result, equals("Hi Aaron!")); }); }
Pigeon uses the StandardMessageCodec
so it supports any data-type platform channels supports [documentation]. Nested data-types are supported, too.
Note: Generics for List and Map aren't supported yet.
File an issue in flutter/flutter with the word ‘pigeon’ clearly in the title and cc @gaaclarke.