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

Flutter InAppWebView无法加载:仅显示URL字符串问题求助

问题解决:InAppWebView仅显示URL字符串无法加载网页及URL监听实现

问题根源

你代码中初始化URL的方式错误:使用UriData.fromString处理普通HTTP URL是完全错误的,UriData.fromString是用于解析data URI格式(如data:text/html,<html>...</html>)的工具,用它处理普通网页地址会导致WebUri解析出错误的URL,最终只显示字符串而非加载网页。

修正方案

1. 修复初始URL加载

将initialUrlRequest的URL构造方式改为直接使用WebUri或正确的Uri.parse转换:

initialUrlRequest: URLRequest(
  url: WebUri("https://stackoverflow.com/questions/77757847/uri-cant-be-assigned-to-weburi")
),

或者等价写法:

initialUrlRequest: URLRequest(
  url: WebUri.uri(Uri.parse("https://stackoverflow.com/questions/77757847/uri-cant-be-assigned-to-weburi"))
),

2. 添加URL变化监听

在InAppWebView参数中添加回调监听URL变化,根据需求选择以下方式:

  • 监听页面开始/结束加载的URL:适用于普通页面跳转
  • 监听实时URL变化:适用于SPA单页应用的路由切换

示例代码:

// 定义变量存储当前URL
String? currentUrl;

// 在InAppWebView中添加回调
InAppWebView(
  initialUrlRequest: URLRequest(
    url: WebUri("https://stackoverflow.com/questions/77757847/uri-cant-be-assigned-to-weburi")
  ),
  onWebViewCreated: (controller) {
    inAppWebViewController = controller;
  },
  onProgressChanged: (controller, progress) {
    setState(() {
      _progress = progress / 100;
    });
  },
  // 监听页面开始加载的URL
  onLoadStart: (controller, url) {
    setState(() {
      currentUrl = url?.toString();
    });
  },
  // 监听页面加载完成的URL
  onLoadStop: (controller, url) {
    setState(() {
      currentUrl = url?.toString();
    });
  },
  // 监听实时URL变化(含SPA路由切换)
  onUrlChanged: (controller, url) {
    setState(() {
      currentUrl = url?.toString();
    });
  },
)

完整修正后的代码片段

body: SingleChildScrollView(
  child: Center(
    child: Column(children: [
      // 可添加显示当前URL的文本组件
      if (currentUrl != null) Text("当前URL: $currentUrl"),
      SizedBox(
        height: 200,
        child: InAppWebView(
          initialUrlRequest: URLRequest(
            url: WebUri("https://stackoverflow.com/questions/77757847/uri-cant-be-assigned-to-weburi")
          ),
          onWebViewCreated: (controller) {
            inAppWebViewController = controller;
          },
          onProgressChanged: (controller, progress) {
            setState(() {
              _progress = progress / 100;
            });
          },
          onLoadStart: (controller, url) {
            setState(() {
              currentUrl = url?.toString();
            });
          },
          onLoadStop: (controller, url) {
            setState(() {
              currentUrl = url?.toString();
            });
          },
        ),
      ),
    ]),
  ),
),

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:02:09