跳到主内容

将 Web 内容嵌入到 Flutter Web 应用中

了解如何在 Web 上加载和显示图片。

在某些情况下,Flutter Web 应用需要嵌入非由 Flutter 渲染的 Web 内容。例如,嵌入 google_maps_flutter 视图(使用 Google Maps JavaScript SDK)或 video_player(使用标准的 video 元素)。

Flutter Web 可以在 Widget 的边界内渲染任意 Web 内容,上述示例包所使用的底层组件,所有 Flutter Web 应用均可使用。

HtmlElementView

#

HtmlElementView Flutter 组件在布局中预留出一块空间,用于填充任何 HTML 元素。它有两个构造函数

  • HtmlElementView.fromTagName.
  • HtmlElementViewregisterViewFactory

HtmlElementView.fromTagName

#

HtmlElementView.fromTagName 构造函数通过 tagName 创建 HTML 元素,并提供了一个 onElementCreated 方法,以便在元素注入 DOM 之前对其进行配置。

dart
// Create a `video` tag, and set its `src` and some `style` properties...
HtmlElementView.fromTag('video', onElementCreated: (Object video) {
  video as web.HTMLVideoElement;
  video.src = 'https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4';
  video.style.width = '100%';
  video.style.height = '100%';
  // other customizations to the element...
});

要了解更多关于如何与 DOM API 交互的信息,请查看 package:web 中的 HTMLVideoElement

要了解更多关于被转换为 web.HTMLVideoElement 的视频 Object 的信息,请查看 Dart 的 JS 互操作性文档。

HtmlElementViewregisterViewFactory

#

如果您需要更精细地控制注入的 HTML 代码,可以使用 Flutter 实现 fromTagName 构造函数所使用的底层组件。在这种情况下,需要为您应用中添加的每种类型的 HTML 内容注册您自己的 HTML 元素工厂。

这种方式生成的代码较多,且每种平台视图类型需要分两步实现:

  1. 使用 dart:ui_web 提供的 platformViewRegistry.registerViewFactory 注册 HTML 元素工厂。
  2. 在应用的组件树中通过 HtmlElementView('viewType') 放置具有所需 viewType 的组件。

关于此方法的更多详细信息,请查看 HtmlElementView 组件文档。

package:webview_flutter

#

在 Flutter 应用中嵌入完整的 HTML 页面是一项非常常见的功能,因此 Flutter 团队提供了一个插件来实现此目的。