pub struct Subscription<T> { /* private fields */ }Expand description
A request to listen to external events.
Besides performing async actions on demand with Task, most
applications also need to listen to external events passively.
A Subscription is normally provided to some runtime, like a Task,
and it will generate events as long as the user keeps requesting it.
For instance, you can use a Subscription to listen to a WebSocket
connection, keyboard presses, mouse events, time ticks, etc.
§The Lifetime of a Subscription
Much like a Future or a Stream, a Subscription does not produce any effects
on its own. For a Subscription to run, it must be returned to the iced runtime—normally
in the subscription function of an application or a daemon.
When a Subscription is provided to the runtime for the first time, the runtime will
start running it asynchronously. Running a Subscription consists in building its underlying
Stream and executing it in an async runtime.
Therefore, you can think of a Subscription as a “stream builder”. It simply represents a way
to build a certain Stream together with some way to identify it.
Identification is important because when a specific Subscription stops being returned to the
iced runtime, the runtime will kill its associated Stream. The runtime uses the identity of a
Subscription to keep track of it.
This way, iced allows you to declaratively subscribe to particular streams of data temporarily and whenever necessary.
use iced::time::{self, Duration, Instant};
use iced::Subscription;
struct State {
    timer_enabled: bool,
}
fn subscription(state: &State) -> Subscription<Instant> {
    if state.timer_enabled {
        time::every(Duration::from_secs(1))
    } else {
        Subscription::none()
    }
}Implementations§
Source§impl<T> Subscription<T>
 
impl<T> Subscription<T>
Sourcepub fn none() -> Subscription<T>
 
pub fn none() -> Subscription<T>
Returns an empty Subscription that will not produce any output.
Sourcepub fn run<S>(builder: fn() -> S) -> Subscription<T>
 
pub fn run<S>(builder: fn() -> S) -> Subscription<T>
Returns a Subscription that will call the given function to create and
asynchronously run the given Stream.
§Creating an asynchronous worker with bidirectional communication
You can leverage this helper to create a Subscription that spawns
an asynchronous worker in the background and establish a channel of
communication with an iced application.
You can achieve this by creating an mpsc channel inside the closure
and returning the Sender as a Message for the Application:
use iced::futures::channel::mpsc;
use iced::futures::sink::SinkExt;
use iced::futures::Stream;
use iced::stream;
use iced::Subscription;
pub enum Event {
    Ready(mpsc::Sender<Input>),
    WorkFinished,
    // ...
}
enum Input {
    DoSomeWork,
    // ...
}
fn some_worker() -> impl Stream<Item = Event> {
    stream::channel(100, |mut output| async move {
        // Create channel
        let (sender, mut receiver) = mpsc::channel(100);
        // Send the sender back to the application
        output.send(Event::Ready(sender)).await;
        loop {
            use iced_futures::futures::StreamExt;
            // Read next input sent from `Application`
            let input = receiver.select_next_some().await;
            match input {
                Input::DoSomeWork => {
                    // Do some async work...
                    // Finally, we can optionally produce a message to tell the
                    // `Application` the work is done
                    output.send(Event::WorkFinished).await;
                }
            }
        }
    })
}
fn subscription() -> Subscription<Event> {
    Subscription::run(some_worker)
}Check out the websocket example, which showcases this pattern to maintain a WebSocket
connection open.
Sourcepub fn run_with_id<I, S>(id: I, stream: S) -> Subscription<T>
 
pub fn run_with_id<I, S>(id: I, stream: S) -> Subscription<T>
Returns a Subscription that will create and asynchronously run the
given Stream.
The id will be used to uniquely identify the Subscription.
Sourcepub fn batch(
    subscriptions: impl IntoIterator<Item = Subscription<T>>,
) -> Subscription<T>
 
pub fn batch( subscriptions: impl IntoIterator<Item = Subscription<T>>, ) -> Subscription<T>
Batches all the provided subscriptions and returns the resulting
Subscription.
Sourcepub fn with<A>(self, value: A) -> Subscription<(A, T)>
 
pub fn with<A>(self, value: A) -> Subscription<(A, T)>
Adds a value to the Subscription context.
The value will be part of the identity of a Subscription.
Sourcepub fn map<F, A>(self, f: F) -> Subscription<A>
 
pub fn map<F, A>(self, f: F) -> Subscription<A>
Transforms the Subscription output with the given function.
§Panics
The closure provided must be a non-capturing closure. The method will panic in debug mode otherwise.
Trait Implementations§
Auto Trait Implementations§
impl<T> Freeze for Subscription<T>
impl<T> !RefUnwindSafe for Subscription<T>
impl<T> !Send for Subscription<T>
impl<T> !Sync for Subscription<T>
impl<T> Unpin for Subscription<T>
impl<T> !UnwindSafe for Subscription<T>
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
    T: Real + Zero + Arithmetics + Clone,
    Swp: WhitePoint<T>,
    Dwp: WhitePoint<T>,
    D: AdaptFrom<S, Swp, Dwp, T>,
 
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
    T: Real + Zero + Arithmetics + Clone,
    Swp: WhitePoint<T>,
    Dwp: WhitePoint<T>,
    D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
    M: TransformMatrix<T>,
 
fn adapt_into_using<M>(self, method: M) -> Dwhere
    M: TransformMatrix<T>,
Source§fn adapt_into(self) -> D
 
fn adapt_into(self) -> D
Source§impl<T, Res> Apply<Res> for Twhere
    T: ?Sized,
 
impl<T, Res> Apply<Res> for Twhere
    T: ?Sized,
Source§impl<T, C> ArraysFrom<C> for Twhere
    C: IntoArrays<T>,
 
impl<T, C> ArraysFrom<C> for Twhere
    C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
 
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
    C: FromArrays<T>,
 
impl<T, C> ArraysInto<C> for Twhere
    C: FromArrays<T>,
Source§fn arrays_into(self) -> C
 
fn arrays_into(self) -> C
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<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
    T: FromCam16Unclamped<WpParam, U>,
 
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
    T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
 
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn cam16_into_unclamped(
    self,
    parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
 
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T, C> ComponentsFrom<C> for Twhere
    C: IntoComponents<T>,
 
impl<T, C> ComponentsFrom<C> for Twhere
    C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
 
fn components_from(colors: C) -> T
Source§impl<T> Downcast for Twhere
    T: Any,
 
impl<T> Downcast for Twhere
    T: Any,
Source§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.Source§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.Source§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.Source§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.Source§impl<T> FromAngle<T> for T
 
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
 
fn from_angle(angle: T) -> T
angle.Source§impl<T, U> FromStimulus<U> for Twhere
    U: IntoStimulus<T>,
 
impl<T, U> FromStimulus<U> for Twhere
    U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
 
fn from_stimulus(other: U) -> T
other into Self, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> Instrument for T
 
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
 
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
 
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T, U> IntoAngle<U> for Twhere
    U: FromAngle<T>,
 
impl<T, U> IntoAngle<U> for Twhere
    U: FromAngle<T>,
Source§fn into_angle(self) -> U
 
fn into_angle(self) -> U
T.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
    T: Cam16FromUnclamped<WpParam, U>,
 
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
    T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
 
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn into_cam16_unclamped(
    self,
    parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
 
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
    U: FromColor<T>,
 
impl<T, U> IntoColor<U> for Twhere
    U: FromColor<T>,
Source§fn into_color(self) -> U
 
fn into_color(self) -> U
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
    U: FromColorUnclamped<T>,
 
impl<T, U> IntoColorUnclamped<U> for Twhere
    U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
 
fn into_color_unclamped(self) -> U
Source§impl<T> IntoStimulus<T> for T
 
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
 
fn into_stimulus(self) -> T
self into T, while performing the appropriate scaling,
rounding and clamping.Source§impl<T, C> TryComponentsInto<C> for Twhere
    C: TryFromComponents<T>,
 
impl<T, C> TryComponentsInto<C> for Twhere
    C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
 
type Error = <C as TryFromComponents<T>>::Error
try_into_colors fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
 
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryIntoColor<U> for Twhere
    U: TryFromColor<T>,
 
impl<T, U> TryIntoColor<U> for Twhere
    U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
 
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds error is returned which contains
the unclamped color. Read more