onKey method
Implementation
@override
bool onKey(KeyEvent event, RenderContext ctx) {
if (state.submitted && lockOnSubmit) return false;
var cur = state.cursor.clamp(0, state.text.length);
var v = state.text;
String? next;
if (event.key != null) {
switch (event.key!) {
case NamedKey.enter:
_submit();
return true;
case NamedKey.arrowUp:
final current = _coerce(v) ?? defaultValue ?? min ?? 0;
_setFromNumber(current + step);
return true;
case NamedKey.arrowDown:
final current = _coerce(v) ?? defaultValue ?? max ?? 0;
_setFromNumber(current - step);
return true;
case NamedKey.backspace:
if (cur > 0) {
next = v.substring(0, cur - 1) + v.substring(cur);
cur -= 1;
}
case NamedKey.delete:
if (cur < v.length) {
next = v.substring(0, cur) + v.substring(cur + 1);
}
case NamedKey.arrowLeft:
if (cur > 0) cur -= 1;
state.cursor = cur;
return true;
case NamedKey.arrowRight:
if (cur < v.length) cur += 1;
state.cursor = cur;
return true;
case NamedKey.home:
state.cursor = 0;
return true;
case NamedKey.end:
state.cursor = v.length;
return true;
default:
return false;
}
} else {
if (event.ctrl || event.alt) return false;
final c = event.char;
if (c != null && c.runes.length == 1) {
final cp = c.runes.first;
if (_isValidChar(cp, v, cur)) {
next = v.substring(0, cur) + c + v.substring(cur);
cur += c.length;
}
}
}
if (next != null) {
state.text = next;
state.cursor = cur;
state.error = null;
state.submitted = false;
onChanged?.call(_coerce(next));
return true;
}
return false;
}