diff --git a/packages/core-macro/src/props/mod.rs b/packages/core-macro/src/props/mod.rs index d7a580705..2e0209452 100644 --- a/packages/core-macro/src/props/mod.rs +++ b/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 } } diff --git a/packages/core/src/events.rs b/packages/core/src/events.rs index 2136af2d4..4cca66de3 100644 --- a/packages/core/src/events.rs +++ b/packages/core/src/events.rs @@ -156,7 +156,16 @@ impl std::fmt::Debug for Event { /// ``` pub struct EventHandler { pub(crate) origin: ScopeId, - pub(super) callback: RefCell>>, + pub(super) callback: Rc>>>, +} + +impl Clone for EventHandler { + fn clone(&self) -> Self { + Self { + origin: self.origin, + callback: self.callback.clone(), + } + } } impl Default for EventHandler { @@ -173,9 +182,9 @@ type ExternalListenerCallback = Box; impl EventHandler { /// Create a new [`EventHandler`] from an [`FnMut`] pub fn new(mut f: impl FnMut(T) + 'static) -> EventHandler { - 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)); + }) as Box))); EventHandler { callback, origin: current_scope_id().expect("to be in a dioxus runtime"),