1
votes

Comment changer la valeur sélectionnée de FormBuilderDropdown à l'aide de setState?

J'ai la FormBuilderDropdown suivante de la définition de flutter_form_builder pour que l'utilisateur sélectionne l'état américain

class _StateFormBuilderDropdownState extends State<StateFormBuilderDropdown> {
  @override
  Widget build(BuildContext context) {
    return FormBuilderDropdown(
      attribute: widget.attribute,
      initialValue: widget.initialValue,
      validators: [FormBuilderValidators.required()],
      decoration: InputDecoration(labelText: "State (required)"),
      hint: Text('Select State'),
      items: List<DropdownMenuItem>.from(
        UsStates.states.map((s) => DropdownMenuItem(
          value: s.code, child: Text(s.name)
        ))
      ),
      onChanged: widget.onChanged
    );
  }
}

Quand j'arrive à cet écran, je faire un géocodage inversé pour remplir automatiquement l'adresse de l'utilisateur.

Lorsque l'adresse est résolue, j'appelle setState pour changer les valeurs du formulaire. Le problème est que FormBuilderDropdown n'a que initialValue disponible pour définir la valeur et, pour autant que je sache, cela n'est pas évalué à nouveau après la première construction, donc je ne peux pas l'utiliser pour changer la valeur.

Comment puis-je changer FormBuilderDropdown après la configuration initiale?


7 commentaires

Regarder votre code widget.initialvalue semble être une propriété du StatefulWidget. Pouvez-vous placer cela comme variable dans _StateFormBuilderDropdownState et vérifier.


J'ai installé le package et testé le widget FormBuilderDropdown , et il définit automatiquement la valeur sélectionnée dans la liste déroulante. Si vous devez utiliser cette valeur ailleurs, vous devez prendre if de onChanged et la transmettre.


@Abhilash Chandran: Je ne pense pas que cela fera une différence, si vous vérifiez le code de FormBuilderDropdown , le paramètre initialvalue n'est utilisé que sur initState . Ce code n'est pas exécuté sur chaque build mais sur le premier


@ João Soares: le problème n'est pas d'extraire la valeur de la liste déroulante sélectionnée mais de la modifier par programme en utilisant setState


@StackOverflower vous avez raison. semble que le générateur de formulaires ne réinitialise pas cette valeur. Cependant, le DropDownButton de base expose une propriété value qui peut être réinitialisée pour y parvenir. Si vous êtes intéressé, je partagerai le code qui utilise également le package du fournisseur pour intimer une reconstruction de changement d'état.


FormBuilderDropdown prend-il une sorte de contrôleur? Si oui, oui


@ RémiRousselet: ça ne marche pas :(


3 Réponses :


0
votes

Pourquoi ne pas utiliser Keys pour forcer Flutter à réinitialiser le FormBuilderDropdown ? Le simple ajout de key: const Key (widget.initialValue.toString ()) devrait faire en sorte que FormBuilderDropdown passe par initState à chaque fois widget.initialValue change, comme s'il s'agissait d'un tout nouveau widget.


0 commentaires

0
votes

Vous pouvez utiliser ValueListenableBuilder pour reconstruire FormBuilderDropdown lorsque la valeur change.

  ValueNotifier notifier;

  @override
  Widget build(BuildContext context) {
    return ValueListenableBuilder(
      valueListenable: notifier,
      builder: FormBuilderDropdown(
          attribute: widget.attribute,
          initialValue: notifier.value,
          validators: [FormBuilderValidators.required()],
          decoration: InputDecoration(labelText: "State (required)"),
          hint: Text('Select State'),
          items: List<DropdownMenuItem>.from(UsStates.states.map(
              (s) => DropdownMenuItem(value: s.code, child: Text(s.name)))),
          onChanged: (value) => notifier.value = value),
    );
  }


0 commentaires

1
votes

Je pense que vous pouvez utiliser UniqueKey (). Dans mon cas, je dois réinitialiser par programmation la valeur de formbuildercheckboxlist si vous utilisez initialValue .

Je l'ai posté sur un autre post


0 commentaires