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