如何从Rust模块重新导出Tauri命令函数?

bihw5rsg  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(157)

问题

我是拉斯特和陶丽的新手我不知道为什么我不能正确地重新导出函数(pub use)并在tauri::generate_handler中使用它。

编码

src/main.rs

mod util;

fn main() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![util::add])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

src/util/mod.rs

mod operation;

// pub use operation::add; // This line not work as expected
pub use operation::*; // This line no problem

src/util/operation.rs

#[tauri::command]
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}

我不知道为什么pub use operation::add;不工作的预期和原因

failed to resolve: could not find `__cmd__add` in `util`
could not find `__cmd__add` in `util` rustc

tauri::generate_handler!中。我哪里错了?

ifsvaxew

ifsvaxew1#

问题是tauri::command创建了一个名为__cmd__add的新符号,tauri::generate_handler使用该符号而不是(或除了)add本身。当您使用use operation::*时,您可以从operation导入所有内容,包括__cmd__add。但是当你使用use operation::add时,你只能导入add
一个不好的解决方法是use operation::{ add, __cmd__add },但不鼓励这样做,因为__cmd__add是一个私有的实现细节,不打算直接使用。
完整的修复需要更改Tauri,但一个可能的解决方法是将add Package 在一个模块中,以便tauri::generate_handler可以在该模块中找到__cmd__add

  • src/util/operation.rs中:
pub mod add {
    #[tauri::command]
    pub fn add(a: i32, b: i32) -> i32 {
        a + b
    }
}
pub use add::add;
  • src/util/mod.rs中:
mod operation;
pub use operation::add;
  • src/main.rs中:
mod util;

fn main() {
    tauri::Builder::default()
        // Note the double `add` here:
        .invoke_handler(tauri::generate_handler![util::add::add])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

请注意,在调用tauri::generate_handler时,需要显式引用add模块中的add函数,因此需要使用add::add。但是,当你想从Rust代码中调用函数时,你可以直接这样做:let four = util::add (2, 2)可以正常工作。

相关问题