本文记录在flutter中嵌入原生系统时view遇到的刷新问题和尝试过的解决方案。
1. 什么是Platform view ?
由于 Flutter 诞生于 Android 、iOS 非常成熟的时代背景,为了能让一些现有的 native 控件直接引用到 Flutter app 中,Flutter 团队提供了 AndroidView 、UIKitView 两个 widget 来满足需求,比如说 Flutter 中的 Webview、MapView,这样无需使用 Flutter 重新开发一套。
其实 Platform view 就是 AndroidView 和 UIKitView 的总称,允许将 native view 嵌入到了 flutter widget 体系中,完成 Dart 代码对 native view 的控制。
2. 使用Platform view遇到的问题
项目中需要实现视频通话的功能,效果见下图。由于使用的视频通话sdk没有flutter版本的,且sdk只提供渲染后的视图view,不提供视频数据。所以只能考虑在flutter中嵌入原生系统Platform view。
实现步骤以Android平台为例,我们需要先对视频通话sdk进行一次封装以便flutter层能调用。
首先在原生系统层将视频通话视图列表缓存到一个列表中,列表的每个item包含一个通话视图、视图id及其他信息,通话视图通过Platformview的方式暴露给flutter层。
然后把每个视图的id列表,通过MethodChannel的方式传递给flutter层。flutter层获取到视图的id列表,通过给Platformview传递视图id来获取某个item的通话视图,再将该视图显示到具体的位置。
实际测试发现,视频通话列表可以正常显示,但在列表数量变化时(比如有人加入了视频通话),视图列表出现错乱。
异常log如下:
从log可以看到,报错是因为flutter加载原生view时,该原生view还被另一个父view引用;Android中规定一个view只能有一个父view,所以这里报错。