Răsfoiți Sursa

make the closure dyn

Ilya Maximov 3 ani în urmă
părinte
comite
6e8fdc1e4d
2 a modificat fișierele cu 11 adăugiri și 9 ștergeri
  1. 3 3
      packages/desktop/src/desktop_context.rs
  2. 8 6
      packages/web/src/util.rs

+ 3 - 3
packages/desktop/src/desktop_context.rs

@@ -200,8 +200,8 @@ pub(super) fn handler(
 }
 
 /// Get a closure that executes any JavaScript in the WebView context.
-pub fn use_eval<S: std::string::ToString>(cx: &ScopeState) -> impl Fn(S) + '_ {
-    let desktop = use_window(&cx);
+pub fn use_eval<S: std::string::ToString>(cx: &ScopeState) -> &dyn Fn(S) {
+    let desktop = use_window(&cx).clone();
 
-    move |script| desktop.eval(script)
+    cx.use_hook(|_| move |script| desktop.eval(script))
 }

+ 8 - 6
packages/web/src/util.rs

@@ -15,10 +15,12 @@ use dioxus_core::*;
 ///
 /// The closure will panic if the provided script is not valid JavaScript code
 /// or if it returns an uncaught error.
-pub fn use_eval<S: std::string::ToString>(_cx: &ScopeState) -> impl Fn(S) {
-    |script| {
-        js_sys::Function::new_no_args(&script.to_string())
-            .call0(&wasm_bindgen::JsValue::NULL)
-            .expect("failed to eval script");
-    }
+pub fn use_eval<S: std::string::ToString>(cx: &ScopeState) -> &dyn Fn(S) {
+    cx.use_hook(|_| {
+        |script: S| {
+            js_sys::Function::new_no_args(&script.to_string())
+                .call0(&wasm_bindgen::JsValue::NULL)
+                .expect("failed to eval script");
+        }
+    })
 }