Цвет кнопки значка не меняется (трепетание)

#flutter #iconbutton

#трепетание #кнопка значка

Вопрос:

У меня есть виджет текстового поля для поля пароля и кнопка значка для отображения / скрытия пароля. Я хочу, чтобы, когда пользователь нажимает на значок кнопки, он должен менять цвет. На самом деле, когда я запускаю print(showPassWordIconColor) до и после нажатия кнопки значка, ее значение меняется. Однако он не отображает измененный цвет. Я видел некоторые другие вопросы и ответы на них, и я попробовал их, но я все еще получаю ту же проблему. Вот полный виджет. (изначально showPasswordIconColor = Colors.grey)

 Widget passwordField = AppTextFormField(
  obscureText: !_showPassword,
  decoration: InputDecoration(
    hintText: "Password",
    border: OutlineInputBorder(),
    suffixIcon: IconButton(
      icon: Icon(
        Icons.remove_red_eye,
        color: showPasswordIconColor,
      ),
      onPressed: () {
        setState(() {
          _showPassword = !_showPassword;
          if (showPaswswordIconColor == Colors.grey) {
            showPaswswordIconColor = buttonColor;
          } else {
            showPaswswordIconColor = Colors.grey;
          }
          print(showPaswswordIconColor);
        });
      },
    ),
  ),
);
  

Комментарии:

1. где находится метод showPaswswordIconColor?

2. Это переменная типа Color, определенного в верхней части файла. Я могу добраться до него и изменить его в setState(), но отображаемый цвет не меняется.

Ответ №1:

введите описание изображения здесьПожалуйста, проверьте приведенный ниже код.

Затем используйте приведенный ниже код.

 Container(
            width: 200,
            height: 200,
            child: TextFormField(
              obscureText: !_showPassword,
              decoration: InputDecoration(
                hintText: "Password",
                border: OutlineInputBorder(),
                suffixIcon: IconButton(
                  icon: Icon(
                    Icons.remove_red_eye,
                    color: showPasswordIconColor,
                  ),
                  onPressed: () {
                    setState(() {
                      _showPassword = !_showPassword;
                      if (showPasswordIconColor == Colors.grey) {
                        showPasswordIconColor = Colors.red;
                      } else {
                        showPasswordIconColor = Colors.grey;
                      }
                      print(showPasswordIconColor);
                    });
                  },
                ),
              ),
            ),
          )
  

Комментарии:

1. Я уже объявил их как переменные в верхней части файла, и, как я упоминал, я могу получить доступ к этим переменным в моем виджете. Я могу обновить переменные _showPassword и showPasswordIconColor. Но я не могу обновить видимый цвет значка кнопки

2. хорошо, не проверяйте этот код, он уже отредактирован и работает с моим файлом

Ответ №2:

Если вы используете ThemeData, вы можете применить схему, подобную этой.

 inputDecorationTheme: InputDecorationTheme(
        iconColor: MaterialStateColor.resolveWith((Set<MaterialState> states) {
          if (states.contains(MaterialState.focused)) {
            return Colors.green;
          }
          if (states.contains(MaterialState.error)) {
            return Colors.red;
          }
          return Colors.green;
        }
        ),
      )