我正在尝试将首次按钮设置为禁用,并且当用户输入金额时将其启用,按钮禁用可以正常工作,但是当我在TextFormField中输入金额时,它给出以下错误。
I/flutter (29519): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY
╞═══════════════════════════════════════════════════════════
I/flutter (29519): The following assertion was thrown building
TextFormField(dirty, state: _TextFormFieldState#b89da):
I/flutter (29519): setState() or markNeedsBuild() called during build.
I/flutter (29519): This HomePage widget cannot be marked as needing to
build because the framework is already in the
I/flutter (29519): process of building widgets. A widget can be marked as
needing to be built during the build phase
I/flutter (29519): only if one of its ancestors is currently building.
This exception is allowed because the framework
I/flutter (29519): builds parent widgets before children, which means a
dirty descendant will always be built.
I/flutter (29519): Otherwise, the framework might not visit this widget
during this build phase.
I/flutter (29519): The widget on which setState() or markNeedsBuild() was
called was:
我的代码:
var _onPressed;
if (isButtonDisabled) {
_onPressed = () {
print("Hello");
};
}
TextFormField代码:
child: TextFormField(
decoration: InputDecoration(
contentPadding: EdgeInsets.only(
left: 12.0,
right: 12.0,
top: 12.0,
bottom: 12.0
),
labelText: 'Enter amount',
hintText: 'Enter amount',
hintStyle: TextStyle(
color: Colors.red,
fontSize: 14.0
),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(0.0)
),
),
keyboardType: TextInputType.number,
autovalidate: true,
validator: (String txt) {
if (txt.length == 2) {
setState(() {
isButtonDisabled = true;
});
} else {
setState(() {
isButtonDisabled = false;
});
}
}
),
按钮代码:
FlatButton(
child: Text("Confirm"),
onPressed: _onPressed,
)
答案 0 :(得分:3)
从{p>删除setState
if (txt.length == 2){
setState((){
isButtonDisabled = true;
});
} else {
setState((){
isButtonDisabled = false;
});
}}),
到
if (txt.length == 2){
isButtonDisabled = true;
} else {
isButtonDisabled = false;
}}),
仅当您传递类似的函数
时,才需要在setState()
中直接执行的代码中无需调用build()
onPressed: () {
// code here is not executed in `build()`,
it's just passed to `onPressed` to be executed when the button is tapped
// therefore here `setState()` is required for state changes
}
validator: () {...}
看起来很相似,但是不会更新小部件的状态。