我在尝试转换我的 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_password_field.dart”(“lib/Login/Components/rounded_password_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 性能