Browse Source

make EventHandler clone

Evan Almloff 1 year ago
parent
commit
58c01253e5
2 changed files with 13 additions and 4 deletions
  1. 1 1
      packages/core-macro/src/props/mod.rs
  2. 12 3
      packages/core/src/events.rs

+ 1 - 1
packages/core-macro/src/props/mod.rs

@@ -661,7 +661,7 @@ Finally, call `.build()` to create the instance of `{name}`.
                     fn builder() -> Self::Builder {
                         #name::builder()
                     }
-                    unsafe fn memoize(&self, other: &Self) -> bool {
+                    fn memoize(&self, other: &Self) -> bool {
                         #can_memoize
                     }
                 }

+ 12 - 3
packages/core/src/events.rs

@@ -156,7 +156,16 @@ impl<T: std::fmt::Debug> std::fmt::Debug for Event<T> {
 /// ```
 pub struct EventHandler<T = ()> {
     pub(crate) origin: ScopeId,
-    pub(super) callback: RefCell<Option<ExternalListenerCallback<T>>>,
+    pub(super) callback: Rc<RefCell<Option<ExternalListenerCallback<T>>>>,
+}
+
+impl<T> Clone for EventHandler<T> {
+    fn clone(&self) -> Self {
+        Self {
+            origin: self.origin,
+            callback: self.callback.clone(),
+        }
+    }
 }
 
 impl<T> Default for EventHandler<T> {
@@ -173,9 +182,9 @@ type ExternalListenerCallback<T> = Box<dyn FnMut(T)>;
 impl<T> EventHandler<T> {
     /// Create a new [`EventHandler`] from an [`FnMut`]
     pub fn new(mut f: impl FnMut(T) + 'static) -> EventHandler<T> {
-        let callback = RefCell::new(Some(Box::new(move |event: T| {
+        let callback = Rc::new(RefCell::new(Some(Box::new(move |event: T| {
             f(event);
-        }) as Box<dyn FnMut(T)>));
+        }) as Box<dyn FnMut(T)>)));
         EventHandler {
             callback,
             origin: current_scope_id().expect("to be in a dioxus runtime"),