#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:
- Создайте виджет с отслеживанием состояния, который создает список действий и возвращает
CupertinoAlertDialog
результаты с этими действиями. Этот виджет должен содержать некоторое состояние, указывающее, должно ли быть включено действие сохранения или нет. Если оно не должно быть включено, введите null вonPressed
обработчик. - Напишите некоторый обработчик, который использует
setState
для установки этого включенного / отключенного состояния в зависимости от того, что делает пользователь. - Верните свой виджет с отслеживанием состояния из
showDialog
конструктора