Я создал приложение для видеовызовов во Flutter, используя Agora SDK. Это доступно только для iOS / Android, поэтому для веб-сборки мне пришлось создать оболочку вокруг существующего Agora web SDK. Из-за способа, которым Flutter рендерит веб-элементы внутри теневого DOM, вы не можете получить доступ к элементам с помощью document.getElementById (), который используется в Agora SDK для добавления видеоплеера. Чтобы обойти это, я рендерим IFrame, в котором есть сценарии div и Agora SDK, связанные вместе.
Все это работает хорошо, но когда любое событие запускается в окне браузера, например, при нажатии кнопки мыши или Если щелкнуть что-либо, IFrame обновит и перестроит просмотр видео, инициализация которого занимает 1-2 секунды.
Можно ли в любом случае отсоединить IFrame от событий браузера? Я попытался пометить HtmlElementView как const и поместить его в StatefulWidget, который регистрирует представление платформы только один раз. На самом деле виджет больше не запускает метод build (), но IFrame все еще обновляется.
Код флаттера
ui.platformViewRegistry.registerViewFactory(
'video-container',
(int viewId) => IFrameElement()
..id = 'my-iframe'
..width = '100%'
..height = '100%'
..src = 'assets/web_elements/agora_container.html'
..allow = "camera; microphone"
..style.border = 'none');
@override
Widget build(BuildContext context) {
print("*****\n\n\nBuilding the web host container\n\n\n*****"); // this is only printing once
return const HtmlElementView(
viewType: 'video-container',
);
}
Код агоры
<div id="local-video"></div>
<div id="remote-video"></div>
<div id="video-canvas"></div>
<script src="scripts/AgoraSDK.js"></script>
<script src="scripts/agora_controller.js"></script>