rust 在Tauri插件中使用Sender作为全局状态

e0uiprwp  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(308)

问题

我正尝试编写一个相对较大规模的Tauri应用程序,并按照Tauri文档的建议将其划分为插件。
唯一的问题是这些插件需要能够互相调用。
由于rust中通过程序发送消息的传统方式是std::sync::mpsc::channel,我想尝试使用它,并在每个插件的初始化过程中通过AppHandle<R: Runtime>::manage函数将插件特定命令集的发送者放入Tauri全局状态中。
此解决方案的问题是manage函数要求stateSend + SyncSenderSend + !Sync

代码示例

初始化功能

尝试将发件人置于全局状态

fn initialize(
    &mut self,
    handle: &tauri::AppHandle<R>,
    config: serde_json::Value,
) -> PluginResult<()> {
    let cfg = Config::from_serde_value(config)?;

    handle.manage(DiscordRichPresence::new_mutex(&cfg.client_id));
    handle.manage(self.sender.clone());

    Ok(())
}

关于“读取时克隆”类型的任何 Package 器类型,有什么想法可能会有所帮助吗?
乐意提供更多的代码样本,如果需要更好地理解

ccrfmcuu

ccrfmcuu1#

固定:
答案是使用tokio::sync::mspc::channel而不是std::sync::mpsc::channel,因为tokioSend + Sync,而std``SenderSend + !Sync
只需将以下内容添加到您的Cargo.toml

[dependencies]
tokio = { version = "1.23.0", features = ["sync"] }

然而,如果你要求它是同步的,std::sync::mpsc::sync_channel * 应该 * 也可以工作,但是,在Tauri的情况下,建议异步,因为Tauri本身是建立在时雄之上的。

相关问题