setState方法后Flutter TextFieldInput值未更新

时间:2020-11-12 14:07:40

标签: flutter dart input-field

我有一个简单的代码,如下所示:

 TextFormField(
                      initialValue: otp ?? "",
                    ),
                    SizedBox(height: getProportionateScreenHeight(20.0)),
                    Text(otp ?? ""),
                    SizedBox(height: getProportionateScreenHeight(20.0)),

现在我正在从api给出otp的函数中调用api,而该函数需要显示在TextFieldInput中,而根本没有显示!但以Text Widget显示。可能是什么问题。

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);
    }
  }

4 个答案:

答案 0 :(得分:0)

list1
list2
list3
.
.
.
list30

更改

list2env(df_list, globalenv())

df_list 

更改

TextFormField(
                  initialValue: otp ?? "",
                ),

答案 1 :(得分:0)

  1. 为您的TextEditingController创建一个TextField
  // create a controller for the TextField
  TextEditingController controller = TextEditingController();
  1. controller分配给您的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)),
  1. otp字符串分配给Text的{​​{1}}属性:
controller

答案 2 :(得分:0)

在您应该使用TextController更新之后,我假定InitialValue仅在第一个结构中使用。

声明:

var otpController = TextEditingController();

将控制器添加到您的TextFormField:

controller: otpController,

更新文本:

setState(() {
    otpController.text = result["data"]["otp"].toString();
});

答案 3 :(得分:0)

我知道可以为此目的使用TextController的方式,但是问题是表单相当冗长,这就是我们不能使用此方法的地方,因为需要使用对象。问题是它们inital value can be passed,但是当我们尝试更新该值时,为了反映该值,我们还需要更新密钥,以便inputfield也将更新。我刚刚添加了以下值,瞧!现在一切正常。

TextFormField(

key: Key(otp), <--- this line was added
                      initialValue: otp ?? "",
                    ),
                    SizedBox(height: getProportionateScreenHeight(20.0)),
                    Text(otp ?? ""),
                    SizedBox(height: getProportionateScreenHeight(20.0)),