diff --git a/src-tauri/src/core/clash.rs b/src-tauri/src/core/clash.rs
index a1f69adec02770f82756d3364ea3fc3143e53205..465b18709f9f777d852433a4786a35b563cf957b 100644
--- a/src-tauri/src/core/clash.rs
+++ b/src-tauri/src/core/clash.rs
@@ -192,31 +192,32 @@ impl Clash {
     verge: &mut Verge,
     profiles: &mut Profiles,
   ) -> Result<()> {
-    for (key, value) in patch.iter() {
-      let value = value.clone();
-      let key_str = key.as_str().clone().unwrap_or("");
+    let mix_port_key = Value::from("mixed-port");
+    let mut port = None;
 
-      // restart the clash
-      if key_str == "mixed-port" {
-        self.restart_sidecar(profiles)?;
+    for (key, value) in patch.into_iter() {
+      let value = value.clone();
 
-        let port = if value.is_number() {
-          match value.as_i64().clone() {
-            Some(num) => Some(format!("{num}")),
-            None => None,
-          }
+      // check whether the mix_port is changed
+      if key == mix_port_key {
+        if value.is_number() {
+          port = value.as_i64().as_ref().map(|n| n.to_string());
         } else {
-          match value.as_str().clone() {
-            Some(num) => Some(num.into()),
-            None => None,
-          }
-        };
-        verge.init_sysproxy(port);
+          port = value.as_str().as_ref().map(|s| s.to_string());
+        }
       }
 
       self.config.insert(key.clone(), value);
     }
-    self.save_config()
+
+    self.save_config()?;
+
+    if let Some(port) = port {
+      self.restart_sidecar(profiles)?;
+      verge.init_sysproxy(Some(port));
+    }
+
+    Ok(())
   }
 
   /// enable tun mode