handleKeyEvent method

void handleKeyEvent(
  1. KeyEvent event
)

Moves focus between fields using Tab/Shift-Tab, and routes other events to the active field.

Implementation

void handleKeyEvent(KeyEvent event) {
  if (_state != null) {
    _state!.handleKeyEvent(event);
    return;
  }
  if (fields.isEmpty) return;

  if (event.logicalKey == term.TermKey.tab) {
    fields[activeFieldIndex].focused = false;
    activeFieldIndex = (activeFieldIndex + 1) % fields.length;
    fields[activeFieldIndex].focused = true;
  } else if (event.logicalKey == term.TermKey.shiftTab) {
    fields[activeFieldIndex].focused = false;
    activeFieldIndex = (activeFieldIndex - 1 + fields.length) % fields.length;
    fields[activeFieldIndex].focused = true;
  } else if (event.type == KeyType.enter ||
      event.baseKey == term.TermKey.enter) {
    final currentField = fields[activeFieldIndex];
    currentField.validate();
    if (currentField is! TextAreaFormField) {
      currentField.focused = false;
      activeFieldIndex = (activeFieldIndex + 1) % fields.length;
      fields[activeFieldIndex].focused = true;
    } else {
      currentField.handleKeyEvent(event);
    }
  } else {
    final handled = fields[activeFieldIndex].handleKeyEvent(event);
    if (!handled) {
      if (event.type == KeyType.up) {
        fields[activeFieldIndex].focused = false;
        activeFieldIndex =
            (activeFieldIndex - 1 + fields.length) % fields.length;
        fields[activeFieldIndex].focused = true;
      } else if (event.type == KeyType.down) {
        fields[activeFieldIndex].focused = false;
        activeFieldIndex = (activeFieldIndex + 1) % fields.length;
        fields[activeFieldIndex].focused = true;
      }
    }
  }
}