flutter嵌入web,获取网站的标题和图标

 Stack(
      children: <Widget>[
        _reload
            ? Container()
            : InAppWebViewEIP1193(
                chainId: _chainRpcId,
                rpcUrl: rpcUrl,
                walletAddress: walletAddress,
                onWebViewCreated: (controller) {
                  _webViewController = controller;
                  // 在这里可以安全地使用 _webViewController
                },
                onLoadStop: (controller, url) async {
                  title = await controller.getTitle();
                  String? iconUrl = await _webViewController.evaluateJavascript(
                    source: """
                  (function() {
                    var links = document.getElementsByTagName('link');
                    for (var i = 0; i < links.length; i++) {
                      if (links[i].getAttribute('rel') == 'icon' || links[i].getAttribute('rel') == 'shortcut icon') {
                        return links[i].getAttribute('href');
                      }
                    }
                    return null;
                  })();
                  """,
                  );
                  if (iconUrl != null && iconUrl.startsWith('/')) {
                    iconUrl = iconUrl.substring(1); // 去掉第一个字符
                  }

                  icon = '$url$iconUrl';

                  _webViewController = controller;
                  addRecentCollect();
                  setState(() {});
                },
                onConsoleMessage: (controller, consoleMessage) {
                  print('onConsoleMessage: $consoleMessage');
                },
                onReceivedServerTrustAuthRequest:
                    (controller, challenge) async {
                  return ServerTrustAuthResponse(
                      action: ServerTrustAuthResponseAction.PROCEED);
                },
                onLoadStart: (InAppWebViewController controller, Uri? url) {
                  print("进入URL: $url");
                },
                signCallback: (params, eip1193, controller) {
                 
                },
                onProgressChanged:
                    (InAppWebViewController controller, int progress) {
                  if (progress == 100) {
                    controllerThis = controller;
                  }
                  progressValue = double.parse(progress.toString());

                  if (mounted) {
                    setState(() {});
                  }
                },
                initialUrlRequest: URLRequest(url: Uri.parse(url!)),
              ),
        Offstage(
            child: SizedBox(
              height: adaptation(4),
              child: LinearProgressIndicator(
                  value: progressValue / 100,
                  backgroundColor: Colors.transparent,
                  valueColor: AlwaysStoppedAnimation(Colours.themeColor)),
            ),
            offstage: progressValue == 100),
        // Offstage(child: Center(child: buildLoadingShadeCustom()), offstage: progressValue == 100),
      ],
    );
  }

以上是实现的代码,其实主要就是:

onLoadStop: (controller, url) async {
  // 当WebView加载停止时(页面加载完成时)调用此回调函数
  // `controller` 是 InAppWebViewController 的实例,用于操作 WebView
  // `url` 是当前页面的 URL

  title = await controller.getTitle();
  // 获取当前 WebView 页面的标题,并将其赋值给变量 `title`

  String? iconUrl = await _webViewController.evaluateJavascript(
    source: """
    (function() {
      var links = document.getElementsByTagName('link');
      for (var i = 0; i < links.length; i++) {
        if (links[i].getAttribute('rel') == 'icon' || links[i].getAttribute('rel') == 'shortcut icon') {
          return links[i].getAttribute('href');
        }
      }
      return null;
    })();
    """,
  );
  // 使用 JavaScript 代码在 WebView 中执行操作,寻找页面中的图标链接
  // 通过遍历 `<link>` 标签,查找 `rel` 属性为 `icon` 或 `shortcut icon` 的标签
  // 返回找到的图标链接的 `href` 属性的值,如果没有找到则返回 null

  if (iconUrl != null && iconUrl.startsWith('/')) {
    iconUrl = iconUrl.substring(1); // 去掉第一个字符
    // 如果找到的图标 URL 是以 '/' 开头的,相对路径的 URL,将其第一个字符去掉
  }

  icon = '$url$iconUrl';
  // 将最终的图标 URL 组合成完整的 URL(基于当前页面的 URL),赋值给 `icon` 变量

  _webViewController = controller;
  // 更新 `_webViewController` 为当前的 `controller` 实例,以便后续使用

  addRecentCollect();
  // 调用 `addRecentCollect()` 函数,可能用于将当前页面加入最近收藏列表

  setState(() {});
  // 调用 `setState` 以通知 Flutter 框架,状态已更新,需要重建 UI
},

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值