问题
我正尝试编写一个相对较大规模的Tauri应用程序,并按照Tauri文档的建议将其划分为插件。
唯一的问题是这些插件需要能够互相调用。
由于rust中通过程序发送消息的传统方式是std::sync::mpsc::channel
,我想尝试使用它,并在每个插件的初始化过程中通过AppHandle<R: Runtime>::manage
函数将插件特定命令集的发送者放入Tauri全局状态中。
此解决方案的问题是manage
函数要求state
为Send + Sync
,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(())
}
关于“读取时克隆”类型的任何 Package 器类型,有什么想法可能会有所帮助吗?
乐意提供更多的代码样本,如果需要更好地理解
1条答案
按热度按时间ccrfmcuu1#
固定:
答案是使用
tokio::sync::mspc::channel
而不是std::sync::mpsc::channel
,因为tokio
是Send + Sync
,而std``Sender
是Send + !Sync
。只需将以下内容添加到您的
Cargo.toml
:然而,如果你要求它是同步的,
std::sync::mpsc::sync_channel
* 应该 * 也可以工作,但是,在Tauri的情况下,建议异步,因为Tauri本身是建立在时雄之上的。