Problème avec Flutter Elevated Button

Bonjour,
En milieu de formation sur le développement d’application en Flutter, je m’attaque au défi de chiffrement de César.
Et je coince sur un Elevated Button, que je n’arrive pas à rendre actif. Il est pourtant bien relié à une fonction. Pourtant si je met la propriété onPressed sur une closure, il s’active.

Il doit y avoir quelque chose qui coince dans mon code, mais cela fait plus de 2 jours que je bloque là-dessus et là je me décourage…

Le code de mon bouton :

Padding(
              padding: const EdgeInsets.only(top: 20.0),
              child: ElevatedButton(
                onPressed: _cryptMessage(_key, _message),
                //onPressed: () {},
                child: const Text("Chiffrer le message"),
              ),
            ),

Le code de la fonction :

_cryptMessage(int key, String message) {
    setState(() {
      Message encryptedMessage = Message(message, key);
      _encryptedMessage = encryptedMessage.encodeOrDecode(true);
      _decryptMessage(key, _encryptedMessage);
      messageExist == true;
    });
  }

La class Message (non encore aboutie, l’idée est pour l’instant de voir si tout le reste est fonctionnel, ce qui n’est pas le cas) :

class Message {
  String _message;
  int _key = 0;
  
  String get message => _message;

  set message(String message) {
    _message = message;
  }

  Message(this._message, this._key);

  String encodeOrDecode(bool encode) {
    String treatedMessage;
    if (encode) {
      treatedMessage = message;
    } else {
      treatedMessage = message;
    }
    return treatedMessage;
  }
}

Merci pour vos lumières…

Bon, il me suffisait de poster le message pour voir la lumière ! Je met quand même la solution, peut-être qu’un autre débutant la trouvera utile :grinning_face_with_smiling_eyes:

Il semble qu’ElevatedButton n’accepte pas de paramètres à passer dans une fonction. J’ai donc trouvé un autre moyen de passer les paramètres et modifié le code de mon bouton :

Padding(
                padding: const EdgeInsets.only(top: 20.0),
                child: ElevatedButton(
                  onPressed: _cryptMessage,
                  child: const Text("Chiffrer le message"),
                ),

et miracle, après 2 jours de migraines, j’ai enfin un bouton cliquable :grin:

1 « J'aime »

Bravo pour avoir trouvé la solution :+1:

Voici plus d’explication sur le soucis que tu as rencontré :
Dans ta première version, tu appelles la fonction _cryptMessage au moment où tu crées le bouton et la valeur que tu donnes au parametre onPressed est en réalité le retour de la fonction. Cette fonction ne retourne rien, donc c’est comme si tu avais laissé la propriété onPressed vide.

onPressed attend une fonction en paramètre, et cette fonction ne doit pas elle même recevoir de paramètre. Garde à l’idée qu’elle sera appelée par le bouton lui-même donc il ne saurait pas quels paramètres lui donner. Comme je l’ai dit dans le cours sur Flutter, tu as 2 solutions :

  • soit déclarer la fonction à l’extérieur et lui donner uniquement le nom de cette fonction. Sans écrire les parenthèses sinon tu appelles la fonction :wink:
  • soit déclarer le code de cette fonction sous la forme d’un lambda : () => ou ’() { }

Dans ton cas ça paraissait être la solution la plus simple :

ElevatedButton(
    onPressed: () => _cryptMessage(_key, _message),
    child: const Text("Chiffrer le message"),
),

J’espère avoir pu aider à clarifier ce concept :wink:

Happy coding!

Merci pour ta réponse Maxime, ta solution est bien plus élégante ! J’aurais dû prendre le temps de visionner à nouveau la vidéo qui explique ce concept… Mais au moins ton explication m’aide un peu à clarifier la notion de lambda, qui reste assez conceptuelle pour moi. Je pense que ce sera plus clair au fur et à mesure de la pratique.
Merci :pray:

1 « J'aime »