【问题标题】:how to turn disabled button into enabled button depending on conditions如何根据条件将禁用按钮变为启用按钮
【发布时间】:2019-02-27 08:30:42
【问题描述】:

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

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


          }
        });
       return isButtonEnabled; 
  }

文本字段的代码是:

TextField(
                  onSubmitted:null,

                  controller: textEditingController3,


                )

然后我编写按钮的代码如下: 中心(

  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) 按钮仍处于禁用状态。

【问题讨论】:

  • 什么时候调用“isEmpty”方法?

标签: button flutter textfield txtextcontrol


【解决方案1】:

您不需要任何其他库来执行此操作。 Flutter 开箱即用,您可以确保不会在每次击键时重建整个树。

TextEditingController 扩展了ValueNotifier<TextEditingValue>,这意味着您可以利用material 包中的ValueListenableBuilder 来收听文本更改。

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'),
          );
        },
      ),
    ]);
  }
}

【讨论】:

    【解决方案2】:

    您可以在此处阅读有关 TextField 的更多信息:https://flutter.io/cookbook/forms/text-field-changes/

    所以你有两个选择:

    1 - 监听每个 TextEditingController 的变化并调用你的方法 isEmpty()

    2 - 在您想监听更改的每个 TextField 上添加 onChanged 回调。

    选项 2

    TextField(
      onSubmitted: null,
      onChanged: (val) {
        isEmpty();
      },
      controller: textEditingController3,
    )
    

    注意:不要忘记将 ELSE 条件添加到您的 isEmpty 方法中。

    编辑

    修改您的 initState 方法以检查您的按钮是否启用(请重构此代码)

    @override
    void initState() {
        super.initState();
    
        textEditingController = TextEditingController(text: "name");
        textEditingController2 = TextEditingController(text: "email");
        textEditingController3 = TextEditingController(text: "place");
    
        if ((textEditingController.text.trim() != "") && (textEditingController2.text.trim() != "") && (textEditingController3.text.trim() != "")) {
            isButtonEnabled = true;
        } else {
            isButtonEnabled = false;
        }
    }
    

    【讨论】:

    • 感谢您的回复,这在我第一次在文本字段中写入时有效,但是当我删除文本时,我再次在文本字段中放置空格,但它并没有变成禁用我不不知道为什么?
    • 你能用你最新的代码更新你的问题吗?我看到你有 3 个 texteditingcontroller
    • 哦,等等,在您的 isEmpty 方法中,您有一个 if 条件添加和 ELSE 并将 isButtonEnabled 设置为 false
    • 谢谢你这工作,你能检查一下编辑吗?我还有一个问题
    • 我不明白你的问题,你需要什么?
    【解决方案3】:

    你可以使用嵌套的TextEditingWatchers

    【讨论】:

    • 完美。正是我需要的。
    猜你喜欢
    • 2021-01-06
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多