Skip to main content

SemanticsRequester

Struct SemanticsRequester 

Source
pub struct SemanticsRequester { /* private fields */ }
Expand description

A handle an app holds to say that what its semantics recorder would report has changed.

A .semantics() recorder is re-run on every collection, so it always reports the app’s current answer. It cannot say when that answer changed, and a tree is only re-collected when some node marks its semantics dirty — which until now meant attaching a node, rebuilding its modifier chain, or a layout pass. A screen that is one Canvas does none of those: its layout never changes and its frame loop draws rather than recomposes, so the tree it published at boot was the tree a screen reader kept reading.

This is the way out, and it is Jetpack Compose’s: SemanticsModifierNode.invalidateSemantics(). Remember one requester, hang it on the same node as the recorder, and call invalidate when the content changes — no recomposition, no layout pass.

let semantics = remember(SemanticsRequester::new).with(Clone::clone);
// ... in the composition:
Modifier::empty()
    .semantics_requester(&semantics)
    .semantics(move |config| { /* reads live app state */ })
// ... and in the frame loop, guarded by a revision so an unchanged tree is
// not republished every frame:
if revision != last_revision {
    last_revision = revision;
    semantics.invalidate();
}

Implementations§

Source§

impl SemanticsRequester

Source

pub fn new() -> Self

Source

pub fn invalidate(&self)

Marks the attached node’s semantics for re-collection on the next frame.

Idempotent within a frame and cheap: the node joins a set the shell drains once per frame. Before the node attaches, and after it detaches, this does nothing — there is no tree to mark.

Source

pub fn node_id(&self) -> Option<NodeId>

The layout node this requester is bound to, if it is attached.

Trait Implementations§

Source§

impl Clone for SemanticsRequester

Source§

fn clone(&self) -> SemanticsRequester

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SemanticsRequester

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for SemanticsRequester

Source§

fn default() -> SemanticsRequester

Returns the “default value” for a type. Read more

Auto Trait Implementations§

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.