You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter Chrome应用中用webview_flutter_web显示自定义HTML而非外部URI

解决方案

要在webview_flutter_web中加载动态构建的HTML,你不需要使用loadRequest(该方法用于加载URI地址),而是直接调用PlatformWebViewController提供的loadHtmlString方法,传入你动态生成的HTML字符串即可。

核心修改示例

先替换控制器初始化部分的代码,把原来的loadRequest换成loadHtmlString:

final PlatformWebViewController _controller = PlatformWebViewController(
  const PlatformWebViewControllerCreationParams(),
)..loadHtmlString(
  // 这里是你动态构建的HTML内容
  '<html><body><h1 style="color:blue;">Hello World</h1><p>这是代码生成的动态HTML</p></body></html>',
);

完整修改代码(含动态切换HTML功能)

如果需要支持触发加载不同的动态HTML内容,可以调整菜单逻辑,比如添加选项切换不同的动态页面:

final PlatformWebViewController _controller = PlatformWebViewController(
  const PlatformWebViewControllerCreationParams(),
)..loadHtmlString(
  '<html><body><h1>初始动态页面</h1></body></html>',
);

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: const Text('Flutter WebView 动态HTML示例'),
      actions: <Widget>[
        _SampleMenu(_controller),
      ],
    ),
    body: PlatformWebViewWidget(
      PlatformWebViewWidgetCreationParams(controller: _controller),
    ).build(context),
  );
}

enum _MenuOptions {
  loadHelloWorld,
  loadDynamicDataHtml,
}

class _SampleMenu extends StatelessWidget {
  const _SampleMenu(this.controller);

  final PlatformWebViewController controller;

  @override
  Widget build(BuildContext context) {
    return PopupMenuButton<_MenuOptions>(
      onSelected: (_MenuOptions value) {
        switch (value) {
          case _MenuOptions.loadHelloWorld:
            _loadHelloWorldHtml(controller);
            break;
          case _MenuOptions.loadDynamicDataHtml:
            _loadDynamicDataHtml(controller);
            break;
        }
      },
      itemBuilder: (BuildContext context) => <PopupMenuItem<_MenuOptions>>[
        const PopupMenuItem<_MenuOptions>(
          value: _MenuOptions.loadHelloWorld,
          child: Text('加载Hello World'),
        ),
        const PopupMenuItem<_MenuOptions>(
          value: _MenuOptions.loadDynamicDataHtml,
          child: Text('加载带动态数据的HTML'),
        ),
      ],
    );
  }

  Future<void> _loadHelloWorldHtml(PlatformWebViewController controller) async {
    final String htmlContent = '''
    <html>
      <head>
        <style>
          body { text-align: center; font-family: sans-serif; }
          h1 { color: #2196F3; }
        </style>
      </head>
      <body>
        <h1>Hello World!</h1>
        <p>这是完全通过代码生成的HTML页面</p>
      </body>
    </html>
    ''';
    await controller.loadHtmlString(htmlContent);
  }

  Future<void> _loadDynamicDataHtml(PlatformWebViewController controller) async {
    // 模拟从业务逻辑中获取的动态数据
    String userNickname = 'Flutter开发者';
    String currentTime = DateTime.now().toString().split('.')[0];
    
    // 拼接动态HTML字符串
    final String htmlContent = '''
    <html>
      <body>
        <h3>动态数据展示</h3>
        <p>用户昵称:$userNickname</p>
        <p>当前时间:$currentTime</p>
      </body>
    </html>
    ''';
    await controller.loadHtmlString(htmlContent);
  }
}

关键说明

  • loadHtmlString直接接收HTML字符串参数,无需依赖外部URI,完全适配动态构建的场景。
  • 你可以通过字符串拼接、模板语法(复杂场景下)生成任意结构的HTML,包括插入动态变量、自定义样式、脚本等。
  • 如果需要加载包含外部资源(如远程CSS、JS)的动态HTML,直接在HTML字符串中使用完整URL引用即可。

内容的提问来源于stack exchange,提问作者SqueezeOJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:18:35