【实用技能】如何将 Web 视图添加到 Compose Multiplatform 应用程序

server/2025/2/9 0:00:25/

Compose Multiplatform 是一个用于在桌面、网络和移动设备上创建用户界面的框架。它扩展了 Android 的 Jetpack Compose,并允许您使用熟悉的 API 为 iOS 和桌面开发应用。

JxBrowser 是一个商业 Web 视图组件。它基于 Chromium,也可用于 Swing、JavaFX 和 SWT。

JxBrowser 专为具有关键用例、截止日期和对第三方软件和供应商有高标准的公司而设计。该软件附带由产品工程师直接提供的保密技术支持。保证的首次响应时间 (SLA) 为一个工作日。JxBrowser 使用最新的安全补丁使 Chromium 保持最新状态。

点击下载最新版JxBrowser

WebViews现状

Jetpack Compose 没有 Web 视图组件。相反,开发人员使用 Android 的原生WebView。它是旧版 View 系统的一部分——一种早于 Compose 的 UI 技术。

Compose Multiplatform 也没有 Web 视图组件。相反,开发人员必须依赖平台上可用的组件。或者更准确地说,是多个平台:移动设备上有两个平台,桌面上有三个平台。

在移动设备上一切都很好。Compose Multiplatform 应用可以在 Android 上使用 WebView,WKWebView在 iOS 上使用一个组件。但在传统的台式机上,事情就变得复杂了。

桌面平台也提供原生 Web 视图,但 Compose Multiplatform 中不提供。不过,由于 Compose 可以与 Swing 互操作,理论上还可以与 JavaFX 互操作,因此开发人员可以将 Web 视图组件用于这些经典桌面工具包。这是 2024 年 10 月之前的唯一选择。

2024 年 10 月,JxBrowser发不了8.0.0版本,这是 Compose Multiplatform 的第一个适用于所有桌面平台的 Web 视图组件。这三个平台均适用于 Windows、macOS 和 Linux。JxBrowser 可直接与 Compose 配合使用,并且不使用 Swing 互操作层。

在 Compose 中使用 Web 视图

JxBrowser已经为 JavaFX、Swing 和 SWT 开发了 Web 视图。提供了惯用的 Kotlin API,并且易于添加到现有的桌面应用程序中。以下代码片段展示了如何将 Web 视图添加到 Compose Multiplatform 应用程序:

fun main() {// Create and run the Chromium engine.val engine = Engine(RenderingMode.OFF_SCREEN)val browser = engine.newBrowser()singleWindowApplication(title = "Compose Desktop BrowserView",state = WindowState(width = 800.dp, height = 600.dp),) {// Creating a Compose component for rendering web content// loaded in the given Browser instance.BrowserView(browser)DisposableEffect(Unit) {browser.navigation.loadUrl("https://html5test.teamdev.com")onDispose {// Close the engine when the app window leaves the composition.engine.close()}}}
}

Compose 实际运行的浏览器视图

在上面的代码中,我们创建了Engine和 的实例Browser。这些类代表实际的 Chromium 实体:Chromium 主进程和其中一个浏览器。 和 均不Engine参与Browser组合,但只要创建它们,您就会拥有一个功能齐全的浏览器。您还可以根据需要创建任意数量的引擎和浏览器。要了解有关位置和方式的更多信息,请考虑阅读我们关于 JxBrowser 架构的指南。

要将实际的 Web 视图添加到组合中,您需要BrowserView 为想要在应用程序中显示的浏览器调用可组合函数。

Kotlin-JavaScript 桥梁

任何 Web 视图的主要功能都是从 Kotlin 调用 JavaScript 并返回。在 JxBrowser 中,您可以获取 JavaScript 对象并直接从 Kotlin 代码访问其属性和方法:

val shoppingCart = frame.executeJavaScript<JsObject>("window.shoppingCart")
val items: JsArray = shoppingCart.call("getItems")

其中包括 DOM 节点:

val body = frame.executeJavaScript<Element>("document.body")
val bodyClone = body.call("cloneNode")

类似地,您可以将任何 Kotlin 对象注入 JavaScript 并从页面调用它:

class KotlinObject {@JsAccessiblefun sayHelloTo(firstName: String) = "Hello $firstName!"
}// This callback is executed before the page executes its own scripts. 
browser.register(InjectJsCallback { params ->val window = params.frame().executeJavaScript<JsObject>("window")window?.putProperty("kotlin", KotlinObject())InjectJsCallback.Response.proceed()
})

在 Kotlin 和 JavaScript 世界之间的每次调用中,JxBrowser 都会执行自动类型转换。

JxBrowser 的其他功能

JxBrowser 是获取几乎所有可供 Web 开发人员使用(但桌面 Kotlin 中没有)功能的桥梁。

当您需要生成漂亮的 PDF 文件时,Web 视图是一种常见的选择。当您拥有 HTML 和 CSS 格式的 PDF 文件模板时,您可以在 JxBrowser 中加载它并生成 PDF 文件。

与 Android 类似WebView,JxBrowser 允许您截取浏览器的屏幕截图。使用任何 JRE 提供的实用程序,您可以 截取屏幕截图并将其保存为 PNG 图像文件。

在企业环境中,身份验证至关重要。JxBrowser 支持与 Chromium 相同的身份验证协议,并允许您使用 Kerberos、WebAuthn、U2F 和其他身份验证技术。

除此之外,JxBrowser 还提供对网络流量的细粒度控制、高级打印 API、Chrome 扩展程序、专有编解码器支持、代理和许多其他功能。


http://www.ppmy.cn/server/166064.html

相关文章

MySQL系列之身份鉴别(安全)

导览 前言Q&#xff1a;如何保障MySQL数据库身份鉴别的有效性一、有效性检查 1. 用户唯一2. 启用密码验证3. 是否存在空口令用户4. 是否启用口令复杂度校验5. 是否设置口令的有效期6. 是否限制登录失败尝试次数7. 是否设置&#xff08;超过尝试次数&#xff09;锁定的最小时长…

snort的学习记录

一、what is snort&#xff1f;什么是snort? Snort 是一款开源的 网络入侵检测系统&#xff08;NIDS&#xff09; 和 网络入侵防御系统&#xff08;NIPS&#xff09;&#xff0c;能够实时监控网络流量&#xff0c;检测恶意行为&#xff08;如端口扫描、SQL注入、DDoS攻击等&a…

pytorch ReSet18模型

import torch import torch.nn as nn from torchsummary import summary class Residual(nn.Module): def init(self,in_channel,out_channel,use_1conv False,strides1): super(Residual,self).init() self.Relu nn.ReLU() #################conv1和CONV2的 stride必须是相…

深度学习-第五章机器学习基础

前言 5.1 学习算法 5.1.1 任务 5.1.2 性能度量 5.1.3 经验 5.1.4 示例: 线性回归 5.2 容量、过拟合和欠拟合 5.2.1 没有免费午餐定理5.2.2 正则化 5.3 超参数和验证集 5.3.1 验证集的作用5.3.2 交叉验证 5.4 估计、偏差和方差 5.4.1 点估计5.4.2 偏差5.4.4 权衡偏差和方差以…

Docker在安装时遇到的问题(第一部分)

一、在用docker-config-manager安装yum源时出现错误 [rootlocalhost ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 已加载插件&#xff1a;fastestmirror, langpacks adding repo from: https://download.docker.com/linux/ce…

【React】路由处理的常见坑与解决方法,React Router 的动态路由与懒加载问题

在使用 React Router 时,动态路由和懒加载是非常常见的需求,但也可能会遇到一些坑。以下是常见问题以及对应的解决方法。 一、React Router 动态路由常见问题 1. 动态路由匹配问题 动态路由通常通过 :param 定义路径参数,但如果路径参数与静态路由有重叠,可能会导致匹配问…

SpringCloudGateWay和Sentinel结合做黑白名单来源控制

假设我们的分布式项目&#xff0c;admin是8087&#xff0c;gateway是8088&#xff0c;consumer是8086 我们一般的思路是我们的请求必须经过我们的网关8088然后网关转发到我们的分布式项目&#xff0c;那我要是没有处理我们绕过网关直接访问项目8087和8086不也是可以&#xff1…

【Apache Paimon】-- 15 -- 利用 paimon-flink-action 同步 postgresql 表数据

利用 Paimon Schema Evolution 核心特性同步变更的 postgresql 表结构和数据 1、背景信息 在Paimon 诞生以前,若 mysql/pg 等数据源的表结构发生变化时,我们有几种处理方式 (1)人工消息通知,然后手动同步到数据仓库中(2)使用 flink 消费 DDL binlog ,然后自动更新 Hi…