1
0
Эх сурвалжийг харах

make sure reactive context works across threads

Jonathan Kelley 1 жил өмнө
parent
commit
64365cd361

+ 5 - 3
packages/signals/src/rc.rs

@@ -1,9 +1,9 @@
 use dioxus_core::prelude::{
 use dioxus_core::prelude::{
-    current_scope_id, has_context, needs_update_any, provide_context, ScopeId,
+    current_scope_id, has_context, provide_context, schedule_update_any, ScopeId,
 };
 };
 use generational_box::{GenerationalBoxId, SyncStorage};
 use generational_box::{GenerationalBoxId, SyncStorage};
 use rustc_hash::{FxHashMap, FxHashSet};
 use rustc_hash::{FxHashMap, FxHashSet};
-use std::{cell::RefCell, hash::Hash};
+use std::{cell::RefCell, hash::Hash, sync::Arc};
 
 
 use crate::{CopyValue, RcList, Readable, Writable};
 use crate::{CopyValue, RcList, Readable, Writable};
 
 
@@ -36,6 +36,7 @@ impl ReactiveContext {
             scope_subscribers,
             scope_subscribers,
             sender: tx,
             sender: tx,
             self_: None,
             self_: None,
+            update_any: schedule_update_any(),
             receiver: rx,
             receiver: rx,
         };
         };
 
 
@@ -86,7 +87,7 @@ impl ReactiveContext {
     /// If there's a scope associated with this context, then it will be marked as dirty too
     /// If there's a scope associated with this context, then it will be marked as dirty too
     pub fn mark_dirty(&self) {
     pub fn mark_dirty(&self) {
         for scope in self.inner.read().scope_subscribers.iter() {
         for scope in self.inner.read().scope_subscribers.iter() {
-            needs_update_any(*scope);
+            (self.inner.read().update_any)(*scope);
         }
         }
 
 
         // mark the listeners as dirty
         // mark the listeners as dirty
@@ -121,6 +122,7 @@ struct Inner {
     signal_subscribers: FxHashMap<GenerationalBoxId, RcList>,
     signal_subscribers: FxHashMap<GenerationalBoxId, RcList>,
     scope_subscribers: FxHashSet<ScopeId>,
     scope_subscribers: FxHashSet<ScopeId>,
     self_: Option<ReactiveContext>,
     self_: Option<ReactiveContext>,
+    update_any: Arc<dyn Fn(ScopeId) + Send + Sync>,
 
 
     // Futures will call .changed().await
     // Futures will call .changed().await
     sender: flume::Sender<()>,
     sender: flume::Sender<()>,