J'ai un code simple comme ci-dessous:
void processCoupon() async { try { if (_terms) { print("processing mobile number !"); var data = {"mobile": _authModel.mobile}; ApiCall().postData(data, cApi).then((result) { print(result); if (result["data"] != null) { print(result["data"]["otp"]); setState(() { otp = result["data"]["otp"].toString(); }); } }); } else { print("terms not agreed !"); } } catch (e) { print(e); } }
maintenant j'appelle une api à partir d'une fonction où l' api
donne un otp et qui doit être affiché dans le TextFieldInput
qui ne s'affiche pas du tout! mais il est affiché dans un Text Widget
. Quel peut être le problème.
TextFormField( initialValue: otp ?? "", ), SizedBox(height: getProportionateScreenHeight(20.0)), Text(otp ?? ""), SizedBox(height: getProportionateScreenHeight(20.0)),
4 Réponses :
setState(() { otp = result["data"]["otp"].toString(); _editingController.text=otp; });
TextEditingController
pour votre TextField
:void processCoupon() async { try { if (_terms) { print("processing mobile number !"); var data = {"mobile": _authModel.mobile}; ApiCall().postData(data, cApi).then((result) { print(result); if (result["data"] != null) { print(result["data"]["otp"]); setState(() { otp = result["data"]["otp"].toString(); // set the otp to be the text the controller has controller.text = otp; // new line }); } }); } else { print("terms not agreed !"); } } catch (e) { print(e); } }
controller
à votre TextField
:TextFormField( initialValue: otp ?? "", // assign the controller to the TextField controller: controller, // new line ), SizedBox(height: getProportionateScreenHeight(20.0)), Text(otp ?? ""), SizedBox(height: getProportionateScreenHeight(20.0)),
otp
à la propriété Text
du controller
:// create a controller for the TextField TextEditingController controller = TextEditingController();
Je suppose que InitialValue n'est utilisé que dans la première construction, après la mise à jour avec un TextController.
Déclarer:
setState(() { otpController.text = result["data"]["otp"].toString(); });
Ajoutez le contrôleur à votre TextFormField:
controller: otpController,
Mettez à jour le texte:
var otpController = TextEditingController();
Je connais la façon dont nous pouvons utiliser le TextController
à cette fin, mais le problème est que le formulaire est assez long et c'est là que nous ne pouvons pas utiliser cette méthode car un objet doit être utilisé. le problème était que leur inital value can be passed
mais lorsque nous essayons de mettre à jour cette valeur, pour refléter la valeur, nous devons également mettre à jour la clé afin que le inputfield
soit également mis à jour. Je viens d'ajouter la valeur ci-dessous et voila! tout fonctionne maintenant bien.
TextFormField( key: Key(otp), <--- this line was added initialValue: otp ?? "", ), SizedBox(height: getProportionateScreenHeight(20.0)), Text(otp ?? ""), SizedBox(height: getProportionateScreenHeight(20.0)),
ce que vous obtenez
print(result["data"]["otp"]);
?le numéro otp.