Flutter 在生成-颤振期间调用setState()或markNeedsBuild()

Flutter 在生成-颤振期间调用setState()或markNeedsBuild(),flutter,dart,state,builder,Flutter,Dart,State,Builder,我得到这个错误。调试控制台中可能发生错误的包的链接是ResponsiveSafeArea类的builder函数,如下所示 ══╡ WIDGETS库捕获到异常╞═══════════════════════════════════════════════════════════ 在生成LayoutBuilder时引发了以下断言: 在生成过程中调用setState()或markNeedsBuild()。 无法将此_ModalScope小部件标记为需要构建,因为框架是 已经在构建小部件的过程中。可以将

我得到这个错误。调试控制台中可能发生错误的包的链接是
ResponsiveSafeArea
类的builder函数,如下所示

══╡ WIDGETS库捕获到异常╞═══════════════════════════════════════════════════════════
在生成LayoutBuilder时引发了以下断言:
在生成过程中调用setState()或markNeedsBuild()。
无法将此_ModalScope小部件标记为需要构建,因为框架是
已经在构建小部件的过程中。可以将小部件标记为需要在
构建阶段仅在其祖先之一当前正在构建时进行。此例外是允许的
因为框架在子部件之前构建父部件,这意味着脏的子部件将
总是要建造。否则,框架可能不会在构建阶段访问此小部件。
调用setState()或markNeedsBuild()的小部件是:
_ModalScope-[LabeledGlobalKey#e51b7]
发出违规呼叫时当前正在构建的小部件是:
布局生成器
下面是导致错误的类

类custsignenview扩展StatefulWidget{
@凌驾
_CustSigninViewState createState()=>_CustSigninViewState();
}
类_CustSigninViewState扩展状态{
最终TextEditingController_phNoController=TextEditingController();
@凌驾
小部件构建(构建上下文){
final deviceSize=MediaQuery.of(context).size;
bool tempBool=true;响应安全区域(
生成器:(上下文,widgetSize)=>Scaffold(
主体:材料(
类型:MaterialType.card,
子:堆栈(
儿童:[
ListView(//ListView
//-----我在下面的线路上得到了E R O R。
坦普尔
?UIHelper().showErrorButtomSheet(上下文,“errorText”))
:Container(),
],
),
),
),
),
);
}
}
如果我将
UIHelper().batherRorButtomSheet(上下文,“errorText”)
替换为
Container()
内部的tempBool条件,它就可以正常工作。
UIHelper().showErrorButtomSheet(上下文,“errorText”))有问题。

下面是
UIHelper
类中的
showerrorbutomsheet
函数

///返回一个错误对话框
Future ButterRorButtomSheet(构建上下文上下文,字符串errorText){
Size deviceSize=MediaQuery.of(context).Size;
返回showModalBottomSheet(
上下文:上下文,
生成器:(上下文)=>容器(
孩子:州建设者(
生成器:(BuildContext上下文,StateSetter StateSetter){
返回行(
儿童:[
图标(…),
案文(……),
),
],
);
},
),
),
);
}
ResponsiveSafeArea
类看起来像这样。单击调试控制台中的错误包链接时重定向到生成器函数

typedef Responsive_Builder = Widget Function(
  BuildContext context,
  Size,
);

class ResponsiveSafeArea extends StatelessWidget {
  final Responsive_Builder responsiveBuilder;

  const ResponsiveSafeArea({
    Key key,
    @required Responsive_Builder builder,
  })  : responsiveBuilder = builder,
        super(key: key);

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: LayoutBuilder(
        builder: (context, constraints) {
          return responsiveBuilder(
            context,
            constraints.biggest,
          );
        },
      ),
    );
  }
}
您试图显示的
showModalBottomSheet
不能像其他小部件一样显示。我建议您使用自定义小部件显示下面的
errorText
lie:

Widget showErrorWidget(BuildContext context, String errorText) {
    return Row(
      children: <Widget>[
        Icon(Icons.error),
        Text(errorText),
      ],
    );
  }
要显示对话框,您必须处理一个事件以实现此目的,例如在布局事件之后:

if(!tempBool)
     Container(), // We display this container when tempBool is false, else we display the dialog
@override
  void initState() {
    WidgetsBinding.instance.addPostFrameCallback((_) => _afterLayout(context));
    super.initState();
...
}

_afterLayout(BuildContext context) async {
    if(tempBool)
        await UIHelper().showErrorButtomSheet(context, "errorText");
}
最后添加afterLayout事件:

if(!tempBool)
     Container(), // We display this container when tempBool is false, else we display the dialog
@override
  void initState() {
    WidgetsBinding.instance.addPostFrameCallback((_) => _afterLayout(context));
    super.initState();
...
}

_afterLayout(BuildContext context) async {
    if(tempBool)
        await UIHelper().showErrorButtomSheet(context, "errorText");
}
您试图显示的
showModalBottomSheet
不能像其他小部件一样显示。我建议您使用自定义小部件显示下面的
errorText
lie:

Widget showErrorWidget(BuildContext context, String errorText) {
    return Row(
      children: <Widget>[
        Icon(Icons.error),
        Text(errorText),
      ],
    );
  }
要显示对话框,您必须处理一个事件以实现此目的,例如在布局事件之后:

if(!tempBool)
     Container(), // We display this container when tempBool is false, else we display the dialog
@override
  void initState() {
    WidgetsBinding.instance.addPostFrameCallback((_) => _afterLayout(context));
    super.initState();
...
}

_afterLayout(BuildContext context) async {
    if(tempBool)
        await UIHelper().showErrorButtomSheet(context, "errorText");
}
最后添加afterLayout事件:

if(!tempBool)
     Container(), // We display this container when tempBool is false, else we display the dialog
@override
  void initState() {
    WidgetsBinding.instance.addPostFrameCallback((_) => _afterLayout(context));
    super.initState();
...
}

_afterLayout(BuildContext context) async {
    if(tempBool)
        await UIHelper().showErrorButtomSheet(context, "errorText");
}