handleKeyEvent method

  1. @override
bool handleKeyEvent(
  1. KeyEvent event
)
override

Routes a key event to the focused field, handling tab navigation.

Implementation

@override
bool handleKeyEvent(term.KeyEvent event) {
  if (widget.fields.isNotEmpty) {
    final list = widget.fields;
    var activeIdx = list.indexWhere((f) => f.focused);
    if (activeIdx == -1) activeIdx = 0;

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

  if (_fields.isEmpty) return false;

  final list = _fields.toList();
  var activeIdx = list.indexWhere((fs) => fs.widget.focused);
  if (activeIdx == -1) activeIdx = 0;

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