94 votes

Validation des champs de texte dans Flutter

Je travaille sur Flutter TextField widget. Je veux afficher un message d'erreur sous le TextField si l'utilisateur ne remplit pas ce TextField . Je dois seulement utiliser TextField Widget pas TextFormField dans ce cas.

0 votes

155voto

anmol.majhail Points 11892

Un exemple minimal de ce que vous voulez :

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

3 votes

Cela montre une erreur "valeur constante invalide" sur la ligne errorText: _validate ? 'Value Can\'t Be Empty' : null,

2 votes

@RezaMortazavi supprimer const avant InputDecoration

9 votes

Faisons un peu de code propre dans l'exemple en setState : _validate = _text.text.isEmpty

35voto

jitesh mohite Points 3119

Flutter gère le texte de l'erreur lui-même, donc nous n'avons pas besoin d'utiliser la variable _validate . Il vérifiera au moment de l'exécution si vous avez satisfait à la condition ou non.

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 : L'utilisateur doit ajouter au moins un caractère pour obtenir ce message d'erreur.

7 votes

C'est en utilisant - TextFormField La question porte sur le fait de ne pas utiliser - TextFormField .

1 votes

@anmol.majhail : J'ai ajouté plus d'informations sur le champ TextFormField qui pourraient être utiles à d'autres.

1 votes

J'ai confirmé que cela fonctionne également avec TextField enveloppé par FormField. @jitsm555 pourrait le remanier pour une meilleure réponse.

30voto

Erlend Points 231

J'envisagerais d'utiliser un TextFormField avec un validator .

Exemple :

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

1 votes

La meilleure solution si vous avez besoin de valider plusieurs champs lors de la soumission.

17voto

Om Chevli Points 91
  • Si vous utilisez TextFormField vous pourriez alors facilement mettre en œuvre l'option "erreur sous vos champs de texte.
  • Vous pouvez le faire sans utiliser _validate ou tout autre drapeau.
  • Dans cet exemple, j'ai utilisé validator méthode de TextFormField widget. Cela rend le travail beaucoup plus facile et lisible en même temps. même temps.
  • J'ai aussi utilisé FormState pour rendre le travail plus facile

    void main() { runApp(MyApp()); }

    class MyApp extends StatelessWidget { final _form = GlobalKey<FormState>(); //for storing form state.

    //saving form after validation
    void _saveForm() { final isValid = _form.currentState.validate(); if (!isValid) { return; } }

    @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: Form( key: _form, //assigning key to form

          child: ListView(
            children: <Widget>[
    
              TextFormField(
                decoration: InputDecoration(labelText: 'Full Name'),
                validator: (text) {
                  if (!(text.length > 5) && text.isNotEmpty) {
                    return "Enter valid name of more then 5 characters!";
                  }
                  return null;
                },
              ),
    
              TextFormField(
                decoration: InputDecoration(labelText: 'Email'),
                validator: (text) {
                  if (!(text.contains('@')) && text.isNotEmpty) {
                    return "Enter a valid email address!";
                  }
                  return null;
                },
              ),
    
              RaisedButton(
                child: Text('Submit'),
                onPressed: () => _saveForm(),
              )
            ],
          ),
        ),
      ),
    );

    } }

J'espère que cela vous aidera !

4voto

Paresh Mangukiya Points 13942

Vous pouvez faire quelque chose comme ceci

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

Créer une fonction - Cette fonction va valider si la valeur que vous avez entrée est valide ou non. Et l'appeler au clic d'un bouton submit ou validate.

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

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X