环境
Flutter 3.29
macOS Sequoia 15.4.1
Xcode 16.3
集成
Flutter提供了camera插件来拍照和录视频,它提供了一系列可用的相机,并使用特定的相机展示相机预览、拍照、录视频。
添加依赖
- camera: 提供使用设备相机模块的工具
- path_provider: 寻找存储图片的正确路径
- path: 创建适配任何平台的路径
flutter pub add camera path_provider path
执行完成后iOS工程的GeneratedPluginRegistrant.m文件会自动生成对应的集成代码
#if __has_include(<camera_avfoundation/CameraPlugin.h>)
#import <camera_avfoundation/CameraPlugin.h>
#else
@import camera_avfoundation;
#endif
#if __has_include(<path_provider_foundation/PathProviderPlugin.h>)
#import <path_provider_foundation/PathProviderPlugin.h>
#else
@import path_provider_foundation;
#endif
...
[CameraPlugin registerWithRegistrar:[registry registrarForPlugin:@"CameraPlugin"]];
[PathProviderPlugin registerWithRegistrar:[registry registrarForPlugin:@"PathProviderPlugin"]];
分析
[registry registrarForPlugin:@“CameraPlugin”]
在AppDelegate.swfit的application(_:didFinishLaunchingWithOptions:)中将FlutterAppDelegate的子类AppDelegate对象作为参数传入并调用该方法
GeneratedPluginRegistrant.register(with: self)
- (NSObject<FlutterPluginRegistrar>*)registrarForPlugin:(NSString*)pluginKey {
/// <1> 获取应用的flutterRootViewController对象
FlutterViewController* flutterRootViewController = [self rootFlutterViewController];
if (flutterRootViewController) {
/// <4> 返回一个FlutterEngine对象
return [[flutterRootViewController pluginRegistry] registrarForPlugin:pluginKey];
}
return nil;
}
// Returns the key window's rootViewController, if it's a FlutterViewController.
// Otherwise, returns nil.
- (FlutterViewController*)rootFlutterViewController {
///- (FlutterViewController*(^ rootFlutterViewControllerGetter) (void))
/// <2> 检查是否有外部注入,有则使用自定义的回调获取FlutterViewController对象
if (_rootFlutterViewControllerGetter != nil) {
return _rootFlutterViewControllerGetter();
}
/// <3> 没有则检查window的rootViewController属性,如果是FlutterViewController则返回,否则返回nil
UIViewController* rootViewController = _window.rootViewController;
if ([rootViewController isKindOfClass:[FlutterViewController class]]) {
return (FlutterViewController*)rootViewController;
}
return nil;
}
[flutterRootViewController pluginRegistry]
第<4>步中的方法调用在 FlutterViewController.mm
/// pluginRegistry方法获得一个遵守FlutterPluginRegistry协议的对象
- (id<FlutterPluginRegistry>)pluginRegistry {
return self.engine;
}
...
/// engine是FlutterEngine对象
- (void)sharedSetupWithProject:(nullable FlutterDartProject*)project
initialRoute:(nullable NSString*)initialRoute {
...
engine = [[FlutterEngine alloc] initWithName:@"io.flutter"
project:project
allowHeadlessExecution:self.engineAllowHeadlessExecution
restorationEnabled:self.restorationIdentifier != nil];
...
_engine = engine;
...
- (instancetype)initWithEngine:(FlutterEngine*)engine
nibName:(nullable NSString*)nibName
bundle:(nullable NSBundle*)nibBundle {
...
_engine = engine;
FlutterPluginRegistry协议的继承结构

FlutterEngine对象调用registrarForPlugin:方法
/// 文件: FlutterEngine.mm
...
/**
* All registrars returned from registrarForPlugin:
*/
@property(nonatomic, readonly)
NSMutableDictionary<NSString*, FlutterEngineRegistrar*>* pluginRegistrars;
...
- (id<FlutterPluginRegistrar>)registrarForPlugin:(NSString*)pluginName {
/// <5> 检查可变字典中是否已存在插件名的key
id<FlutterPluginRegistrar> registrar = self.pluginRegistrars[pluginName];
if (!registrar) {
/// <6> 首次注册,生成FlutterEngineRegistrar对象并持有pluginName和弱引用FlutterEngine 对象
/// 为什么是弱引用?
/// 文件:FlutterViewController.m 强引入了FlutterEngine对象
/// @property(nonatomic, readonly) FlutterEngine* engine;
FlutterEngineRegistrar* registrarImpl =
[[FlutterEngineRegistrar alloc] initWithPlu

最低0.47元/天 解锁文章
1075





