微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当小部件树被锁定时调用 setState() 或 markNeedsBuild()

如何解决当小部件树被锁定时调用 setState() 或 markNeedsBuild()

颤动

我正在尝试将一个小部件显示到 Stack IF an condition (true or false ) 中,并且它没有问题 但是当我需要将条件 bool 更改为 SetState 以再次隐藏小部件时,它也可以工作,但出现令人讨厌的错误消息,即 setState() or markNeedsBuild() called when widget tree was locked

我的代码很复杂,但我将展示一个简单的类似示例

bool displayWidget = false;
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),body: Stack(
        children: [
          Container(
            child: TextButton(
              onpressed: () {
                final result = await FilePicker.platform.pickFiles(allowMultiple: false );
                if (result == null) return;
                final path = result.files.single.path;
                setState(() => displayWidget = true);
              },child: Text ("studio")
            ),),displayWidget?
          GestureDetector(
            onTap: ()=> setState(() => displayWidget = false),// the  error happen when i click here 
            child: Container(
              child:  Image.asset("here is the picture in full secreen"),):Container()
        ],);
  }
}

我知道有比这种方式更好的照片查看器 :D 但我只举了一个其他真实案例的简单示例

解决方法

首先我想问你@override在哪里?您是否忘记在问题中添加该内容?如果是,那么该错误可能与此有关。如果没有,则尝试在 @override 上方声明 bool 值。

,

请看看这个例子是否对你有帮助(我简化了你的例子,以便它可以在 dartpad 中轻松运行)。 在您的情况下,onPressed 函数应包含您的文件选择逻辑并具有您期望的返回类型(可能是 String?)并检查返回值是否不为空,然后显示您的图像

class MyWidget extends StatefulWidget {  
  @override
  State<MyWidget> createState() => MyWidgetState();
}

class MyWidgetState extends State<MyWidget> {
  
  bool displayWidget = false;
  
  bool onPressed(bool isShown) {
    //instead of this mocked function pickFile here 
    return !isShown;
  }
  
    @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),body: Row(
        children: [
          Container(
            child: TextButton(
              onPressed: () {
                displayWidget = onPressed(displayWidget);
                setState(() => displayWidget);
              },child: Text ("Show or hide text"),),if(displayWidget)
          GestureDetector(
            onTap: ()=> setState(() => displayWidget = !displayWidget),child: Container(
              child:  Text('This text is to be shown'),],);
  }
}
,

我在flutter官网找到了解决方法

简单地将设置状态包装成

这个解决方案适用于大多数情况

      if(!mounted) {
         setState
        
           }
or  

if(mounted) { // depends on your widget case
 setState
     }

来源https://www.kindacode.com/article/flutter-error-setstate-called-after-dispose/

如果没有,试试这个

WidgetsBinding.instance
    .addPostFrameCallback((_) => setState(() {}));

来源https://www.thetopsites.net/article/50288698.shtml

并且我在stackoverflow中发现了许多答案相同的错误 按下面

Flutter setState() or markNeedsBuild() called when widget tree was locked

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。