onKey method

  1. @override
bool onKey(
  1. KeyEvent event,
  2. RenderContext ctx
)
override

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;
}