Flutter实现自定义插件,有两种方式,一种是直接使用IDE提供的选项创建一个独立的插件包,另一种方式是在主工程中自行实现代码文件,进行自定义,其中第一种方式比较简单,这里主要记录第二种形式自定义以后如何在iOS原生工程中将插件进行注册
分析
先看一下Flutter插件包的注册形式,如下代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
...
[GeneratedPluginRegistrant registerWithRegistry:self];
...
}
GeneratedPluginRegistrant代码内主要形式如下:
+ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry {
...
[FLTDeviceInfoPlusPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTDeviceInfoPlusPlugin"]];
[FlutterBuglyPlugin registerWithRegistrar:[registry registrarForPlugin:@"FlutterBuglyPlugin"]];
...
}
可以看出来,[GeneratedPluginRegistrant registerWithRegistry:self]将appDelegate的self传入了内部,内部调用了 registrarForPlugin
方法进行了注册
自定义
假设我们自行是了一个TestPlugin
, 如下
@interface TestPlugin : NSObject<FlutterPlugin>
@end
@implementation TestPlugin
+ (void)registerWithRegistrar:(NSObject <FlutterPluginRegistrar> *)registrar {
FlutterMethodChannel *channel = [FlutterMethodChannel
methodChannelWithName:CHANNEL_NAME
binaryMessenger:[registrar messenger]];
FluttertoastPlugin *instance = [[FluttertoastPlugin alloc] init];
instance.channel = channel;
[registrar addMethodCallDelegate:instance channel:channel];
}
@end
按照如下方式进行注册即可:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
...
// 注册自定义插件
[TestPlugin registerWithRegistrar:[self registrarForPlugin:@"TestPlugin"]];
[GeneratedPluginRegistrant registerWithRegistry:self];
...
}
思考
为什么我们在主工程中实现的自定义插件需要手动注册一下,而使用IDE插件的插件包,GeneratedPluginRegistrant中自动包含了注册代码呢?
猜测:flutter pub get
或者 pod install
命令中集成了代码生成脚本,会自行生成 GeneratedPluginRegistrant 的代码,经测试发现,是flutter pub get命令每次执行后 GeneratedPluginRegistrant中的代码会刷新
, flutter pub get命令是如何自动生成代码的,感兴趣的可以自行了解