如何解决当小部件树被锁定时调用 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 举报,一经查实,本站将立刻删除。