在 Tauri 插件中使用发送器作为全局状态



Issue

我正在尝试编写一个相对大规模的 Tauri 应用程序,并按照 Tauri 文档的建议将其划分为插件。

唯一的问题是这些插件需要能够相互调用。

由于 rust 中通过程序发送消息的传统方式是std::sync::mpsc::channel,我想尝试使用它,并在每个插件初始化期间通过函数将插件的特定命令集的发送者放在 Tauri 全局状态AppHandle<R: Runtime>::manage

此解决方案的问题是manage函数需要Send + Syncstate并且SenderSend + !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(())
}

关于"读取时克隆"类型的任何包装器类型的任何想法可能会有所帮助?

如果需要更好地理解,很乐意提供更多代码示例

已修复:

答案是使用tokio::sync::mspc::channel而不是std::sync::mpsc::channel,因为tokioSend + Sync的,而不是Send + !SyncstdSender

只需将以下内容添加到您的Cargo.toml

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

但是,如果你要求它是同步的,std::sync::mpsc::sync_channel应该工作,但是,在Tauri的情况下,建议异步,因为Tauri本身是建立在Tokio之上的。 使命令异步很容易。

最新更新