Focus
Focus nodes, scopes, traversal, and exclusion with every method.
Focus
| Widget | Purpose |
|---|---|
Focus | Attach node, autofocus, and request policy to a subtree |
FocusScope | Scope with traversal policy (WidgetOrder / ReadingOrder / Ordered) |
FocusTraversalGroup | Override policy for a region (default ReadingOrder) |
FocusTraversalOrder | Explicit numeric order (order, non-finite clears) |
ExcludeFocus | Remove subtree from focus order |
ExcludeFocusTraversal | Remove subtree from traversal only |
use incular::prelude::*;
fn main() {
let app = Application::new(|_cx| {
Container::builder()
.padding(EdgeInsets::all(24.0))
.alignment(Alignment::CENTER)
.child(
FocusScope::new(
Column::builder()
.main_axis_size(MainAxisSize::Min)
.spacing(8.0)
.children(Vec::<Widget>::from([
Focus::new(Text::new("First")).autofocus(true).into(),
Focus::new(Text::new("Second")).into(),
]))
.build(),
)
.autofocus(true),
)
.build()
.into()
})
.expect("valid application");
incular::run(app).expect("run application");
}Without an explicit node but with autofocus or can_request_focus = false,
Focus creates one internally. Fully default Focus returns the child
unchanged.
FocusScope
autofocus, policy(FocusTraversalPolicyKind::WidgetOrder),
reading_order(), widget_order(), ordered() — exercised in the runnable
program above.
Traversal and exclusion
use incular::prelude::*;
fn main() {
let app = Application::new(|_cx| {
FocusTraversalGroup::new(Text::new("Hi")).into()
})
.expect("valid application");
incular::run(app).expect("run application");
}FocusTraversalPolicy trait (find_first/last_focus, next, previous)
with WidgetOrderTraversalPolicy / ReadingOrderTraversalPolicy /
OrderedTraversalPolicy (explicit numeric order) implementations.
FocusScopeNode, FocusNode, FocusManager, and traversal policies
(Ordered, ReadingOrder, WidgetOrder) live in incular-gestures.
BuildContext::watch_focus_scope(&scope) subscribes a build to scope changes.
Related: Keyboard,
GestureDetector.