美文网首页
【Flutter自定义插件】

【Flutter自定义插件】

作者: 24c41111e47b | 来源:发表于2024-01-09 16:56 被阅读0次

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命令是如何自动生成代码的,感兴趣的可以自行了解

相关文章

网友评论

      本文标题:【Flutter自定义插件】

      本文链接:https://www.haomeiwen.com/subject/nclandtx.html