Есть ли у setState () какие-либо ограничения в отношении обновления пользовательского интерфейса? - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь обновить TextField, чтобы показать текст ошибки, пока электронная почта не будет проверена внешним validators пакетом.Однако пользовательский интерфейс не обновляется, хотя я вызываю setState из метода сборки.Я попытался отладить, используя операторы print (скриншот прилагается), и поведение такое, как и ожидалось.Почему тогда пользовательский интерфейс не обновляется, показывая TextField с текстом ошибки под ним, если я пытаюсь передать обновленный TextField пользовательский интерфейс в setState()?

код, который работает

Code that does work

Код, который не работает

                    child:  TextField(
                      decoration: InputDecoration(
                          hintText: "Enter Email Id",
                          border: OutlineInputBorder()),
                      onChanged: (String value) {
                        emailId = value;
                        setState(() {
                          isEmail(value)
                              ? print("true")
                              : TextField(
                                  decoration: InputDecoration(
                                      errorText: "Enter valid email"),
                                );
                        });
                      },

1 Ответ

1 голос
/ 30 мая 2019

Ваш код не работает, потому что вы не меняете состояние родительского виджета внутри его onChanged: собственности. Вы создаете новый виджет в заданном состоянии

child: TextField( //parent
      decoration: InputDecoration(
      hintText: "Enter Email Id",
      border: OutlineInputBorder()),
              onChanged: (String value) {
              emailId = value;
              setState(() {
                 isEmail(value)
                    ? print("true")
                    : TextField( //this is not the same widget.
                        decoration: InputDecoration(
                         errorText: "Enter valid email"),
                     );
                    });
                  },

Вы можете решить эту проблему, объявив String invalidEmailError и установив для errorText свойство TextField. Позже обновите эту строку, чтобы получить желаемый результат.

TextField(
      decoration: InputDecoration(
      hintText: "Enter Email Id",
          errorText: invalidEmailError,
          border: OutlineInputBorder()),
          onChanged: (String value) {
          emailId = value;
        setState(() {
            isEmail(value)
                ? invalidEmailError = null
                : invalidEmailError = "Enter valid email";
        });
      },
      )
...