#flutter
#flutter
Вопрос:
Минимальный воспроизводимый код:
final _controller = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: TextField(
controller: _controller,
keyboardType: TextInputType.number,
onChanged: (string) {
_controller.text = string; // Removing this works though!
_controller.selection = TextSelection.fromPosition(TextPosition(offset: _controller.text.length));
},
),
);
}
Проблема:
Как вы можете ясно видеть на скриншоте о проблеме, ввод 12
печатает 21
и так далее. Вы можете спросить, какой смысл устанавливать текст в TextEditingController
текущей строке, переданной onChanged
, ну, мне нужно отформатировать текущую строку, но даже самая простая строка не может установить текст.
Ответ №1:
Я думаю, это может сотворить волшебство для вас!
onChanged: (newText) {
var text = formatString(newText);
_controller.value = _controller.value.copyWith(
text: text,
selection: TextSelection.collapsed(offset: text.length),
);
}
Выполняйте форматирование таким образом и не забывайте каждый раз, когда новый текст передается с уже отформатированным значением.
(В этом случае я заменил все запятые, чтобы вернуть мою исходную строку)
String formatString(String newText){
return newText.replaceAll(',', '').split('').join(',');
}
Ссылка на интерактивный пример:https://api.flutter.dev/flutter/widgets/TextEditingController-class.html#widgets .TextEditingController.1
Комментарии:
1. Спасибо, но этот пример можно легко выполнить, используя
string.toLowerCase()
в моем коде. Проблема возникает, когда мне нужно вставить запятые в форматированную строку.2. Можно ли вставлять запятые, когда мы используем TextInputType.number?
3. Вы можете рассмотреть пример, когда пользователь вводит число, скажем, миллион: 1,000,000.