Pré-remplir un formulaire avec controller

Bonjour à tous,

Je suis actuellement en train de faire le formulaire pour modifier un élément dans la base de données de mon application. J’aimerais pré-remplir les champs avec la valeur actuelle. Problème, je ne peux pas avoir à la fois une valeur initiale et un contrôleur. Une idée pour régler le problème ? Je vous poste la partie du code qui me pose problème.

Merci pour vos retours. :grin:

final modelController = TextEditingController();

@override
void dispose() {
  modelController.dispose();
  super.dispose();
}

@override
Widget build(BuildContext context) {
  return Form(
    key: _carUpdateFormKey,
    child: Column(
      children: [
        Row(
          children: [
            Expanded(
              child: Padding(
                padding:
                    const EdgeInsets.symmetric(horizontal: 8, vertical: 16),
                child: TextFormField(
                  initialValue: widget.vehicle.model,
                  decoration: InputDecoration(
                    border: const OutlineInputBorder(
                        borderRadius:
                            BorderRadius.all(Radius.circular(50.0))),
                    //helperText: S.of(context).helperTextModel,
                    hintText: S.of(context).hintTextModel,
                  ),
                  keyboardType: TextInputType.text,
                  validator: (value) => value!.length > 3
                      ? null
                      : S.of(context).errorTextModel,
                ),
              ),
            ),
          ],
        ),
      ],
    ),
  );
}

Bonjour Julien,

En utilisant l’initState, tu peux pré-remplir ton formulaire:

@override
  void initState() {
    modelController = "Ma valeur";
    super.initState();
  }

Par contre, je pense qu’il faut enlever le mot-clé « final » pour ta variable.

Fabien

Bonsoir Fabien.
Merci beaucoup je vais tester ça :grin:

Bonjour,

après vérification, tu dois pouvoir laisser le mot clé final… :face_with_thermometer:

Petite modification:

@override
  void initState() {
    modelController.text = "Ma valeur";
    super.initState();
  }
1 « J'aime »

Hello, je reviens un peu sur ce qui est dit pour prendre les bonnes habitudes
Si jamais tu veux pré-remplir avec une valeur fixe, tu peux simplement le définir dans la déclaration de ton controller :

final modelController = TextEditingController(text : "Ma valeur par défaut");

Cette méthode simplifie l’écrture de :

final modelController = TextEditingController();
String defaultValue = "Ma valeur par défaut";

@override
  void initState() {
    super.initState();
    modelController.text = defaultValue;
  }

Sinon si tu récupère une valeur par défaut depuis une api :

final modelController = TextEditingController();

@override
  void initState() {
    super.initState();
    initDefaultValue();
  }

void initDefaultValue() async {
  await HttpApi.getDefaultValue().then((value) {
    if(value != null){
      setState((){
        modelController.text = value;
      });
    }
  };
}
1 « J'aime »

Oui je devais récupérer la valeur c’est pour ça que je ne pouvais pas le pré-remplir lors de la déclaration. Mais ça fonctionne maintenant merci pour vos réponses et conseils :pray::grin:

1 « J'aime »