Skip to main content

AnyView

Struct AnyView 

Source
pub struct AnyView<State: 'static> { /* private fields */ }
Expand description

A type-erased View: lets a piece of UI change its concrete view type between frames (e.g. a conditional if cond { text(..) } else { button(..) }) while still fitting the statically-typed rebuild machinery.

Rebuild follows the xilem AnyView pattern: the previous view is downcast to detect whether the concrete type is unchanged. Same type → a typed in-place rebuild; different type → the old widget is torn down and a fresh one built and swapped in (signalling LAYOUT | PAINT). Its Element is a Box<dyn Widget>, which implements Widget through the blanket impl so it satisfies View::Element: Widget.

Erasure is idempotent, and the generic builders (child, tuples such as Column((a, b)), ..) accept any View and erase internally, so app code needs AnyView only for stored views, branches of three or more arms, and genuinely heterogeneous dynamic lists (see any). A two-arm branch is written with either(..), which keeps both arms statically typed and does not erase.

Implementations§

Source§

impl<State: 'static> AnyView<State>

Source

pub fn new<V: View<State>>(view: V) -> Self

Erase view into an AnyView.

Erasure is idempotent: if view is already an AnyView<State>, it is returned unchanged — any(any(v)) and AnyView::new(any_view) do not box twice.

Trait Implementations§

Source§

impl<State: 'static> View<State> for AnyView<State>

Source§

type Element = Box<dyn Widget>

The retained widget this view produces.
Source§

fn build(&self, ctx: &mut BuildCtx<'_>) -> Self::Element

Materialise a fresh widget for this view.
Source§

fn rebuild( &self, prev: &Self, element: &mut Self::Element, ctx: &mut BuildCtx<'_>, ) -> ChangeFlags

Reconcile prev (the previous view of the same type) against the live element, mutating it in place and reporting what changed.
Source§

fn teardown(&self, element: &mut Self::Element, ctx: &mut BuildCtx<'_>)

Tear down element when this view is being removed. Read more
Source§

fn message(&self, _element: &mut Self::Element, _state: &mut State)

Deliver an event message to this view, mutating application state. Read more

Auto Trait Implementations§

§

impl<State> !RefUnwindSafe for AnyView<State>

§

impl<State> !Send for AnyView<State>

§

impl<State> !Sync for AnyView<State>

§

impl<State> !UnwindSafe for AnyView<State>

§

impl<State> Freeze for AnyView<State>
where Box<dyn ErasedView<State>>: Freeze,

§

impl<State> Unpin for AnyView<State>
where Box<dyn ErasedView<State>>: Unpin,

§

impl<State> UnsafeUnpin for AnyView<State>
where Box<dyn ErasedView<State>>: UnsafeUnpin,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> StorageAccess<T> for T

Source§

fn as_borrowed(&self) -> &T

Borrows the value.
Source§

fn into_taken(self) -> T

Takes the value.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<State, V> ViewSeq<State, One> for V
where State: 'static, V: View<State>,

Source§

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Push every element of this sequence, in order, onto out — erasing each with AnyView::new (a no-op for an element already an AnyView).