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");
}