颤抖如何在textformfield不为空的情况下更改提交按钮的颜色?

时间:2020-06-21 07:51:18

标签: flutter

当用户开始编辑textformfield时,我想更改提交按钮的颜色,这是我尝试做的事情:

          final _text = TextEditingController(); 

实现我的控制器的textformfield

          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 :(得分:0)

从消息错误中,我认为您确实为textforifield设置了一个初始值,这是不可能的,因为您有一个控制器,而是使用:

 _text.text = 'your initial value';

答案 1 :(得分:0)

这将通过向控制器添加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'),
            )
          ],
        ),
      ),
    );
  }
}

答案 2 :(得分:0)

我认为您可以为此使用验证器。您可以使用变量定义按钮的颜色,并在验证器中使用setState进行更改。