value property
The current value stored in this notifier.
When the value is replaced with something that is not equal to the old value as evaluated by the equality operator ==, this class notifies its listeners.
Implementation
@override
T get value => _value;
Implementation
@override
set value(TextEditingValue newValue) {
// Попытка хандлить softkeyboard backspace, нажатый на пустом текстфилде.
// Данный метод будет вызван извне при любом изменении текстфилда. Что
// особенно важно - движок флаттера не проверяет отличается ли новое
// значение от старого. Именно этим мы и воспользуемся! Логика проста -
// если новое значение == старому, то вероятнее всего юзер пытается нажать
// backspace на пустом текстфилде. Однако нужно учитывать пару ньюансов...
// при попытке двигать ручки селекшона за пределы текстфилда будет каждый фрейм
// происходить сеттинг нового значения, которое == старому! Флаг ниже проверяет
// выделен ли текст, чтобы избежать сеттинга одинаковых значений, когда по факту
// с текстфилдом НИЧЕГО НЕ ПРОИСХОДИТ.
bool isInSelection = newValue.selection.start != newValue.selection.end;
// Также проверяем похожую ситуацию, но когда у селекшона только один ханлд
// bool isMovingSingleSelection = TODO: Сейчас я хз как это проверить
// Передосим фокус назад, если стерли последний символ
if (value.text != newValue.text && newValue.text.isEmpty) {
super.value = const TextEditingValue(selection: TextSelection.collapsed(offset: 0));
onLimitBackspacePressed();
return;
}
// TODO: Если контент ячейки выделен селекшоном, то новый текст должен заменять контент. Сейчас же он очищается а фокус передается предыдущей ячейке.
if (value == newValue && value.selection.baseOffset == 0 && !isInSelection) {
onLimitBackspacePressed();
} else {
super.value = newValue;
}
}