首页 > 解决方案 > 如何根据条件将禁用按钮变为启用按钮

问题描述

我是 Flutter 的新手,只要某些文本字段为空,我就会尝试禁用按钮,因此我制作了 3 个文本控制器来充当 3 个文本字段的控制器,并且我制作了一个功能来检查功能是:

bool isEmpty(){
    setState(() {
          if(textEditingController.text!=" "&&textEditingController2.text!=" "&& textEditingController3.text!=" "){
            isButtonEnabled=true;


          }
        });
       return isButtonEnabled; 
  }

文本字段的代码是:

TextField(
                  onSubmitted:null,

                  controller: textEditingController3,


                )

然后我为按钮编写代码如下:Center(

  child: RaisedButton(
         child: Text("Button 1",style: TextStyle(color:Colors.white),),
          onPressed:isButtonEnabled?(){ print("enabled");}:null,
          color: Colors.red,

            ),

问题是即使在我在文本字段中写入后,该按钮仍处于禁用状态。任何想法?提前致谢。 编辑: 感谢@diegoveloper的回答,这很有效,但是如果我想输入初始值并且我希望仅当文本字段具有以下文本字段的值时才启用按钮:

@override
  void initState() {
    super.initState();
   textEditingController  = new TextEditingController(text: name);
      textEditingController2  = new TextEditingController(text: email);
         textEditingController3  = new TextEditingController(text: " place");


  }

然后我将 isEmpty 方法更新为:

bool isEmpty(){
    setState(() {
          if((textEditingController.text!=" ")&&(textEditingController2.text!=" ")&& (textEditingController3.text!=" ")&&(textEditingController!=null)&&(textEditingController2!=null)&&(textEditingController3!=null)){
            isButtonEnabled=true;



          }
          else{
                        isButtonEnabled=false;

          }
        });
       return isButtonEnabled; 
  }

问题是尽管我为文本字段提供了初始值,但该按钮仍然被禁用,当我编辑文本字段的 3 个值时,该按钮已启用,但如果我删除了文本(我认为它的意思是 null)按钮仍然被禁用。

标签: buttonfluttertextfieldtxtextcontrol

解决方案


你不需要任何额外的库来做到这一点。Flutter 开箱即用,您可以确保不会在每次击键时重建整个树。

TextEditingController扩展ValueNotifier<TextEditingValue>这意味着您可以使用ValueListenableBuilderfrommaterial包来收听文本更改。

class MyWidget extends StatelessWidget {
  final TextEditingController _inputController = TextEditingController();

  @override
  void dispose() {
    _inputController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Column(children: [
      TextField(controller: _inputController),
      ValueListenableBuilder<TextEditingValue>(
        valueListenable: _inputController,
        builder: (context, value, child) {
          return ElevatedButton(
            onPressed: value.text.isNotEmpty ? () {} : null,
            child: Text('I am disabled when text is empty'),
          );
        },
      ),
    ]);
  }
}

推荐阅读