簡體   English   中英

在 Tauri 插件中將發件人用作全局 State

[英]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 需要stateSend + Sync並且SenderSend + !Sync

代碼示例

初始化 Function

嘗試將發件人放入全局 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因為tokioSend + Syncstd SenderSend + !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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM