PlatformException(channel-error, Unable to establish ...

4,293 阅读1分钟

代码描述

flutter项目中,在原生模块中使用了flutterView,并新建 flutterEngineflutterView 发生绑定关系。在 flutterView 中我们使用了三方库 video-player

报错描述:

  • 当使用新建的 flutterEngine 与 flutterView 发生绑定时,在视图层使用 video-player插件会报错:Unhandled Exception: PlatformException(channel-error, Unable to establish connection on channel., null, null)
  • 使用默认的 flutterEngine 与 flutterView 发生绑定时,不会报错。

问题分析

  • plugin 使用 channel进行交互,channel 与 engine存在对应关系,engine负责绘制dart层ui,并桥接channel。
  • video-player 作为插件引入,默认 channel 与主工程的 engine 进行关联。此时当我们使用 new engine 进行 videoPlayer 的ui层绘制时,videoPlayer 使用 channel 对原生进行数据交互,此时 channel 发送给了 new engine 的通道,但 new engine 并没有与 video-player 插件发生绑定,所以会报错 Unable connection on channel

GeneratedPluginRegistrant 这个类中, flutterEngine与plugin发生绑定注册关系。所以才能通过channel调用相应plugin提供的方法。

处理方式

将我们的new engine与video-player插件进行关联:

newEngine.plugins.add(VideoPlayerPlugin()) //VideoPlayerPlugin由video-player