Flutter : validate() save () length Erreur

Bonjour j’ai un problème dans mon code sur Flutter,
il me donne 3 erreur ,la premier .validate() et la deuxième .save() et la troisième length .
Merci de votre aide.

import 'package:flutter/material.dart';

import 'dart:async';

import 'package:flutter/services.dart';

class Home extends StatefulWidget {

  const Home({Key? key}) : super(key: key);

  @override

  State<Home> createState() => _HomeState();

}

class _HomeState extends State<Home> {

  var _prenom = "";

  var _formkey = GlobalKey<FormState>();

  _prenomnom(value) {

    setState(() {

      _prenom = value;

    });

  }

  _confirmer() {

    if (_formkey.currentState.validate()) {

      _formkey.currentState.save();

    }

  }

  Widget build(BuildContext context) {

    return Scaffold(

      appBar: AppBar(),

      body: Column(

        children: [

          Icon(Icons.person),

          Text("Prénom : $_prenom"),

          Form(

            key: _formkey,

            child: Row(

              children: [

                Expanded(

                  child: TextFormField(

                    decoration: InputDecoration(

                        helperText: "Entrez votre prénom",

                        hintText: "Prénom"), // champ de text

                    autocorrect: false, //correction automatique

                    textCapitalization: TextCapitalization

                        .none, //Désactivé Majuscule pour Email

                    autofillHints: [AutofillHints.givenName], //indisse clavier

                    keyboardType: TextInputType.name,

                    validator: (value) =>

                        value.length > 3 ? null : "Trop cour", //type de clavier

                    // onChanged: _prenomnom, // ecrire instentaner

                    // onSubmitted: _prenomnom,

                  ),

                ),

                IconButton(onPressed: _confirmer, icon: Icon(Icons.check)),

              ],

            ),

          )

        ],

      ),

    );

  }

}

Salut @ISP ,
Tout d’abord quelles sont tes erreurs ? Et quelle est ta version de flutter, est tu en null safety ?

Bonjour pour la version de flutter 3.40.0 et les erreurs la premier .validate() et la deuxième .save() et la troisième length .

3.40.0 ? C’est pas vraiment possible ^^ Pour connaitre la version de flutter tu ouvres ton terminal de commande et tu tape la commande flutter doctor
Capture d’écran 2022-05-16 à 14.34.39
La version de flutter est écrit sur la première ligne.

Ah, ce ne sont pas des erreurs lors de l’exécution de ton code. Dans ce cas tu peux passer ta souris dessus et lire l’erreur. Si tu ne comprends pas très bien de quoi ça parle, traduit là. Si la traduction ne t’aide pas copie/colle ton erreur sur internet et regarde les solutions qui te sont proposées. Sinon n’hésite pas à revenir ici en nous disant l’erreur qui est afficher lorsque tu passes ta souris dessus.

Bonjour ISP

Je pense que tu es avec l’option « null safety », ce qui est très bien. Mais du coup, tu doit check tes variables correctement.
Dans ton cas, tu doit faire quelque chose comme :


  _confirmer() {
    if (_formkey.currentState?.validate() == true) {
      _formkey.currentState!.save();
    }
  }

Car la propriété currentState peut être null.
Donc :

  • currentState?.validate() == true car on veut entrer dans le if si currentState n’est pas null et que validate() retourne true, sinon si on à null ou false on s’arrête là.
  • currentState!.save() car si on est entré dans le if, forcément currentState n’est pas null, donc on peut faire le save() en spécifiant au compilateur que currentState n’est pas null (avec le !)

NB: currentState?.save() marcherai aussi, mais là on dit au compilateur de n’exécuter le save que si currentState n’est pas null. Donc il ajoutera un test (inutile) à ton code compilé (=> deviendra quelque chose comme if(_formkey.currentState != null) _formkey.currentState.save())

Le code de l’exemple compilé donnerai quelque chose comme :

_confirmer() {
    if (_formkey.currentState != null && _formkey.currentState.validate() == true) {
      _formkey.currentState.save();
    }
  }
1 « J'aime »

Effectivement le test d’avant permet d’éviter le risque, mais si un jour quelqu’un modifie la condition du if sans voir le ! dessous, alors ça pourrait mal finir.
Une version possible sans ! :

_confirmer() {
    final currentState = _formKey.currentState;
    if (currentState != null && currentState.validate() == true) {
      currentState.save();
    }
  }

Je suis en PLS sur ce sujet :joy: :joy: :joy:

La complétion automatique ne veut pas me donner le .validate() (Je crois qu’elle cherche la guerre :p)

Ma Form est encapsulé dans le content d’un showDialog(): Est-ce un problème ?

J’ai deux TextFormField dans ma Form :

TextFormField(
        maxLength: 20,
        decoration: InputDecoration(
          icon: Icon(Icons.perm_identity),
          labelText: _firstNameLabel,
        ),
        validator: (value) {
          if (value == null || value.isEmpty || value.length < 3) {
            return _firstNameErrorMessage;
          } else {
            return null;
          }
        },
        onSaved: _modifyFirstName,
      ),
TextFormField(
        maxLength: 20,
        decoration: InputDecoration(
          icon: Icon(Icons.perm_identity),
          labelText: _nameLabel,
        ),
        validator: (value) {
          if (value == null || value.isEmpty || value.length < 3) {
            return _nameErrorMessage;
          } else {
            return null;
          }
        },
        onSaved: _modifyName,
      )

J’ai essayé la solution de @mbritto juste au dessus.
Je suis avec la version de Flutter qui gère les null (pas moi hein ;-))

Ma fonction confirm :
image

Le message d’erreur :

The getter 'validate' isn't defined for the type 'State<StatefulWidget>'.
Try importing the library that defines 'validate', correcting the name to the name of an existing getter, or defining a getter or field named 'validate'.dartundefined_getter

Quelqu’un pourrait m’aider svp ? :pray:

A priori l’erreur venait de ma déclaration de _formKey :

GlobalKey _formkey =GlobalKey<FormState>();

NE DONNE PAS DE VALIDATE :hot_face:

final _formkey = GlobalKey<FormState>();

DONNE UN VALIDATE :heart_eyes:

Je ne comprends pas pourquoi mais ca marche …

C’est étrange comme erreur :thinking:
Mais l’essentiel c’est que ça fonctionne maintenant :+1: