Textfield validation in Flutter

前端 未结 4 1111
你的背包
你的背包 2020-12-08 18:13

I am working on Flutter TextField widget. I want to show an error message below the TextField widget if the user does not fill that TextField

相关标签:
4条回答
  • 2020-12-08 18:57

    A Minimal Example of what you Want:

    class MyHomePage extends StatefulWidget {
      @override
      MyHomePageState createState() {
        return new MyHomePageState();
      }
    }
    
    class MyHomePageState extends State<MyHomePage> {
      final _text = TextEditingController();
      bool _validate = false;
    
      @override
      void dispose() {
        _text.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('TextField Demo'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text('Error Showed if Field is Empty on Submit button Pressed'),
                TextField(
                  controller: _text,
                  decoration: InputDecoration(
                    labelText: 'Enter the Value',
                    errorText: _validate ? 'Value Can\'t Be Empty' : null,
                  ),
                ),
                RaisedButton(
                  onPressed: () {
                    setState(() {
                      _text.text.isEmpty ? _validate = true : _validate = false;
                    });
                  },
                  child: Text('Submit'),
                  textColor: Colors.white,
                  color: Colors.blueAccent,
                )
              ],
            ),
          ),
        );
      }
    }
    
    0 讨论(0)
  • 2020-12-08 19:03

    I would consider using a TextFormField with a validator.

    Example:

    class MyHomePageState extends State<MyHomePage> {
      final _formKey = GlobalKey<FormState>();
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('TextFormField validator'),
          ),
          body: Form(
            key: _formKey,
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                TextFormField(
                  decoration: InputDecoration(
                    hintText: 'Enter text',
                  ),
                  textAlign: TextAlign.center,
                  validator: (text) {
                    if (text == null || text.isEmpty) {
                      return 'Text is empty';
                    }
                    return null;
                  },
                ),
                RaisedButton(
                  onPressed: () {
                    if (_formKey.currentState.validate()) {
                      // TODO submit
                    }
                  },
                  child: Text('Submit'),
                )
              ],
            ),
          ),
        );
      }
    }
    
    0 讨论(0)
  • 2020-12-08 19:06

    Adding to @anmol answer: TextFormField is also a better option for validation.

    Flutter handles error text itself, so we don't require to use variable _validate. It will check at runtime whether you satisfied the condition or not.

    final confirmPassword = TextFormField(
      controller: widget.confirmPasswordController,
      obscureText: true,
      decoration: InputDecoration(
        prefixIcon: Icon(Icons.lock_open, color: Colors.grey),
        hintText: 'Confirm Password',
        errorText: validatePassword(widget.confirmPasswordController.text),
        contentPadding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
      ),
    );
    
    String validatePassword(String value) {
      if (!(value.length > 5) && value.isNotEmpty) {
        return "Password should contain more than 5 characters";
      }
      return null;
    }
    

    Note: User must add at least one character to get this error message.

    0 讨论(0)
  • 2020-12-08 19:06

    You can do something like this

    class _validateTextField extends State<validateTextField> {
      TextEditingController userNameController = TextEditingController();
      bool userNameValidate = false;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
              child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    TextField(
                      controller: userNameController,
                      decoration: InputDecoration(
                          labelText: 'Enter Username',
                          errorText: isUserNameValidate ? 'Please enter a Username' : null
                      ),
                    ),
                    SizedBox(height: 50,),
                    OutlineButton(
                      onPressed: () {
                        validateTextField(userNameController.text);
                      },
                      child: Text('Validate'),
                      textColor: Colors.blue,
                    ),
                  ]
              )
          ),
        );
      }
    }
    

    Create Function - This function will validate whether the value you entered is validate or not. And call it at the click of a submit or validate button

      bool validateTextField(String userInput) {
        if (userInput.isEmpty) {
          setState(() {
            isUserNameValidate = true;
          });
          return false;
        }
        setState(() {
          isUserNameValidate = false;
        });
        return true;
      }
    

    0 讨论(0)
提交回复
热议问题