3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Tauri 2.0 でマルチウィンドウが正しく動かない時の対処法〈Windows〉

Posted at

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すらしない不具合なので、調べるのが大変でした。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?