flutter, как изменить цвет кнопки отправки, когда текстовое поле не пусто? - PullRequest
0 голосов
/ 21 июня 2020

я хотел бы изменить цвет моей кнопки отправки, когда пользователь начинает редактировать поле текстовой формы, вот что я пытался сделать:

          final _text = TextEditingController(); 

поле текстовой формы, в котором реализован мой контроллер

          TextFormField(
                  controller: _text,

и, наконец, моя кнопка отправки

            (_text.text.isNotEmpty) ?
          new RaisedButton(
            color: mmpataColorBlue,
            child: new Text(
              "Valider",
              style: TextStyle(color: Colors.white),
            ),
            onPressed: () async {
              await createOrder(vm);
            },
          ) 
          : 
           new RaisedButton(
             color: Colors.grey,
            child: new Text(
              "Valider",
              style: TextStyle(color: Colors.white),
            ),
            onPressed: () async {
              await createOrder(vm);
            },
          ) 

, и я получил эту ошибку при запуске кода: Было выбрано другое исключение: 'package: flutter / src / material / text_form_field. dart ': Неудачное утверждение: строка 176 поз. 15:' initialValue == null || controller == null ': неверно.

Ответы [ 3 ]

0 голосов
/ 21 июня 2020

Это будет работать путем добавления listener к контроллеру. Каждый раз, когда значение контроллера изменяется, он запускает функцию на слушателе (который в данном случае вызывает setState). Затем RaisedButton проверит, является ли значение контроллера пустым, и перейдет к отображению соответствующего цвета.

class TestPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return TestPageState();
  }
}

class TestPageState extends State<TestPage> {
  TextEditingController _myController = TextEditingController();

  @override
  void initState() {
    super.initState();
    _myController.text = '<initial value>';
    _myController.addListener(() {
      setState(() {}); // setState every time text changes
    });
  }

  @override
  void dispose() {
    _myController.dispose();
    super.dispose();
  }
  
  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        body: Row(
          children: <Widget>[
            SizedBox(
              height: 32.0,
              width: 200.0,
              child: TextFormField(
                controller: _myController,
              ),
            ),
            RaisedButton(
              onPressed: () {
                print('pressed');
              },
              color: (_myController.text.isEmpty) ? Colors.blue : Colors.green,
              child: Text('test'),
            )
          ],
        ),
      ),
    );
  }
}

0 голосов
/ 21 июня 2020

Я думаю, вы могли бы использовать для этого валидатор. Вы можете использовать переменную для определения цвета кнопки и использовать setState в валидаторе, чтобы изменить его.

0 голосов
/ 21 июня 2020

из сообщения об ошибке, я думаю, вы установили начальное значение для textforifield, это невозможно, так как у вас есть контроллер, вместо этого используйте:

 _text.text = 'your initial value';
...