TextFormField:在构建过程中调用的setState()或markNeedsBuild()

时间:2019-01-02 11:34:05

标签: dart flutter

我正在尝试将首次按钮设置为禁用,并且当用户输入金额时将其启用,按钮禁用可以正常工作,但是当我在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,
)                                  

1 个答案:

答案 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: () {...}看起来很相似,但是不会更新小部件的状态。