Flutter iOS混编: image_picker 相机和相册调起失败及setInitialRoute路由失效问题

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;
}

你可能感兴趣的:(Flutter iOS混编: image_picker 相机和相册调起失败及setInitialRoute路由失效问题)