[英]Using a Sender as global State in a Tauri Plugin
我正在嘗試編寫一個相對較大的 Tauri 應用程序,並按照 Tauri 文檔的建議將其分成多個插件。
唯一的問題是這些插件需要能夠相互調用。
由於 rust 中跨程序發送消息的傳統方式是std::sync::mpsc::channel
,我想嘗試使用它並通過AppHandle<R: Runtime>::manage
在 Tauri 全局 state 中放置插件特定命令集的發送者AppHandle<R: Runtime>::manage
function 在每個插件的初始化過程中。
此解決方案的問題是manage
function 需要state
為Send + Sync
並且Sender
為Send + !Sync
。
嘗試將發件人放入全局 state
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
而std
Sender
是Send + !Sync
。
只需將以下內容添加到您的Cargo.toml
:
[dependencies]
tokio = { version = "1.23.0", features = ["sync"] }
但是,如果您要求它是同步的, std::sync::mpsc::sync_channel
也應該可以工作,但是,對於 Tauri,建議使用異步,因為 Tauri 本身是建立在 Tokio 之上的。 使命令異步很容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.