У меня возникают проблемы с преобразованием кода StatelessWidget..почему?

avatar
flowey
8 августа 2021 в 20:28
73
2
2

Я пытался закодировать виджет с сохранением состояния в классе statelessWidget, чтобы поместить логическое значение и stateState((), (показать или скрыть пароль). Поэтому я проследил за сообщением, в котором говорилось, что решение заключается в преобразовании.

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

36:32: Ошибка: установщик "_isSecret" не определен для класса "_RoundedPasswordFieldState". -'_RoundedPasswordFieldState' взят из 'package:yona/Login/Components/rounded_password_field.dart' ('lib/Login/Components/rounded_password_field.dart'). Попробуйте изменить имя на имя существующего установщика или определить установщик или поле с именем «_isSecret».

Можете ли вы мне помочь? Проблема решена, это новый код

class _RoundedPasswordFieldState extends State<RoundedPasswordField> {
bool _isSecret = true;

@override
Widget build(BuildContext context) {
 return TextFieldContainer(
   child: TextFormField(
     obscureText: _isSecret,
     decoration: InputDecoration(
       hintText: "Password",
       border: InputBorder.none,
       icon: Icon(
         Icons.lock,
         color: DarkTurquoise,
       ),
       suffixIcon: InkWell(
         onTap: () =>
             setState(() => _isSecret = !_isSecret),
         child: Icon(!_isSecret
             ? Icons.visibility
             : Icons.visibility_off, color: DarkTurquoise),
       ),
     ),
   ),
 );
}
}
Источник
flowey
8 августа 2021 в 21:48
0

Проблема устранена:

Ответы (2)

avatar
Sajad Abdollahi
8 августа 2021 в 21:38
0

в setState вы должны изменить _isSecret на RoundedPasswordField._isSecret, а другая проблема заключается в том, что вы не вызываете onChanged.

рабочий код:

class RoundedPasswordField extends StatefulWidget {
static bool _isSecret = true;
final ValueChanged<String> onChanged;

const RoundedPasswordField({
 required this.onChanged,
 Key? key,
}) : super(key: key);

@override
_RoundedPasswordFieldState createState() => _RoundedPasswordFieldState();
}


class _RoundedPasswordFieldState extends State<RoundedPasswordField> {
@override
Widget build(BuildContext context) {
 return TextFieldContainer(
   child: TextFormField(
     obscureText: RoundedPasswordField._isSecret,
     onChanged: widget.onChanged,
     decoration: InputDecoration(
       hintText: "Password",
       icon: Icon(
         Icons.lock,
         color: DarkTurquoise,
       ),
       suffixIcon: InkWell(
         onTap: () =>
             setState(() => RoundedPasswordField._isSecret = !RoundedPasswordField._isSecret),
         child: Icon(!RoundedPasswordField._isSecret
             ? Icons.visibility
             : Icons.visibility_off),
       ),
     ),
   ),
 );
}
}

Если вы не хотите изменять _isSecret снаружи вашего виджета, просто используйте этот код


class RoundedPasswordField extends StatefulWidget {
  final ValueChanged<String> onChanged;

  const RoundedPasswordField({
    required this.onChanged,
    Key? key,
  }) : super(key: key);

  @override
  _RoundedPasswordFieldState createState() => _RoundedPasswordFieldState();
}

class _RoundedPasswordFieldState extends State<RoundedPasswordField> {
  bool _isSecret = true;
  @override
  Widget build(BuildContext context) {
    return TextFieldContainer(
      child: TextFormField(
        obscureText: _isSecret,
        onChanged: widget.onChanged,
        decoration: InputDecoration(
          hintText: "Password",
          icon: Icon(
            Icons.lock,
            color: DarkTurquoise,
          ),
          suffixIcon: InkWell(
            onTap: () => setState(() => _isSecret =
                !_isSecret),
            child: Icon(!_isSecret
                ? Icons.visibility
                : Icons.visibility_off),
          ),
        ),
      ),
    );
  }
}

avatar
Huthaifa Muayyad
8 августа 2021 в 20:32
0

Для доступа к _isSecret необходимо использовать widget.:

class RoundedPasswordField extends StatefulWidget {
final ValueChanged<String> onChanged;

const RoundedPasswordField({
 required this.onChanged,
 Key? key,
}) : super(key: key);

@override
_RoundedPasswordFieldState createState() => _RoundedPasswordFieldState();
}


class _RoundedPasswordFieldState extends State<RoundedPasswordField> {

bool _isSecret = true;

@override
Widget build(BuildContext context) {
 return TextFieldContainer(
   child: TextFormField(
     obscureText:_isSecret,
     decoration: InputDecoration(
       hintText: "Password",
       icon: Icon(
         Icons.lock,
         color: DarkTurquoise,
       ),
       suffixIcon: InkWell(
         onTap: () =>
             setState(() => _isSecret = !_isSecret),
         child: Icon(!_isSecret
             ? Icons.visibility
             : Icons.visibility_off),
       ),
     ),
   ),
 );
}
}
flowey
8 августа 2021 в 20:42
0

Я написал так, но у меня есть эта ошибка: к статическому полю '_isSecret' нельзя получить доступ через экземпляр. Попробуйте использовать класс RoundedPasswordField для доступа к полю.

Huthaifa Muayyad
8 августа 2021 в 20:46
0

Почему у тебя статика? Убери это.

flowey
8 августа 2021 в 20:56
0

Это было рекомендовано флаттером, если я не укажу это, у меня везде есть ошибки, особенно в const RoundedPasswordField. У меня есть эта ошибка «Невозможно определить конструктор const для класса с нефинальными полями. Попробуйте сделать все поля окончательными, или удаление ключевого слова const из конструктора».

Huthaifa Muayyad
8 августа 2021 в 21:00
0

Это не рекомендуется флаттером. Я отредактировал свой ответ, проверьте его. Переместите его вниз на уровень виджета и объявите локально, потому что вы не зависите от него сверху.

flowey
8 августа 2021 в 21:11
0

Что вы подразумеваете под объявлением локально? Я последовал за вами, редактируя ответ, но все еще имею красный подчеркнутый код в разделе _isSecret с этими ошибками: «Установщик« _isSecret »не определен для типа« RoundedPasswordField ». Попробуйте импортировать библиотеку, которая определяет« _isSecret », исправив имя на имя существующий установщик или определение установщика или поля с именем «_isSecret».

Huthaifa Muayyad
8 августа 2021 в 21:13
0

удалите widget. в вашем setState.

flowey
8 августа 2021 в 21:33
0

это сработало для _isSecret в моем setState, у меня осталось 3 ошибки с моим !Rounded passwordfield._isSecret Я пытался удалить поле Roundedpassword, и мой код работает, но функция показывает или скрывает пароль с видимостью значка не работает

Huthaifa Muayyad
8 августа 2021 в 21:35
0

удалите RoundedPasswordField из вашего setState, а затем он вам не нужен.

Huthaifa Muayyad
8 августа 2021 в 21:37
0

Я отредактировал свой ответ, просто скопируйте его как есть, и он будет работать. Читайте документацию, вам нужно понимать эти вещи.

flowey
8 августа 2021 в 21:40
1

Большое вам спасибо за ваше время ! Все работает прямо сейчас!! Вы спаситель

Huthaifa Muayyad
8 августа 2021 в 21:41
0

Пожалуйста, отметьте это как правильный ответ на ваш пост.