如何修复 Flutter 构建问题期间调用的 setState

Posted

技术标签:

【中文标题】如何修复 Flutter 构建问题期间调用的 setState【英文标题】:How to fix setState called during build issue in Flutter 【发布时间】:2021-06-09 01:25:42 【问题描述】:

当用户转到详细信息屏幕时,我试图自动打开我的警告对话框,但由于某种原因,我在屏幕中的构建错误期间调用了 setState() 或 markNeedsBuild()(图片)。 如果我能就如何解决此错误获得任何建议或帮助,我将不胜感激。

    return Scaffold(
        appBar: AppBarWidget(
          appBar: AppBar(),
          showReorder: false,
        ),
        body: BaseView<CardViewModel>(
          onDeactivate: (model) ,
          onDispose: (model) ,
          onModelReady: (model) 
            model.getCard();
          ,
          builder: (context, model, child) 
            setState(() 
              isLargeScreen = false;
              if (model.cards.current != true) 
                if (model.cards.alreadyShow == false) 
                  Future.delayed(Duration.zero, () 
                    staticwarningDialog(context);
                  );
                
              
            );
            return _body(model, height, width, context, widget.cardName);
          ,
        ));

【问题讨论】:

【参考方案1】:

您可以像这样将setState 方法移动到initState。记住不要在构建时使用 setState 方法。

@override
void initState() 
   super.initState();
   WidgetsBinding.instance.addPostFrameCallback(
     (_) 
      setState(() 
        // Your code
      );
    ,
   );

【讨论】:

嗨,谢谢你,但如果我将我的 setState 方法移动到 initState 和 build 方法之外,那么我的 model.cards.current 和 model.cards.alreadyShow 会出现错误,因为它说“未定义的名称‘模型’。”知道我应该如何解决这个问题吗? 我不太了解你的model。由于您使用了 builder 方法中的模型,因此您无法从 initState 访问它。请尝试通过执行某些操作从 initState 获取模型。当我不知道如何访问您的 model 代码时,我无能为力。请注意您对“如何从 initState 获取模型?”的问题。将是一个新问题,我认为你需要在你想问的时候开始它。 制作一个新的有状态小部件,将您的模型作为参数传递给它,然后将所有内容移动到它。接下来,您可以关注@ToraCode 写的内容。

以上是关于如何修复 Flutter 构建问题期间调用的 setState的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:在构建期间调用 setState() 或 markNeedsBuild()

在构建期间调用 setState() 或 markNeedsBuild() - Flutter

Flutter - 在构建期间调用 setState() 或 markNeedsBuild()

Flutter :setState() 或 markNeedsBuild() 在构建期间调用

Flutter:在构建错误期间调用了 setState() 或 markNeedsBuild()

Flutter 错误 - 在构建期间调用了 setState() 或 markNeedsBuild()