Tauri 1.2.3 文件对话框无法返回选中目录路径问题求助
解决Tauri 1.2.3中目录选择对话框无法返回路径的问题
你的问题核心在于pick_folder是异步回调式API,而你的命令是同步执行的——命令会在对话框弹出后立刻返回Err,完全等不到用户选择完成后的回调结果。要解决这个问题,需要把命令改成异步的,用通道来传递回调中的路径结果。
修正后的代码
use std::path::PathBuf; use tauri::api::dialog::FileDialogBuilder; use tokio::sync::oneshot; #[tauri::command] async fn choose_directory() -> Result<String, String> { // 创建单向通道,用于传递回调中的路径结果 let (sender, receiver) = oneshot::channel(); FileDialogBuilder::new() .pick_folder(move |folder_path| { match folder_path { Some(path) => { // 将选中的路径转换为字符串并发送到通道 let _ = sender.send(path.to_str().map(|s| s.to_string())); }, None => { // 用户取消对话框,发送None let _ = sender.send(None); }, } }); // 等待通道接收结果 match receiver.await { Ok(Some(path_str)) => Ok(path_str), Ok(None) => Err("User canceled dialog".to_string()), Err(_) => Err("Failed to receive dialog result".to_string()), } }
关键改动说明
- 把命令标记为
async:Tauri支持异步命令,这样可以等待异步操作完成后再返回结果。 - 使用
oneshot通道:这是tokio提供的单向通道,用来在异步回调和命令主体之间传递选中的路径。回调函数通过sender发送结果,命令主体通过receiver.await等待结果。 - 处理回调结果:用户选中目录时发送路径字符串,取消时发送
None,最后在await后根据返回值处理成功或失败的情况。
依赖注意
确保你的Cargo.toml中包含tokio依赖(Tauri默认已经引入,但如果没有的话需要添加):
[dependencies] tokio = { version = "1.0", features = ["sync"] }
内容的提问来源于stack exchange,提问作者stargazer
相关产品推荐
相关产品推荐

