Android 设置状态不';不要改变TextField的装饰
当OnSubmited方法调用时,我想更改TextField的修饰,在setState中,当我调用返回InputDecoration的函数时,它不会更改TextField的修饰Android 设置状态不';不要改变TextField的装饰,android,flutter,mobile,dart,flutter-layout,Android,Flutter,Mobile,Dart,Flutter Layout,当OnSubmited方法调用时,我想更改TextField的修饰,在setState中,当我调用返回InputDecoration的函数时,它不会更改TextField的修饰 class CustomTextField extends StatefulWidget { final TextEditingController controller; final IconData icon; final String textLabel; final TextInputType t
class CustomTextField extends StatefulWidget {
final TextEditingController controller;
final IconData icon;
final String textLabel;
final TextInputType textInputType;
CustomTextField(
this.controller, this.icon, this.textLabel, this.textInputType);
@override
_CustomTextFieldState createState() => _CustomTextFieldState();
}
class _CustomTextFieldState extends State<CustomTextField> {
InputDecoration inputDecoration;
double a = 0;
bool b = true;
@override
Widget build(BuildContext context) {
inputDecoration = noramlInputDecoration(context, widget.textLabel, Icon(widget.icon));
return Container(
margin: EdgeInsets.only(top: responsiveHeight(context, 0.8)),
child: TextField(
onSubmitted: (mahdi) {
print('adfaf');
setState(() {
inputDecoration = noramlInputDecoration(
context, widget.textLabel, Icon(widget.icon));
});
a++;
print(a);
},
decoration: inputDecoration,
onTap: () {},
toolbarOptions: ToolbarOptions(
paste: true,
copy: true,
cut: true,
selectAll: true,
),
cursorWidth: 2,
style: TextStyle(
fontSize: responsiveWidthGivenWidth(
responsiveWidth(context, 81.6) / 10, 53.3),
height: 0.5),
controller: widget.controller,
maxLines: 1,
obscureText: b,
showCursor: true,
textAlign: TextAlign.end,
textDirection: TextDirection.ltr,
keyboardType: widget.textInputType,
inputFormatters: [],
),
);
}
}
实际上,我想检查用户是否正确填写文本字段,如果没有,则通过更改文本字段的装饰来警告他们
class CustomTextField extends StatefulWidget {
final TextEditingController controller;
final IconData icon;
final String textLabel;
final TextInputType textInputType;
CustomTextField(
this.controller, this.icon, this.textLabel, this.textInputType);
@override
_CustomTextFieldState createState() => _CustomTextFieldState();
}
class _CustomTextFieldState extends State<CustomTextField> {
InputDecoration inputDecoration;
double a = 0;
bool b = true;
@override
Widget build(BuildContext context) {
inputDecoration = noramlInputDecoration(context, widget.textLabel, Icon(widget.icon));
return Container(
margin: EdgeInsets.only(top: responsiveHeight(context, 0.8)),
child: TextField(
onSubmitted: (mahdi) {
print('adfaf');
setState(() {
inputDecoration = noramlInputDecoration(
context, widget.textLabel, Icon(widget.icon));
});
a++;
print(a);
},
decoration: inputDecoration,
onTap: () {},
toolbarOptions: ToolbarOptions(
paste: true,
copy: true,
cut: true,
selectAll: true,
),
cursorWidth: 2,
style: TextStyle(
fontSize: responsiveWidthGivenWidth(
responsiveWidth(context, 81.6) / 10, 53.3),
height: 0.5),
controller: widget.controller,
maxLines: 1,
obscureText: b,
showCursor: true,
textAlign: TextAlign.end,
textDirection: TextDirection.ltr,
keyboardType: widget.textInputType,
inputFormatters: [],
),
);
}
}
正如@Ryosuke在问题的评论中所说,我不应该在build方法中使用setState(),因为每次调用setState()时,它都卡在循环中,总是调用build()方法。
setState()
调用build方法。因此,您在setState
内部分配给inputDecoration
的值将被您在build
的第一行中分配给它的值覆盖。因此,请尝试将您的初始inputDecoration
作业从build
移动到build
之外的某个地方,最好是在initState
内部。哦,我现在明白了,我照您说的做,现在就可以了。非常感谢。