我在尝试转换我的 StatelessWidget 代码时遇到问题。为啥?

Posted

技术标签:

【中文标题】我在尝试转换我的 StatelessWidget 代码时遇到问题。为啥?【英文标题】:I'm having issues trying to convert my StatelessWidget code..why?我在尝试转换我的 StatelessWidget 代码时遇到问题。为什么? 【发布时间】:2021-10-12 16:49:48 【问题描述】:

我试图在 statelessWidget 类上编写一个有状态小部件来放置一个 bool 和一个 stateState((),(显示或隐藏密码)。所以我关注了一些帖子,上面说解决方案是转换。

我转换了我的课程,但出现了一些错误,也许我应该更新我的代码,但我不知道该怎么做,而且我总是遇到这样的错误:

36:32:错误:没有为类“_RoundedPasswordFieldState”定义设置器“_isSecret”。 -“_RoundedPasswordFieldState”来自“package:yona/Login/Components/rounded_pa​​ssword_field.dart”(“lib/Login/Components/rounded_pa​​ssword_field.dart”)。 尝试将名称更正为现有 setter 的名称,或定义名为“_isSecret”的 setter 或字段。

你能帮帮我吗? 问题解决了,这是新代码

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


【问题讨论】:

问题解决: 【参考方案1】:

要访问_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),
       ),
     ),
   ),
 );


【讨论】:

我是这样写的,但是我有这个错误:无法通过实例访问静态字段“_isSecret”。尝试使用“RoundedPasswordField”类来访问该字段。 为什么会有静电?删除它。 如果我不提出这个建议是颤振推荐的,我到处都有错误,尤其是在const RoundedPasswordField 我有这个错误“无法为具有非最终字段的类定义 const 构造函数。尝试将所有字段设为最终字段,或从构造函数中删除关键字 'const'。" flutter 不推荐。我编辑了我的答案,看看。将其下移到小部件级别,并在本地声明它,因为您不是从顶部依赖它。 非常感谢您的宝贵时间!现在一切正常!你是一个节省者【参考方案2】:

在 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),
          ),
        ),
      ),
    );
  


【讨论】:

以上是关于我在尝试转换我的 StatelessWidget 代码时遇到问题。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从 StatelessWidget 传递到 StatefulWidget?

Flutter:如何将变量从 StatelessWidget 传递到 StatefulWidget

StatelessWidget:类只能扩展其他类。dart(extends_non_class) - 问题

StatefulWidget 和 StatelessWidget 的 Flutter 性能

调度第一个 bloc 事件或 cubit 方法,在 StatelessWidget 内的页面开始

Function 或 StatelessWidget 哪个最好? [复制]