Flutter onChange не работает в моем текстовом поле

Я создал текстовое поле многократного использования для своего проекта 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),

Также я хотел, чтобы текстовое поле допускало только целые числа или двойные числа, но также не работало. Я хочу, чтобы текстовое поле принимало только входные данные в этом формате 1.12 0r 200

Cliff Odebala Clarke 27.04.2024 20:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

{void Function(String)? onChanged} Тип: void Function(String)? Вызывается, когда пользователь инициирует изменение значения TextField: когда он вставляет или удаляет текст или сбрасывает форму.

вам нужно будет обновить свой код следующим образом.

 final void Function(String)? onChanged;

 TextFormField(
            controller: controller,
            onChanged: onChanged,
``

Это все еще не сработало

Cliff Odebala Clarke 27.04.2024 23:17
Ответ принят как подходящий

Вы не вызываете функцию 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. Я хочу, чтобы вход допускал только целочисленные и двойные входы

Cliff Odebala Clarke 27.04.2024 22:19

Я попробовал ваш код в Chrome, и он получает только целые и двойные значения в виде строки. Можете ли вы написать свою ошибку и код, пожалуйста?

Avarjuan 27.04.2024 22:40

Он принимает алфавит. Попробуйте ввести ввод, например 34b или 34.1t. Вы заметите, что он их принимает

Cliff Odebala Clarke 27.04.2024 22:59

используйте это регулярное выражение RegExp(r'^\d+\.?\d*')

Avarjuan 27.04.2024 23:11

вы также можете использовать этот RegExp(r'^\d+\.?\d{0,2}'), если хотите разрешить только 2 десятичных знака после точки

Avarjuan 27.04.2024 23:12

Работало как по волшебству

Cliff Odebala Clarke 27.04.2024 23:16

Приятно слышать ! Кстати, ты можешь принять мой ответ? Спасибо 🙂

Avarjuan 27.04.2024 23:23

Что касается NumberOnlyTextField, как вы повторно использовали его, потому что с моей стороны он не работает. Вот как я его повторно использовал: NumberOnlyTextField(controller: sumController, onChanged: checkInputAmount(),hintText: 'Amount', obscureText: false, EnableTxtField: true,), const SizedBox(height: 10),

Cliff Odebala Clarke 27.04.2024 23:25

NumberOnlyTextField (контроллер: контроллер, подсказка: «Введите номер», obscureText: false, EnableTxtField: true, onChanged: () { print(controller.text); }, ),

Avarjuan 27.04.2024 23:26

Возможно, у вашей функции checkInputAmount() возникла проблема. Можете ли вы попробовать напечатать контроллер.текст при onChanged или написать код функции checkInputAmount?

Avarjuan 27.04.2024 23:29

Это сработало, когда я использовал onChanged: () { checkInputAmount(); } вместо onChanged: checkInputAmount(),

Cliff Odebala Clarke 27.04.2024 23:50

Другие вопросы по теме