pub struct BackHandler<State: 'static> { /* private fields */ }Expand description
Android back-press ⇄ navigator auto-wiring:
attach_back_handler/BackHandler pop a NavigatorController on a
platform back press and keep frust-reactive‘s handles_back flag in
sync with the stack depth, so a shell knows whether a root-level back should
fall through to the platform (activity finish). Mirrors
RouterDeepLinks’s shape and, like it, is the ONLY place in the facade
that sees both frust-widgets’ NavigatorController and
frust-reactive’s back-press source together — see BackHandler’s doc
for the consume/dedupe and timing contracts. Call BackHandler::track
from every Component::build.
Android back-press ⇄ navigator auto-wiring:
attach_back_handler/BackHandler pop a NavigatorController on a
platform back press and keep frust-reactive‘s handles_back flag in
sync with the stack depth, so a shell knows whether a root-level back should
fall through to the platform (activity finish). Mirrors
RouterDeepLinks’s shape and, like it, is the ONLY place in the facade
that sees both frust-widgets’ NavigatorController and
frust-reactive’s back-press source together — see BackHandler’s doc
for the consume/dedupe and timing contracts. Call BackHandler::track
from every Component::build.
Android back-press ⇄ navigator auto-wiring:
attach_back_handler/BackHandler pop a NavigatorController on a
platform back press and keep frust-reactive‘s handles_back flag in
sync with the stack depth, so a shell knows whether a root-level back should
fall through to the platform (activity finish). Mirrors
RouterDeepLinks’s shape and, like it, is the ONLY place in the facade
that sees both frust-widgets’ NavigatorController and
frust-reactive’s back-press source together — see BackHandler’s doc
for the consume/dedupe and timing contracts. Call BackHandler::track
from every Component::build.
A NavigatorController wired to the process-wide back-press source (see
the module docs) — the explicit back-wiring surface predating the
automatic navigator auto-wiring.
App code using frust::navigator no longer needs this: back handling is
automatic. It stays fully supported for apps that want an explicit handle
(Huddle constructs one), and now shares the same single consumption source
and request_back/back_interest routing as the automatic path — so
constructing a BackHandler and calling frust::navigator on the same
controller still consumes each press exactly once.
Construct once with attach_back_handler (or BackHandler::new) —
typically from Component::init, storing the result in Component::State —
then call track from every Component::build.
Implementations§
Source§impl<State: 'static> BackHandler<State>
impl<State: 'static> BackHandler<State>
Sourcepub fn new(controller: NavigatorController<State>) -> Self
pub fn new(controller: NavigatorController<State>) -> Self
Wire controller to the back-press source. Seeds the shared consumption
marker to the current back-press count (so a press delivered before this
handler existed does not trigger a spurious back on the first
track), publishes the initial handles_back fallback
flag, and registers the live back_interest provider (see the module
docs’ timing note).
Call this once per controller (e.g. from Component::init) — from the UI
thread, since the provider slot is UI-thread-affine (it reads the
Rc-backed controller). A Component::init always runs on the UI thread.
Registration position does not depend on when you construct this
(see the module docs’ R44-back section): a handler built in
Component::init wires before any view exists, and a root
overlay_host still outranks the navigator it
wraps — the host’s rank comes from its own entry point, not from wire
order. Where you call track from is likewise free.
Sourcepub fn track(&self)
pub fn track(&self)
Consume a new back press (routing it through
request_back) and refresh the
framework’s handles_back interest from the current stack. Call from
every Component::build.
Shares the single consumption source with the automatic
navigator path (see the module docs): a rebuild
re-run that observes the same already-consumed count neither re-fires nor
double-counts, and a frust::navigator on the same controller in the
same rebuild cannot double-pop.
Sourcepub fn controller(&self) -> &NavigatorController<State>
pub fn controller(&self) -> &NavigatorController<State>
The wired controller — hand it to
navigator, or drive it directly.
Auto Trait Implementations§
impl<State> !RefUnwindSafe for BackHandler<State>
impl<State> !Send for BackHandler<State>
impl<State> !Sync for BackHandler<State>
impl<State> !UnwindSafe for BackHandler<State>
impl<State> Freeze for BackHandler<State>where
NavigatorController<State>: Freeze,
impl<State> Unpin for BackHandler<State>where
NavigatorController<State>: Unpin,
impl<State> UnsafeUnpin for BackHandler<State>where
NavigatorController<State>: UnsafeUnpin,
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
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.