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§
source§impl<T> Resource<T>
impl<T> Resource<T>
sourcepub 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:?}"
}
}
sourcepub 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:?}"
}
}
sourcepub 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:?}"
}
}
sourcepub 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:?}"
}
}
sourcepub 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:?}"
}
}
sourcepub 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
sourcepub 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"
}
}
}
sourcepub 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!"
},
}
}
sourcepub 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..." },
}
}
sourcepub 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§
source§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
source§impl<T> IntoAttributeValue for Resource<T>where
T: Clone + IntoAttributeValue,
impl<T> IntoAttributeValue for Resource<T>where
T: Clone + IntoAttributeValue,
source§fn into_value(self) -> AttributeValue
fn into_value(self) -> AttributeValue
source§impl<T> IntoDynNode for Resource<T>where
T: Clone + IntoDynNode,
impl<T> IntoDynNode for Resource<T>where
T: Clone + IntoDynNode,
source§fn into_dyn_node(self) -> DynamicNode
fn into_dyn_node(self) -> DynamicNode
source§impl<T> Readable for Resource<T>
impl<T> Readable for Resource<T>
source§type Storage = UnsyncStorage
type Storage = UnsyncStorage
source§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>
source§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>
source§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>
source§fn read(&self) -> <Self::Storage as AnyStorage>::Ref<'_, Self::Target>
fn read(&self) -> <Self::Storage as AnyStorage>::Ref<'_, Self::Target>
source§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>
source§fn read_unchecked(
&self,
) -> <Self::Storage as AnyStorage>::Ref<'static, Self::Target>
fn read_unchecked( &self, ) -> <Self::Storage as AnyStorage>::Ref<'static, Self::Target>
source§fn peek(&self) -> <Self::Storage as AnyStorage>::Ref<'_, Self::Target>
fn peek(&self) -> <Self::Storage as AnyStorage>::Ref<'_, Self::Target>
source§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>
source§fn peek_unchecked(
&self,
) -> <Self::Storage as AnyStorage>::Ref<'static, Self::Target>
fn peek_unchecked( &self, ) -> <Self::Storage as AnyStorage>::Ref<'static, Self::Target>
source§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
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)