启动界面

如果网页加载需要一些时间,或者在显示主窗口之前需要在 Rust 中运行初始化程序,那么启动界面可以改善用户的加载体验。

设置

首先,在 distDir 中创建 splashscreen.html,其中包含启动界面的 HTML 代码。然后,像这样更新 tauri.conf.json


"windows": [
  {
    "title": "Tauri App",
    "width": 800,
    "height": 600,
    "resizable": true,
    "fullscreen": false,
+   "visible": false // 默认情况下隐藏主窗口
  },
  // 添加启动界面窗口
+ {
+   "width": 400,
+   "height": 200,
+   "decorations": false,
+   "url": "splashscreen.html",
+   "label": "splashscreen"
+ }
]

现在,您的主窗口将被隐藏,而闪屏窗口将在应用程序启动时显示。接下来,您需要一种方法来关闭闪屏,并在应用程序准备就绪时显示主窗口。具体方法取决于您在关闭闪屏前需要等待什么。

等待网页

如果您正在等待网络代码,则需要创建 close_splashscreen command


use tauri::{Manager, Window};
// 创建命令:
// 该命令必须是异步的,因此不会在主线程上运行。
#[tauri::command]
async fn close_splashscreen(window: Window) {
  // 关闭启动界面
  window.get_window("splashscreen").expect("no window labeled 'splashscreen' found").close().unwrap();
  // 显示主窗口
  window.get_window("main").expect("no window labeled 'main' found").show().unwrap();
}

// 注册命令:
fn main() {
  tauri::Builder::default()
    // 添加这一行
    .invoke_handler(tauri::generate_handler![close_splashscreen])
    .run(tauri::generate_context!())
    .expect("failed to run app");
}


然后,您可以通过两种方式之一将其导入到您的项目中:


// 使用 Tauri API npm 软件包:
import { invoke } from '@tauri-apps/api/tauri'

或者


// 使用 Tauri 全局脚本:
const invoke = window.__TAURI__.invoke

最后,添加一个事件监听器(或者随时调用 invoke()):


document.addEventListener('DOMContentLoaded', () => {
  // 这会等待窗口加载,但您也可以
  // 在任何触发器上运行此函数
  invoke('close_splashscreen')
})

等待Rust

如果您在等待 Rust 代码运行,请将其放在setup函数处理程序中,这样您就可以访问App实例:


use tauri::Manager;

fn main() {
  tauri::Builder::default()
    .setup(|app| {
      let splashscreen_window = app.get_window("splashscreen").unwrap();
      let main_window = app.get_window("main").unwrap();
      // 我们在新任务中执行初始化代码,因此应用程序不会冻结
      tauri::async_runtime::spawn(async move {
        // 在这里初始化您的应用程序,而不是休眠:)
        println!("Initializing...");
        std::thread::sleep(std::time::Duration::from_secs(2));
        println!("Done initializing.");

        // 完成后,关闭启动界面并显示主窗口
        splashscreen_window.close().unwrap();
        main_window.show().unwrap();
      });
      Ok(())
    })
    .run(tauri::generate_context!())
    .expect("failed to run app");
}