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();
    }
  }