Tauri 2.0 にはウィンドウを動的に複数作成できるマルチウィンドウの機能があるのですが、Windows環境ではウィンドウ作成時にバグが発生します。
その対処法です。
同期の#[tauri::command]下で動かない
新しいウィンドウでexample.comを表示するプログラムを考えます。
まず、以下のコードは正しいですが、動きません。
作成後、空のウィンドウが表示されますが、その後操作を受け付けなくなります。
#[tauri::command]
fn open_new_window(handle: tauri::AppHandle) {
let window = WebviewWindowBuilder::new(
&handle,
"hoge",
tauri::WebviewUrl::External("https://example.com/")
)
.build().expect("failed to create new window");
window.show().expect("failed to show window");
}
それは、この関数がasyncになっていないからです。
以下のようにasyncにしてやると、正しくウィンドウが生成されます。
#[tauri::command(async)]
async fn open_new_window(handle: tauri::AppHandle) -> Result<(), ()>{
let window = WebviewWindowBuilder::new(
&handle,
"hoge",
tauri::WebviewUrl::External("https://example.com/")
)
.build().expect("failed to create new window");
window.show().expect("failed to show window");
Ok(())
}
非同期関数をcommandに使う場合は、返値をResult型にしなければならないため、そうしています。
なお、このasync下でしかWebviewWindowBuilderが動かないという現象はバグらしいです。
今後修正されるのかもしれません。
Docs.rsに次のように書いてあります。
Known issues
On Windows, this function deadlocks when used in a synchronous command, see the Webview2 issue. You should use async commands when creating windows.
ResultはOkが返りますし、panicすらしない不具合なので、調べるのが大変でした。