Issue
我正在尝试编写一个相对大规模的 Tauri 应用程序,并按照 Tauri 文档的建议将其划分为插件。
唯一的问题是这些插件需要能够相互调用。
由于 rust 中通过程序发送消息的传统方式是std::sync::mpsc::channel
,我想尝试使用它,并在每个插件初始化期间通过函数将插件的特定命令集的发送者放在 Tauri 全局状态AppHandle<R: Runtime>::manage
。
此解决方案的问题是manage
函数需要Send + Sync
state
并且Sender
Send + !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
,因为tokio
是Send + Sync
的,而不是Send + !Sync
std
Sender
。
只需将以下内容添加到您的Cargo.toml
:
[dependencies]
tokio = { version = "1.23.0", features = ["sync"] }
但是,如果你要求它是同步的,std::sync::mpsc::sync_channel
也应该工作,但是,在Tauri的情况下,建议异步,因为Tauri本身是建立在Tokio之上的。 使命令异步很容易。