如何从 rebuilding/rerunning 停止 Flutter Web HtmlElementView?
How to stop Flutter Web HtmlElementView from rebuilding/rerunning?
我使用 Agora SDK 在 Flutter 中构建了一个视频通话应用程序。这仅适用于 iOS/Android,因此对于 Web 构建,我必须围绕现有的 Agora Web SDK 构建一个包装器。由于 Flutter 在阴影 DOM 内呈现 Web 元素的方式,您无法通过 document.getElementById()
访问元素,这是 Agora SDK 用于注入其视频播放器的方式。为了解决这个问题,我正在渲染一个将 div 和 Agora SDK 脚本捆绑在一起的 IFrame。
一切正常,但是当浏览器内部触发任何事件时 window,例如鼠标进入按钮或单击任何内容,IFrame 会刷新并重建视频视图,这需要 1-2 秒初始化。
我是否可以取消 IFrame 与浏览器事件的链接?我尝试将 HtmlElementView 标记为 const 并将其放入仅注册平台视图一次的 StatefulWidget 中。该小部件实际上不再是 运行 build()
方法,但 IFrame 仍会刷新。
Flutter代码
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>
这是 Flutter Web 的活跃问题之一。我想这里提到了一个解决方法:https://github.com/flutter/flutter/issues/53253#issuecomment-607197549
对我有用的是:
Key key = UniqueKey(); // 在构建方法之前
HtmlElementView(
key: key,
viewType: 'iframeElement',
);
现在没有rebuilding/rerunning。请注意,我使用的是 iframeElement,而不是 video-container,但这应该有效。请评论。
我使用 Agora SDK 在 Flutter 中构建了一个视频通话应用程序。这仅适用于 iOS/Android,因此对于 Web 构建,我必须围绕现有的 Agora Web SDK 构建一个包装器。由于 Flutter 在阴影 DOM 内呈现 Web 元素的方式,您无法通过 document.getElementById()
访问元素,这是 Agora SDK 用于注入其视频播放器的方式。为了解决这个问题,我正在渲染一个将 div 和 Agora SDK 脚本捆绑在一起的 IFrame。
一切正常,但是当浏览器内部触发任何事件时 window,例如鼠标进入按钮或单击任何内容,IFrame 会刷新并重建视频视图,这需要 1-2 秒初始化。
我是否可以取消 IFrame 与浏览器事件的链接?我尝试将 HtmlElementView 标记为 const 并将其放入仅注册平台视图一次的 StatefulWidget 中。该小部件实际上不再是 运行 build()
方法,但 IFrame 仍会刷新。
Flutter代码
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>
这是 Flutter Web 的活跃问题之一。我想这里提到了一个解决方法:https://github.com/flutter/flutter/issues/53253#issuecomment-607197549
对我有用的是:
Key key = UniqueKey(); // 在构建方法之前
HtmlElementView(
key: key,
viewType: 'iframeElement',
);
现在没有rebuilding/rerunning。请注意,我使用的是 iframeElement,而不是 video-container,但这应该有效。请评论。