我正在尝试将首次按钮设置为禁用,并且当用户输入金额时将其启用,按钮禁用效果很好,但是当我在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:
Run Code Online (Sandbox Code Playgroud)
我的代码:
var _onPressed;
if (isButtonDisabled) {
_onPressed = () {
print("Hello");
};
}
Run Code Online (Sandbox Code Playgroud)
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;
});
}
}
),
Run Code Online (Sandbox Code Playgroud)
按钮代码:
FlatButton(
child: Text("Confirm"),
onPressed: _onPressed,
)
Run Code Online (Sandbox Code Playgroud)
setState从中删除
if (txt.length == 2){
setState((){
isButtonDisabled = true;
});
} else {
setState((){
isButtonDisabled = false;
});
}}),
Run Code Online (Sandbox Code Playgroud)
至
if (txt.length == 2){
isButtonDisabled = true;
} else {
isButtonDisabled = false;
}}),
Run Code Online (Sandbox Code Playgroud)
仅当您传递如下函数时,才需要调用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
}
Run Code Online (Sandbox Code Playgroud)
validator: () {...} 看起来很相似,但是不会更新小部件的状态。
| 归档时间: |
|
| 查看次数: |
2323 次 |
| 最近记录: |