代码之家  ›  专栏  ›  技术社区  ›  Pradnya Bhagat

textformField:在生成期间调用了setState()或markNeedsBuild()。

  •  1
  • Pradnya Bhagat  · 技术社区  · 6 年前

    我试图将第一次按钮设置为禁用,当用户输入启用的金额时,按钮禁用可以正常工作,但当我在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");
      };
    }
    

    文本表单域代码:

    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 回复  |  直到 6 年前
        1
  •  2
  •   Günter Zöchbauer    6 年前

    去除 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: () {...} 看起来类似,但不更新小部件的状态。