Merge pull request #1467 from ealmloff/expose-runtime-gaurd
Make RuntimeGuard public
This commit is contained in:
2 files changed
+40
-53
No files matched your search
@@ -32,7 +32,7 @@ pub(crate) mod innerlude {
|
|||||||
pub use crate::nodes::RenderReturn;
|
pub use crate::nodes::RenderReturn;
|
||||||
pub use crate::nodes::*;
|
pub use crate::nodes::*;
|
||||||
pub use crate::properties::*;
|
pub use crate::properties::*;
|
||||||
pub use crate::runtime::{in_runtime, override_runtime, Runtime};
|
pub use crate::runtime::{Runtime, RuntimeGuard};
|
||||||
pub use crate::scheduler::*;
|
pub use crate::scheduler::*;
|
||||||
pub use crate::scope_context::*;
|
pub use crate::scope_context::*;
|
||||||
pub use crate::scopes::*;
|
pub use crate::scopes::*;
|
||||||
@@ -87,11 +87,11 @@ pub use crate::innerlude::{
|
|||||||
pub mod prelude {
|
pub mod prelude {
|
||||||
pub use crate::innerlude::{
|
pub use crate::innerlude::{
|
||||||
consume_context, consume_context_from_scope, current_scope_id, fc_to_builder, has_context,
|
consume_context, consume_context_from_scope, current_scope_id, fc_to_builder, has_context,
|
||||||
in_runtime, override_runtime, provide_context, provide_context_to_scope,
|
provide_context, provide_context_to_scope, provide_root_context, push_future,
|
||||||
provide_root_context, push_future, remove_future, schedule_update_any, spawn,
|
remove_future, schedule_update_any, spawn, spawn_forever, suspend, throw, AnyValue,
|
||||||
spawn_forever, suspend, throw, AnyValue, Component, Element, Event, EventHandler, Fragment,
|
Component, Element, Event, EventHandler, Fragment, IntoAttributeValue, LazyNodes,
|
||||||
IntoAttributeValue, LazyNodes, Properties, Runtime, Scope, ScopeId, ScopeState, Scoped,
|
Properties, Runtime, RuntimeGuard, Scope, ScopeId, ScopeState, Scoped, TaskId, Template,
|
||||||
TaskId, Template, TemplateAttribute, TemplateNode, Throw, VNode, VirtualDom,
|
TemplateAttribute, TemplateNode, Throw, VNode, VirtualDom,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,51 +7,6 @@ thread_local! {
|
|||||||
static RUNTIMES: RefCell<Vec<Rc<Runtime>>> = RefCell::new(vec![]);
|
static RUNTIMES: RefCell<Vec<Rc<Runtime>>> = RefCell::new(vec![]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Run some code within a runtime
|
|
||||||
pub fn in_runtime<R>(runtime: Rc<Runtime>, f: impl FnOnce() -> R) -> R {
|
|
||||||
let _guard = RuntimeGuard::new(runtime);
|
|
||||||
f()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Override the current runtime. This must be used to override the current runtime when importing components from a dynamic library that has it's own runtime.
|
|
||||||
///
|
|
||||||
/// ```rust
|
|
||||||
/// use dioxus::prelude::*;
|
|
||||||
///
|
|
||||||
/// fn main() {
|
|
||||||
/// let virtual_dom = VirtualDom::new(app);
|
|
||||||
/// }
|
|
||||||
///
|
|
||||||
/// fn app(cx: Scope) -> Element {
|
|
||||||
/// render!{ Component { runtime: Runtime::current().unwrap() } }
|
|
||||||
/// }
|
|
||||||
///
|
|
||||||
/// // In a dynamic library
|
|
||||||
/// #[derive(Props)]
|
|
||||||
/// struct ComponentProps {
|
|
||||||
/// runtime: std::rc::Rc<Runtime>,
|
|
||||||
/// }
|
|
||||||
///
|
|
||||||
/// impl PartialEq for ComponentProps {
|
|
||||||
/// fn eq(&self, _other: &Self) -> bool {
|
|
||||||
/// true
|
|
||||||
/// }
|
|
||||||
/// }
|
|
||||||
///
|
|
||||||
/// fn Component(cx: Scope<ComponentProps>) -> Element {
|
|
||||||
/// cx.use_hook(|| override_runtime(cx.props.runtime.clone()));
|
|
||||||
///
|
|
||||||
/// render! { div {} }
|
|
||||||
/// }
|
|
||||||
/// ```
|
|
||||||
pub fn override_runtime(runtime: Rc<Runtime>) {
|
|
||||||
RUNTIMES.with(|stack| {
|
|
||||||
let mut stack = stack.borrow_mut();
|
|
||||||
stack.pop();
|
|
||||||
stack.push(runtime);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Pushes a new scope onto the stack
|
/// Pushes a new scope onto the stack
|
||||||
pub(crate) fn push_runtime(runtime: Rc<Runtime>) {
|
pub(crate) fn push_runtime(runtime: Rc<Runtime>) {
|
||||||
RUNTIMES.with(|stack| stack.borrow_mut().push(runtime));
|
RUNTIMES.with(|stack| stack.borrow_mut().push(runtime));
|
||||||
@@ -143,10 +98,42 @@ impl Runtime {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) struct RuntimeGuard(Rc<Runtime>);
|
/// A gaurd for a new runtime. This must be used to override the current runtime when importing components from a dynamic library that has it's own runtime.
|
||||||
|
///
|
||||||
|
/// ```rust
|
||||||
|
/// use dioxus::prelude::*;
|
||||||
|
///
|
||||||
|
/// fn main() {
|
||||||
|
/// let virtual_dom = VirtualDom::new(app);
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// fn app(cx: Scope) -> Element {
|
||||||
|
/// render!{ Component { runtime: Runtime::current().unwrap() } }
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// // In a dynamic library
|
||||||
|
/// #[derive(Props)]
|
||||||
|
/// struct ComponentProps {
|
||||||
|
/// runtime: std::rc::Rc<Runtime>,
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl PartialEq for ComponentProps {
|
||||||
|
/// fn eq(&self, _other: &Self) -> bool {
|
||||||
|
/// true
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// fn Component(cx: Scope<ComponentProps>) -> Element {
|
||||||
|
/// cx.use_hook(|| RuntimeGuard::new(cx.props.runtime.clone()));
|
||||||
|
///
|
||||||
|
/// render! { div {} }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
pub struct RuntimeGuard(Rc<Runtime>);
|
||||||
|
|
||||||
impl RuntimeGuard {
|
impl RuntimeGuard {
|
||||||
pub(crate) fn new(runtime: Rc<Runtime>) -> Self {
|
/// Create a new runtime guard that sets the current Dioxus runtime. The runtime will be reset when the guard is dropped
|
||||||
|
pub fn new(runtime: Rc<Runtime>) -> Self {
|
||||||
push_runtime(runtime.clone());
|
push_runtime(runtime.clone());
|
||||||
Self(runtime)
|
Self(runtime)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user