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> 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
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)§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> InitializeFromFunction<T> for T
 
impl<T> InitializeFromFunction<T> for T
§fn initialize_from_function(f: fn() -> T) -> T
 
fn initialize_from_function(f: fn() -> T) -> T
§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