Я создал текстовое поле многократного использования для своего проекта Flutter, но метод OnChange не работает с виджетом многократного использования. Всякий раз, когда я пытался создать поле непосредственно в проекте, это работало. Я подозреваю, что причиной ошибки, вероятно, является опция значения, которая поставляется с текстовым полем onChange. Любая помощь с решением?
class NumberOnlyTextField extends StatelessWidget{
final controller;
final String hintText;
final bool obscureText;
final bool enableTxtField;
final Function()? onChanged;
const NumberOnlyTextField({
super.key,
required this.controller,
required this.hintText,
required this.obscureText,
required this.enableTxtField,
required this.onChanged,
});
@override
Widget build(BuildContext context){
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 15.0),
child: Container(
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: const Color.fromARGB(255, 213, 211, 211)),
borderRadius: BorderRadius.circular(4),
),
child: Padding(
padding: const EdgeInsets.only(left: 10.0, right: 10.0),
child: TextField(
controller: controller,
onChanged: (value) { onChanged; },
obscureText: obscureText,
enabled: enableTxtField,
keyboardType: TextInputType.number,
inputFormatters: [
FilteringTextInputFormatter.allow(
RegExp('[0-9]+.?[0-9]*'),
),
],
decoration: InputDecoration(
border: InputBorder.none,
hintText: hintText,
hintStyle: TextStyle(color: Colors.grey[500]),
),
),
),
),
);
}
}
Вот где он используется на другой странице:
//Amount
NumberOnlyTextField(
controller: amountXController,
onChanged: validateAmount(),
hintText: 'Amount',
obscureText: false,
enableTxtField: true,
),
const SizedBox(height: 10),
{void Function(String)? onChanged}
Тип:void Function(String)?
Вызывается, когда пользователь инициирует изменение значения TextField: когда он вставляет или удаляет текст или сбрасывает форму.
вам нужно будет обновить свой код следующим образом.
final void Function(String)? onChanged;
TextFormField(
controller: controller,
onChanged: onChanged,
``
Это все еще не сработало
Вы не вызываете функцию onChanged, поэтому функция не работает.
я сделал это
onChanged: (value) {
if (this.onChanged != null) this.onChanged!();
},
или
onChanged: (value) {
onChanged?.call();
},
так что NumberOnlyTextField сейчас
class NumberOnlyTextField extends StatelessWidget {
final controller;
final String hintText;
final bool obscureText;
final bool enableTxtField;
final Function()? onChanged;
const NumberOnlyTextField({
super.key,
required this.controller,
required this.hintText,
required this.obscureText,
required this.enableTxtField,
required this.onChanged,
});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 15.0),
child: Container(
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: const Color.fromARGB(255, 213, 211, 211)),
borderRadius: BorderRadius.circular(4),
),
child: Padding(
padding: const EdgeInsets.only(left: 10.0, right: 10.0),
child: TextField(
controller: controller,
onChanged: (value) {
onChanged?.call();
},
obscureText: obscureText,
enabled: enableTxtField,
keyboardType: TextInputType.number,
inputFormatters: [
FilteringTextInputFormatter.allow(
RegExp('[0-9]+.?[0-9]*'),
),
],
decoration: InputDecoration(
border: InputBorder.none,
hintText: hintText,
hintStyle: TextStyle(color: Colors.grey[500]),
),
),
),
),
);
} }
И теперь оно работает. Я попытался напечатать значение изменено: когда я что-то пишу в текстовом поле. И это работает!
Можете ли вы помочь мне с ошибкой RegEX. Я хочу, чтобы вход допускал только целочисленные и двойные входы
Я попробовал ваш код в Chrome, и он получает только целые и двойные значения в виде строки. Можете ли вы написать свою ошибку и код, пожалуйста?
Он принимает алфавит. Попробуйте ввести ввод, например 34b или 34.1t. Вы заметите, что он их принимает
используйте это регулярное выражение RegExp(r'^\d+\.?\d*')
вы также можете использовать этот RegExp(r'^\d+\.?\d{0,2}'), если хотите разрешить только 2 десятичных знака после точки
Работало как по волшебству
Приятно слышать ! Кстати, ты можешь принять мой ответ? Спасибо 🙂
Что касается NumberOnlyTextField, как вы повторно использовали его, потому что с моей стороны он не работает. Вот как я его повторно использовал: NumberOnlyTextField(controller: sumController, onChanged: checkInputAmount(),hintText: 'Amount', obscureText: false, EnableTxtField: true,), const SizedBox(height: 10),
NumberOnlyTextField (контроллер: контроллер, подсказка: «Введите номер», obscureText: false, EnableTxtField: true, onChanged: () { print(controller.text); }, ),
Возможно, у вашей функции checkInputAmount() возникла проблема. Можете ли вы попробовать напечатать контроллер.текст при onChanged или написать код функции checkInputAmount?
Это сработало, когда я использовал onChanged: () { checkInputAmount(); } вместо onChanged: checkInputAmount(),
Также я хотел, чтобы текстовое поле допускало только целые числа или двойные числа, но также не работало. Я хочу, чтобы текстовое поле принимало только входные данные в этом формате 1.12 0r 200