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?
3 Réponses :
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.
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),
);
}
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
Regarder votre code
widget.initialvaluesemble être une propriété du StatefulWidget. Pouvez-vous placer cela comme variable dans_StateFormBuilderDropdownStateet 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ètreinitialvaluen'est utilisé que surinitState code>. 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
DropDownButtonde base expose une propriétévaluequi 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.FormBuilderDropdownprend-il une sorte de contrôleur? Si oui, oui@ RémiRousselet: ça ne marche pas :(