Tauri之单例+多窗口
单例
tauri::Builder::default()
.setup(|app| {
let mut label = "home";
let args: Vec<String> = std::env::args().collect();
if args.len() > 1 {
label = args.get(1).unwrap();
}
let mut runtime: tokio::runtime::Runtime = tokio::runtime::Runtime::new().expect("Unable to create a runtime");
let s = runtime.block_on(create_window(label, &app.handle()));
Ok(())
})
.plugin(tauri_plugin_single_instance::init(|app, argv, cwd| {
let mut label = "home";
if argv.len() > 1 {
label = argv.get(1).unwrap();
}
let mut runtime = tokio::runtime::Runtime::new().expect("Unable to create a runtime");
let s = runtime.block_on(create_window(label, app));
}))
- 创建窗口的操作要异步,否则可能会卡死
- setup时创建初始化窗口
- tauri_plugin_single_instance处理重复打开操作
多窗口
async fn create_window(label: &str, app: &tauri::AppHandle) {
let config = get_window_config(label);
if let Some(window) = app.get_window(label) {
let _ = window.show();
let _ = window.set_focus();
let _ = window.request_user_attention(Some(UserAttentionType::Informational));
} else {
let window = tauri::window::WindowBuilder::new(
app,
label,
tauri::WindowUrl::App(label.parse().unwrap()),
)
.center()
.title(config["title"].as_str().unwrap())
.inner_size(config["width"].as_f64().unwrap(), config["height"].as_f64().unwrap())
.build()
.unwrap();
window.set_focus();
}
}
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/home" element={<Home />} />
<Route path="/page1" element={<Page1 />} />
</Routes>
</BrowserRouter>
-
通过唯一label区分窗口,动态创建新窗口或恢复旧窗口
-
动态创建窗口的时候,记得清空tauri.config.json里的windows
"tauri": { "windows": [ ] }
-
这里前端部分使用react 18 + react-router-dom 6,注意要使用BrowserRouter