如何阻止 Flutter Web HtmlElementView 重建/重新运行?

Posted

技术标签:

【中文标题】如何阻止 Flutter Web HtmlElementView 重建/重新运行?【英文标题】:How to stop Flutter Web HtmlElementView from rebuilding/rerunning? 【发布时间】:2020-08-05 15:20:56 【问题描述】:

我使用 Agora SDK 在 Flutter 中构建了一个视频通话应用。这仅适用于 ios/android,因此对于 Web 构建,我必须围绕现有的 Agora Web SDK 构建一个包装器。由于 Flutter 在 shadow DOM 中渲染 Web 元素的方式,您无法通过 document.getElementById() 访问元素,这是 Agora SDK 用来注入其视频播放器的方式。为了解决这个问题,我正在渲染一个将 div 和 Agora SDK 脚本捆绑在一起的 IFrame。

一切运行良好,但是当在浏览器窗口内触发任何事件时,例如鼠标输入按钮或单击任何内容,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',
  );

Agora 代码

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

【问题讨论】:

【参考方案1】:

这是 Flutter Web 的活跃问题之一。我想这里提到了一个解决方法:https://github.com/flutter/flutter/issues/53253#issuecomment-607197549

【讨论】:

以上是关于如何阻止 Flutter Web HtmlElementView 重建/重新运行?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何在 webview 中阻止全屏视频?

如何在 Flutter Web 中禁用默认浏览器快捷方式?

http 请求被 Flutter Web 的 Cors 策略阻止

堆栈中 ListView 顶部的 GestureDetector 阻止滚动 - Flutter Web

当未加载/被广告拦截器阻止时,firebase_analytics 使 Flutter Web 应用程序崩溃

Flutter:在浏览器中运行网页版时如何停止显示移动应用