构建错误期间调用 setState() 或 markNeedsBuild()

whi*_*ear 2 dart flutter

我正在制作 BackBtn 类,该类在该应用程序的许多地方使用。

\n\n

设计是相同的,只是按下时的行为不同。

\n\n

因此,我想在构造函数中传递该函数,该函数在按下按钮时使用。

\n\n

但是它显示以下错误

\n\n
flutter: \xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1 EXCEPTION CAUGHT BY WIDGETS LIBRARY \xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\nflutter: The following assertion was thrown building BackBtn(dirty):\nflutter: setState() or markNeedsBuild() called during build.\nflutter: This Overlay widget cannot be marked as needing to build because the framework is already in the\nflutter: process of building widgets.  A widget can be marked as needing to be built during the build phase\nflutter: only if one of its ancestors is currently building. This exception is allowed because the framework\nflutter: builds parent widgets before children, which means a dirty descendant will always be built.\nflutter: Otherwise, the framework might not visit this widget during this build phase.\nflutter: The widget on which setState() or markNeedsBuild() was called was:\nflutter:   Overlay-[LabeledGlobalKey<OverlayState>#320d3]\nflutter: The widget which was currently being built when the offending call was made was:\nflutter:   BackBtn\n
Run Code Online (Sandbox Code Playgroud)\n\n

这些是我制作的代码。

\n\n
class BackBtn extends StatelessWidget{\n\n  final Function onPressed;  \n  const BackBtn({ Key key ,this.onPressed}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      alignment: Alignment(1.0,-1.0), \n      child: FlatButton(\n        onPressed: onPressed(),      \n        padding: EdgeInsets.all(50),\n        child:  Image.asset('images/BackIcon.png')\n      )\n    );\n  }\n}\n\nBackBtn(\n    onPressed: () => Navigator.push(context,MaterialPageRoute(\n    builder: (context) => MyHomePage())),\n),\n
Run Code Online (Sandbox Code Playgroud)\n

Rob*_*ter 6

onPressed()您在将回调分配给 后就已经执行回调了FlatButton()

尝试删除大括号,如下所示:

class BackBtn extends StatelessWidget{

  final Function onPressed;  
  const BackBtn({ Key key ,this.onPressed}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      alignment: Alignment(1.0,-1.0), 
      child: FlatButton(
        onPressed: onPressed, // Removed the Braces ()      
        padding: EdgeInsets.all(50),
        child:  Image.asset('images/BackIcon.png')
      )
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

太棒了;

当您离开大括号时,它将在构建小部件时立即执行您的 onPressed 处理程序。这意味着您将在构建过程中点击导航器和所有其他内容,而不仅仅是在按下实际按钮时。这会导致你的错误。