Включить / отключить CupertinoDialogAction в зависимости от CupertinoTextField пусто или нет

#flutter #flutter-cupertino

#трепетание #флаттер-Купертино

Вопрос:

Я хочу включить CupertinoDialogAction, если CupertinoTextField не является пустым, иначе по умолчанию оно должно быть отключено, также я установил «isDefaultAction: false», но оно по-прежнему доступно для просмотра.

 showDialog(
          context: context,
          builder: (BuildContext context) => CupertinoAlertDialog(
            actions: [
              CupertinoDialogAction(
                onPressed: () => (Navigator.of(context).pop()),
                child: Text("Cancel"),
              ),
              CupertinoDialogAction(
                child: Text("Save"),
                isDefaultAction: false,
              ),
            ],
            title: Text("New Folder"),
            content: Column(
              children: <Widget>[
                Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Text("Enter a name for this folder"),
                ),
                Container(
                  height: 30,
                  child: CupertinoTextField(
                    controller: folderName,
                    placeholder: "Name",
                    decoration: BoxDecoration(
                      borderRadius: BorderRadius.circular(8),
                    ),
                  ),
                )
              ],
            ),
          ),
        );
 

Ответ №1:

Если вы хотите отключить a CupertinoDialogAction , вам нужно установить для этого onPressed свойства значение null . Это будет выглядеть примерно так:

        Bool isEnabled = false;

       @override
       void initState() {
         super.initState();

         folderName.addListener(enableButton); // addListened to your TextEditingController!
       }
 

Он установит для IsEnabled значение true.

       enableButton()
      {
        if(folderName.text != "")
        {
          setState(() {
            isEnabled = true;
          });
        }                
      }
 

И тогда вы можете использовать это логическое поле.

       CupertinoDialogAction(
              onPressed: !isEnabled 
                  ? null
                  : () {
                      // Do what you need!
                      // Save method!
                    },
              child: Text("Save"),
              isDefaultAction: false,
            ),
 

Комментарии:

1. Это не работает, функция «Сохранить» CupertinoDialogAction остается отключенной даже после того, как я ввожу некоторый текст в CupertinoTextField, чего я не ожидаю.

2. Вы можете попробовать добавить прослушиватель в свой TextEditingController.

3. Я отредактировал ответ. Вы можете проверить еще раз.

4. Он по-прежнему не работает , диалоговое окно сохранения остается отключенным, возможно, TextController не получает изменения в текстовом поле, а КОНСОЛЬ ОТЛАДКИ показывает исключение «Метод ‘call’ был вызван для null.», «Receiver: null «, «Пытался вызвать: call() »

5. Ошибка может быть в другом месте, где вы вызываете метод call() . Можете ли вы также поделиться этой частью своего кода?

Ответ №2:

  1. Создайте виджет с отслеживанием состояния, который создает список действий и возвращает CupertinoAlertDialog результаты с этими действиями. Этот виджет должен содержать некоторое состояние, указывающее, должно ли быть включено действие сохранения или нет. Если оно не должно быть включено, введите null в onPressed обработчик.
  2. Напишите некоторый обработчик, который использует setState для установки этого включенного / отключенного состояния в зависимости от того, что делает пользователь.
  3. Верните свой виджет с отслеживанием состояния из showDialog конструктора