窗口创建
在 Tauri 项目中,实现多窗口管理是一个比较常见的需求,比如我们需要在主窗口中打开一个新的窗口,或者在新窗口中打开一个新的窗口等等。本文将介绍如何在 Tauri 项目中实现多窗口管理,
分别使用 Rust 和 JavaScript 两种方式实现
1.Tauri 配置文件实现
如果是使用 Tauri 官方脚手架创建的项目, 可以直接在 tauri.cong.json
文件中配置 windows
来创建一个新的窗口
url
配置的地址则是前端项目的 Router 地址, 这里以 Sveltekit 为例, 在 src/routes
目录下创建一个 settings.svelte
文件, 并在 src/app.svelte
中配置路由
WindowConfig
配置项可以看这里
label
: 窗口的唯一标识符, 可以通过该标识符获取窗口实例
url
:支持两种类型 WindowURL
- 外部URL
- 应用程序 URL 的路径部分。例如,要加载
tauri://localhost/settings
,只需设置 url
为 /settings
即可
visible
配置的值如果为 true,则应用启动时会自动打开多窗口,反之设置为false则默认隐藏,关于 windows 下更多的配置属性看这里
2.运行时通过Rust创建
如果需要在运行时动态创建窗口, 可以通过 Rust 代码来实现, 配置参数与 tauri.conf.json
中 windows
配置项一致
在 Rust
main.rs 中添加如下代码
3. Tauri command
在 Tauri 中, 通过 tauri::command
定义一个创建窗口的命令,并注册到 Tauri 中, 在前端项目中通过 tauri.invoke
来调用该命令
前端通过 invoke
调用该命令
4.使用JSAPI创建
需要首先配置 tauri.conf.json
文件, 添加 allowlist
配置项, 开启创建窗口的权限
否则创建窗口时会报错:
window > create' not in the allowlist (https://tauri.app/docs/api/config#tauri.allowlist)
然后使用 WebviewWindow
类来创建窗口
通过 WebviewWindow
API 关闭窗口
设置窗口默认展示行为
再通过 tauri.conf.json
配置或者 Rust
代码创建窗口时, 可以通过 visible
属性来设置窗口的默认展示行为, 默认情况下,当是同窗口顶部操作栏手动关闭一个窗口时,窗口会被销毁。这就导致了我们通过前端代码打开的设置窗口,如果手动关闭后,窗口被销毁,再次打开时就无法打开了。
为了能够在关闭设置窗口后可以继续打开,有两种方式可以实现,Tauri 提供了一种机制,可以在窗口关闭事件触发时将其隐藏,而不是销毁窗口。
使用 WebviewWindow
API 创建的窗口在关闭后还可以重新创建
再次通过前端代码打开设置窗口,然后点击设置窗口的关闭按钮,设置窗口消失,再次打开正常。
如果你在 windows 配置了 decorations
值为
false
(隐藏顶部栏和边框),并且使用了自定义的顶部栏,则可以通过自定义关闭按钮来设置关闭行为为隐藏
appWindow.hide()
是隐藏当前窗口(即调用该方法所在的窗口)。如果你有多个窗口,并且想要在特定窗口上执行操作(例如隐藏某个特定窗口)。
打开窗口
对于使用 tauri.cong.json
或者 Rust
代码在初始化时创建并设置默认隐藏的窗口, 可以通过 invoke
和 event
事件的方式来打开打开窗口
1.使用 invoke 打开窗口
首先定义 invoke
前端调用 invoke
打开窗口
2.Event 事件触发
rust
中定义事件监听
前端调用 emit
触发事件
获取窗口实例
1.使用 JS API 获取窗口实例
2.使用Rust 获取
当要获取的窗口存在时, 前端使用 invoke
调用 get_window
会获取到窗口实例, 并调用 close 方法关闭窗口
窗口间通信
在 Tauri 中窗口之间通信有几种场景和方式,一种是主进程与窗口之间的相互通信,另一种是窗口与窗口之间的相互通信.
不推荐直接进行窗口与窗口之间的通信,而是通过主进程设置事件监听的方式进行窗口之间的事件转发,通过主进程全局管理所有窗口和事件,更符合 Tauri 的设计理念和安全模型,确保各窗口之间的通信是有序和受控的。
上图中描述了Event 的处理方式,Tauri 应用中有三个独立的窗口 主窗口 Main
、设置窗口 Settings
以及 About
窗口,需求是要在这三个窗口之间进行 Event 通信,例如从 Main
发送事件到 Settings
或者从 Settings
发送事件到 About
。
在 Rust
主进程设置 Event 事件转发:
event_listener_to_main
方法定义了向 main
窗口发送事件的方式,监听了全局 Event EVENT_SEND_TO_MAIN
, 当收到消息时,会获取 mian
窗口, main
窗口存在时,向其广播 EVENT_TO_MAIN
事件,这样避免了向其他两个窗口广播事件。
同理, Settings
窗口与 About
窗口也需要设置事件监听转发
Main
和 Settings
等窗口需要监听当前窗口的事件, 例如 Main 窗口需要监听 EVENT_SEND_TO_MAIN
, Settings
需要监听 EVENT_SEND_TO_SETTINGS
。
前端进行事件调用时,可以在 payload
参数里额外自定义一个 Event 类型,用于对事件进行细分处理,Event 参数如下
调用 event
方法
参考资料