pub struct Resource<T>where
T: 'static,{ /* private fields */ }
Expand description
A handle to a reactive future spawned with use_resource
that can be used to modify or read the result of the future.
§Example
Reading the result of a resource:
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
// This will run every time the revision signal changes because we read the count inside the future
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
// Since our resource may not be ready yet, the value is an Option. Our request may also fail, so the get function returns a Result
// The complete type we need to match is `Option<Result<String, reqwest::Error>>`
// We can use `read_unchecked` to keep our matching code in one statement while avoiding a temporary variable error (this is still completely safe because dioxus checks the borrows at runtime)
match &*resource.read_unchecked() {
Some(Ok(value)) => rsx! { "{value:?}" },
Some(Err(err)) => rsx! { "Error: {err}" },
None => rsx! { "Loading..." },
}
}
Implementations§
§impl<T> Resource<T>
impl<T> Resource<T>
pub fn restart(&mut self)
pub fn restart(&mut self)
Restart the resource’s future.
This will cancel the current future and start a new one.
§Example
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
// This will run every time the revision signal changes because we read the count inside the future
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
rsx! {
button {
// We can get a signal with the value of the resource with the `value` method
onclick: move |_| resource.restart(),
"Restart resource"
}
"{resource:?}"
}
}
pub fn cancel(&mut self)
pub fn cancel(&mut self)
Forcefully cancel the resource’s future.
§Example
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
rsx! {
button {
// We can cancel the resource before it finishes with the `cancel` method
onclick: move |_| resource.cancel(),
"Cancel resource"
}
"{resource:?}"
}
}
pub fn pause(&mut self)
pub fn pause(&mut self)
Pause the resource’s future.
§Example
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
// This will run every time the revision signal changes because we read the count inside the future
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
rsx! {
button {
// We can pause the future with the `pause` method
onclick: move |_| resource.pause(),
"Pause"
}
button {
// And resume it with the `resume` method
onclick: move |_| resource.resume(),
"Resume"
}
"{resource:?}"
}
}
pub fn resume(&mut self)
pub fn resume(&mut self)
Resume the resource’s future.
§Example
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
// This will run every time the revision signal changes because we read the count inside the future
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
rsx! {
button {
// We can pause the future with the `pause` method
onclick: move |_| resource.pause(),
"Pause"
}
button {
// And resume it with the `resume` method
onclick: move |_| resource.resume(),
"Resume"
}
"{resource:?}"
}
}
pub fn clear(&mut self)
pub fn clear(&mut self)
Clear the resource’s value. This will just reset the value. It will not modify any running tasks.
§Example
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
// This will run every time the revision signal changes because we read the count inside the future
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
rsx! {
button {
// We clear the value without modifying any running tasks with the `clear` method
onclick: move |_| resource.clear(),
"Clear"
}
"{resource:?}"
}
}
pub fn task(&self) -> Task
pub fn task(&self) -> Task
Get a handle to the inner task backing this resource Modify the task through this handle will cause inconsistent state
pub fn finished(&self) -> bool
pub fn finished(&self) -> bool
Is the resource’s future currently finished running?
Reading this does not subscribe to the future’s state
§Example
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
// This will run every time the revision signal changes because we read the count inside the future
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
// We can use the `finished` method to check if the future is finished
if resource.finished() {
rsx! {
"The resource is finished"
}
} else {
rsx! {
"The resource is still running"
}
}
}
pub fn state(&self) -> ReadOnlySignal<UseResourceState>
pub fn state(&self) -> ReadOnlySignal<UseResourceState>
Get the current state of the resource’s future. This method returns a ReadOnlySignal
which can be read to get the current state of the resource or passed to other hooks and components.
§Example
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
// This will run every time the revision signal changes because we read the count inside the future
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
// We can read the current state of the future with the `state` method
match resource.state().cloned() {
UseResourceState::Pending => rsx! {
"The resource is still pending"
},
UseResourceState::Paused => rsx! {
"The resource has been paused"
},
UseResourceState::Stopped => rsx! {
"The resource has been stopped"
},
UseResourceState::Ready => rsx! {
"The resource is ready!"
},
}
}
pub fn value(&self) -> ReadOnlySignal<Option<T>>
pub fn value(&self) -> ReadOnlySignal<Option<T>>
Get the current value of the resource’s future. This method returns a ReadOnlySignal
which can be read to get the current value of the resource or passed to other hooks and components.
§Example
fn App() -> Element {
let mut revision = use_signal(|| "1d03b42");
let mut resource = use_resource(move || async move {
// This will run every time the revision signal changes because we read the count inside the future
reqwest::get(format!("https://github.com/DioxusLabs/awesome-dioxus/blob/{revision}/awesome.json")).await
});
// We can get a signal with the value of the resource with the `value` method
let value = resource.value();
// Since our resource may not be ready yet, the value is an Option. Our request may also fail, so the get function returns a Result
// The complete type we need to match is `Option<Result<String, reqwest::Error>>`
// We can use `read_unchecked` to keep our matching code in one statement while avoiding a temporary variable error (this is still completely safe because dioxus checks the borrows at runtime)
match &*value.read_unchecked() {
Some(Ok(value)) => rsx! { "{value:?}" },
Some(Err(err)) => rsx! { "Error: {err}" },
None => rsx! { "Loading..." },
}
}
pub fn suspend(&self) -> Result<MappedSignal<T>, RenderError>
pub fn suspend(&self) -> Result<MappedSignal<T>, RenderError>
Suspend the resource’s future and only continue rendering when the future is ready
Trait Implementations§
§impl<T> Deref for Resource<T>where
T: Clone,
impl<T> Deref for Resource<T>where
T: Clone,
Allow calling a signal with signal() syntax
Currently only limited to copy types, though could probably specialize for string/arc/rc
§impl<T> From<Resource<T>> for ReadOnlySignal<Option<T>>
impl<T> From<Resource<T>> for ReadOnlySignal<Option<T>>
§fn from(val: Resource<T>) -> ReadOnlySignal<Option<T>>
fn from(val: Resource<T>) -> ReadOnlySignal<Option<T>>
§impl<T> IntoAttributeValue for Resource<T>where
T: Clone + IntoAttributeValue,
impl<T> IntoAttributeValue for Resource<T>where
T: Clone + IntoAttributeValue,
§fn into_value(self) -> AttributeValue
fn into_value(self) -> AttributeValue
§impl<T> IntoDynNode for Resource<T>where
T: Clone + IntoDynNode,
impl<T> IntoDynNode for Resource<T>where
T: Clone + IntoDynNode,
§fn into_dyn_node(self) -> DynamicNode
fn into_dyn_node(self) -> DynamicNode
§impl<T> PartialEq for Resource<T>
impl<T> PartialEq for Resource<T>
§impl<T> Readable for Resource<T>
impl<T> Readable for Resource<T>
§type Storage = UnsyncStorage
type Storage = UnsyncStorage
§fn try_read_unchecked(
&self
) -> Result<<<Resource<T> as Readable>::Storage as AnyStorage>::Ref<'static, <Resource<T> as Readable>::Target>, BorrowError>
fn try_read_unchecked( &self ) -> Result<<<Resource<T> as Readable>::Storage as AnyStorage>::Ref<'static, <Resource<T> as Readable>::Target>, BorrowError>
§fn try_peek_unchecked(
&self
) -> Result<<<Resource<T> as Readable>::Storage as AnyStorage>::Ref<'static, <Resource<T> as Readable>::Target>, BorrowError>
fn try_peek_unchecked( &self ) -> Result<<<Resource<T> as Readable>::Storage as AnyStorage>::Ref<'static, <Resource<T> as Readable>::Target>, BorrowError>
§fn map<O>(
self,
f: impl Fn(&Self::Target) -> &O + 'static
) -> MappedSignal<O, Self::Storage>
fn map<O>( self, f: impl Fn(&Self::Target) -> &O + 'static ) -> MappedSignal<O, Self::Storage>
§fn read(&self) -> <Self::Storage as AnyStorage>::Ref<'_, Self::Target>
fn read(&self) -> <Self::Storage as AnyStorage>::Ref<'_, Self::Target>
§fn try_read(
&self
) -> Result<<Self::Storage as AnyStorage>::Ref<'_, Self::Target>, BorrowError>
fn try_read( &self ) -> Result<<Self::Storage as AnyStorage>::Ref<'_, Self::Target>, BorrowError>
§fn read_unchecked(
&self
) -> <Self::Storage as AnyStorage>::Ref<'static, Self::Target>
fn read_unchecked( &self ) -> <Self::Storage as AnyStorage>::Ref<'static, Self::Target>
§fn peek(&self) -> <Self::Storage as AnyStorage>::Ref<'_, Self::Target>
fn peek(&self) -> <Self::Storage as AnyStorage>::Ref<'_, Self::Target>
§fn try_peek(
&self
) -> Result<<Self::Storage as AnyStorage>::Ref<'_, Self::Target>, BorrowError>
fn try_peek( &self ) -> Result<<Self::Storage as AnyStorage>::Ref<'_, Self::Target>, BorrowError>
§fn peek_unchecked(
&self
) -> <Self::Storage as AnyStorage>::Ref<'static, Self::Target>
fn peek_unchecked( &self ) -> <Self::Storage as AnyStorage>::Ref<'static, Self::Target>
§fn with<O>(&self, f: impl FnOnce(&Self::Target) -> O) -> O
fn with<O>(&self, f: impl FnOnce(&Self::Target) -> O) -> O
impl<T> Copy for Resource<T>
Auto Trait Implementations§
impl<T> Freeze for Resource<T>
impl<T> !RefUnwindSafe for Resource<T>
impl<T> !Send for Resource<T>
impl<T> !Sync for Resource<T>
impl<T> Unpin for Resource<T>where
T: Unpin,
impl<T> !UnwindSafe for Resource<T>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more