Unhandled Exception: MissingPluginException(No implementation found for method pickImage on channelplugins.flutter.io/image_picker)
当我们在flutter页面调取相机或者相册时失败,无任何反应.查看控制台日志发现报了上面的错误,很明显是因为找不到相关的方法,也就说pickImage这个方法注入失败了.
那么为什么会失败呢?经过多次猜测和尝试,终于解决了问题! 我们在初始化FlutterViewController的时候不能直接 [FlutterViewController new] 而是使用[[FlutterViewController alloc] initWithEngine:engine nibName:nil bundle:nil] 来初始化或者使用[[FlutterViewController alloc] initWithProject:nil nibName:nil bundle:nil]的方式.在使用后者时同时可以解决setInitialRoute路由失效的问题,此时FlutterDartProject是可以传nil的,那么FlutterDartProject这个类做了什么具体的工作目前我也不是很清楚,当然可以肯定的是默认创建了一个engine,因为flutter页面必然要FlutterEngine支撑的. 这其中的engine是我们需要重新初始化的engine.笔者猜测使用直接new的方式系统为我们创建一个engine,但是这个engine会在pickImage之后初始化,然后覆盖了pickImage的注入.这里只是猜测,如果知道具体机制的烦请告知!
因此,在此可以得出结论[[FlutterViewController alloc] initWithProject:nil nibName:nil bundle:nil] 方式初始化可以同时解决这两个问题. 但是FlutterDartProject有何作用或者弊端还请知道的同学指点一二.
附engine初始化代码:
- (FlutterEngine *)flutterEngine
{
if (_flutterEngine == nil) {
_flutterEngine = [[FlutterEngine alloc] initWithName:@"io.flutter"];//name名字可以自定义
[_flutterEngine run];
[GeneratedPluginRegistrant registerWithRegistry:_flutterEngine];
}
return _flutterEngine;
}