API ReferenceInput & Forms
Input Formatters
Filtering and length-limiting formatters with enforcement modes.
use incular::prelude::*;
use incular::widgets::{
FilteringTextInputFormatter, LengthLimitingTextInputFormatter, TextInputFormatter,
};
fn main() {
let formatter = FilteringTextInputFormatter::digits_only();
let limiter = LengthLimitingTextInputFormatter::new(3);
let old = TextEditingValue::new("abc");
let next = TextEditingValue::new("a1b2c3");
let filtered = formatter.format_edit_update(&old, &next);
let limited = limiter.format_edit_update(&old, &next);
let show = TextEditingController::from_value(filtered);
let show_limited = TextEditingController::from_value(limited);
let app = Application::new(move |_cx| {
Container::builder()
.padding(EdgeInsets::all(24.0))
.alignment(Alignment::CENTER)
.child(
Column::builder()
.main_axis_size(MainAxisSize::Min)
.spacing(8.0)
.children(Vec::<Widget>::from([
Text::new(format!(
"digits: {}",
show.text()
)).into(),
Text::new(format!(
"capped: {}",
show_limited.text()
)).into(),
]))
.build(),
)
.build()
.into()
})
.expect("valid application");
incular::run(app).expect("run application");
}| Formatter | Rule |
|---|---|
allow(predicate) | Keep only matching chars |
deny(predicate) | Drop matching chars |
digits_only() | Numeric input only |
single_line_formatter() | Deny newlines |
LengthLimitingTextInputFormatter | Grapheme-aware cap with enforcement mode |
MaxLengthEnforcement: None / Enforced (default) /
TruncateAfterCompositionEnds. Truncation is grapheme-cluster aware with
clamped selection and per-enforcement composition handling.
pub trait TextInputFormatter {
fn format_edit_update(&self, old_value: &TextEditingValue, new_value: &TextEditingValue) -> TextEditingValue;
}Related: FormField,
TextEditingController.