如何检测flutter webview中内部html何时发生变化

2024-04-06

我在用着webview_flutter https://pub.dev/packages/webview_flutter要从 Flutter 应用程序上的 URL 查看页面,我需要做的是检测 HTML 代码中何时发生更改,而不更改 URL。因为使用 JS 有一些数据随着时间的推移而变化,我需要检查 HTML 并在它发生变化时从中获取一些数据,而不需要使用任何

 void Function(String)? onPageStarted,
  void Function(String)? onPageFinished,
  void Function(int)? onProgress,

因为页面没有重新加载或者 URL 没有改变,除了 HTML 代码之外,一切都是一样的。 Web 视图如下所示:

WebView(
                            gestureRecognizers: <
                                Factory<OneSequenceGestureRecognizer>>{
                              Factory<VerticalDragGestureRecognizer>(
                                  () => VerticalDragGestureRecognizer()),
                              Factory<HorizontalDragGestureRecognizer>(
                                  () => HorizontalDragGestureRecognizer()),
                              Factory<ScaleGestureRecognizer>(
                                  () => ScaleGestureRecognizer()),
                            },
                            zoomEnabled: true,
                            debuggingEnabled: true,
                            initialUrl: controller.mapURL.value,
                            javascriptMode: JavascriptMode.unrestricted,
                            onWebViewCreated:
                                (WebViewController webViewController) {
                              controller.mapWebViewController =
                                  webViewController;
                            },
                          ),

这是获取 HTML 内容的方法

                              var html = await controller.mapWebViewController!
                                  .evaluateJavascript(
                                      "window.document.getElementsByTagName('html')[0].outerHTML;");
                              print(HTML);


我通过在网页中注入一些我自己的 JavaScript 并让它在页面上发生所需操作时发回一条消息来设法做到这一点。

在我的场景中,我希望在网页上显示成功警报时收到通知。我添加了一个事件监听器DOMSubtreeModified只要 HTML 文档发生更改,就会触发该事件。

首先,我在 Flutter 端创建一个 Javascript 通道。当页面加载完成后,使用runJavascript方法中,我注入了 JavaScript 片段。

现在,当该警报出现在页面上时,侦听器函数会检测到该警报并使用以下命令将消息发送回 Flutter:postMessage method.

class _MyWebViewState extends State<MyWebView> {
  final Completer<WebViewController> _controller =
      Completer<WebViewController>();

  @override
  void initState() {
    if (Platform.isAndroid) {
      WebView.platform = SurfaceAndroidWebView();
    }

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: [
        FutureBuilder<WebViewController>(
          future: _controller.future,
          builder: (context, snapshot) {
            return WebView(
              initialUrl: widget._buildUrl(),
              javascriptMode: JavascriptMode.unrestricted,
              javascriptChannels: _createJavaScriptChannels(context),
              onWebViewCreated: (webViewController) {
                _controller.complete(webViewController);
              },
              onPageFinished: (url) {
                if (snapshot.hasData) {
                  snapshot.data!.runJavascript(js);
                }
              },
            );
          },
        ),
      ],
    );
  }

  Set<JavascriptChannel> _createJavaScriptChannels(BuildContext context) {
    return {
      JavascriptChannel(
        name: 'MobileApp',
        onMessageReceived: (message) {
            if (message.message == 'success') {
              ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text(message.message)),
            );
          }
        },
      ),
    };
  }
}

String js = '''    
document.addEventListener("DOMSubtreeModified", onDetection);

function onDetection() {
  const successAlertExists =
    document.querySelectorAll("div.alert-success").length > 0;
  if (successAlertExists) {
    MobileApp.postMessage("success");
    
    document.removeEventListener("DOMSubtreeModified", onDetection);
  }
}
''';
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检测flutter webview中内部html何时发生变化 的相关文章

随机推荐

  • Response.ContentType application/vnd.ms-excel xls 停止工作

    我对这个问题做了一些相当深入的搜索 但没有运气 在过去的几天里 从 HTML 到 XLS 的输出似乎已停止在我支持的许多旧版 阅读 经典 ASP 系统上运行 我已经能够在多个服务器 从 Office 2010 到 Office 2016 的
  • 将 contains_eager 与过滤器一起使用,但不过滤掉没有匹配子代的父代[重复]

    这个问题在这里已经有答案了 阅读 SQLAlchemy 文档 http docs sqlalchemy org en latest orm loading relationships html using contains eager to
  • SQL“float”数据类型在作为 XML 输出时会导致不需要的浮点结果

    您可以简单地尝试 table1 有一个类型为 float 的column1 代替 SELECT column1 from Table1 给出如表中所示的值 假设返回 15 1 但是 如果你尝试 Select column1 from Tab
  • GridSearchCV 历史最佳模型 CV

    我正在尝试将 GridSearchCV 与 KerasRegressor 一起使用进行超参数搜索 Keras model fit 函数本身允许使用历史对象查看 loss 和 val loss 变量 使用 GridSearchCV 时是否可以
  • Python:有什么方法可以声明常量参数吗?

    我有一个方法 def foo bar 有没有办法标记bar作为常数 例如 价值在bar不能改变 或 所指向的对象bar不能变 如果 bar 是不可变对象 则 bar 在函数执行期间不会改变 您还可以创建自己的常量对象 食谱在这里 http
  • 设置 元素的背景颜色(高度未设置为 100%)适用于整个视口

    我发现为整个设置背景颜色元素 高度未设置为 100 导致整个视口设置为该颜色 这个html 1 br 2 br 3
  • C++ 构建系统 - 使用什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑用 C 启动一个新项目 最初是在我自己的时间 并且我正在研究可用的构建系统 答案似乎是 很多
  • 在 Java 中开发具有插件支持的应用程序

    我一直在研究如何开发一个可以加载插件的应用程序 到目前为止 我已经看到这可以通过定义一个接口来完成 并让插件实现它 然而 我当前的问题是如何加载打包在 Jars 中的插件 有没有 最好 的方法来做到这一点 我当前想到的逻辑是获取每个插件并在
  • Solr - 从数据库导入日期时间字段 -> 2 小时差异

    我正在 Solr 中导入日期时间列 SQLServer 并且 solr 中的值始终比数据库中早 2 小时 并且具有完整导入和增量导入 我已经用正确的时间配置了jvm 在日志中它显示了正确的时间 我想我必须在 data config xml
  • 使用acts_as_taggable_on 搜索表单 (Rails 3)

    我有一个搜索框来搜索产品 每个产品都有一个标题并标有多个标签 我希望能够按标题或标签搜索产品 换句话说 如果我有一个名为 绿茶 的产品和另一个标记为 绿色 红色 蓝色 的产品 并且我在搜索框中输入 绿色 我希望这两种产品都出现在搜索结果中
  • 将具有不同格式的文本文件读取到 MATLAB

    我有一个文本文件 但不幸的是它的格式很差 但是我想将文本文件的内容读入矩阵 但我不知道该怎么做 当尝试使用fscanf textscan textread其余的它只是将所有内容复制到一个单元格中 但我不希望那样 内容如下 所以我只想读取小数
  • Rake:记录任何正在执行的任务

    如何在不更改任务源的情况下为每个 rake 任务创建数据库日志记录 我需要存储日期时间 任务名称 参数 有某种观察者等吗 您可以覆盖Rake Task invoke中的方法application rb application rb modu
  • 使用错误:未找到行魔术函数“%sql”

    reload ext sql sql sqlite 第二行无法编译 报告显示 UsageError Line magic function sql未找到 用Python3 8 jupyter笔记本 我使用 conda 安装 ipython
  • 测量库调用和回调之间的时间

    你好 在 iPhone 应用程序中 我使用一个库 C 它在计算完成时异步进行回调 现在我想测量在进行回调之前所花费的时间 包括调用库的方法 是否有可能使用 Apple 的 Instruments 应用程序来做到这一点 最佳实践是什么 过去
  • C++ 跨文件引用变量

    我有一个项目 需要在另一个 CPP 文件中引用一个 CPP 文件中声明的变量 这可能吗 如果是这样 怎么办 如果您将其声明为全局 顶级 位于任何函数定义之上 并使用 extern 这是可能的放在其他文件中以使编译器知道 Main cpp i
  • Ruby Mongodb 驱动程序 $gt 在日期条件下充当 $gte,为什么?

    我有一个奇怪的情况 gt and gteruby mongodb 驱动程序中的条件 所以这是代码 timeline timeline db find date gt gt s time username in gt followers ar
  • 如何在 Perl 中替换现有文件中的字符串

    我想在名为 1 classification dat 2 classification dat 等的所有文本文件中将 蓝色 一词替换为 红色 我想编辑同一个文件 所以我尝试了以下代码 但它不起作用 我哪里出错了 files glob cla
  • 使用python更改Windows快捷方式.lnk文件的图标

    我想更改a的图标 lnk我创建后的文件 到目前为止 这是我的主要代码 import win32com client shell win32com client Dispatch WScript Shell shortcut shell Cr
  • 如何使用 Python 3.4.2 在 Windows 7 中安装 scipy

    我安装时遇到问题scipy 当我跑步时 python m pip install scipy 我收到以下消息 C Python34 lib site packages pip main py run on 01 14 15 15 56 16
  • 如何检测flutter webview中内部html何时发生变化

    我在用着webview flutter https pub dev packages webview flutter要从 Flutter 应用程序上的 URL 查看页面 我需要做的是检测 HTML 代码中何时发生更改 而不更改 URL 因为