首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >文本Widget如何标记为在父setState()上重建

文本Widget如何标记为在父setState()上重建
EN

Stack Overflow用户
提问于 2022-11-20 01:52:32
回答 2查看 16关注 0票数 0

当以小部件的状态调用setState时,元素树中的相应元素被标记为脏,并重新生成小部件。然而,它如何处理后代呢?例如,下面的Text小部件在其祖先SampleWidgetState重新构建时重新生成。

为什么?

代码语言:javascript
运行
复制
class SampleWidget extends StatefulWidget {
  @override
  SampleWidgetState createState() => SampleWidgetState();
}

class SampleWidgetState extends State<SampleWidget> {
  String text = "text1";

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text(text),
        ElevatedButton(
          child: Text('call SetState'),
          onPressed: () {
            setState(() {
              text = "text2";
            });
          },
        ),
      ],
    );
  }
}
EN

回答 2

Stack Overflow用户

发布于 2022-11-20 03:15:46

从Flutter的官方文档,内颤振

响应用户输入(或其他刺激),元素可能变得脏,例如,如果开发人员对关联的状态对象调用setState()。框架保留一个脏元素的列表,并在构建阶段直接跳转到它们,跳过干净的元素。在构建阶段,信息单向地沿着元素树流动,这意味着每个元素在构建阶段最多只被访问一次。一旦清理完毕,元素就不能再次变得脏了,因为通过归纳,它的所有祖先元素也都是干净的。

我猜这个答案是在小部件的后代更新过程中颤振在引擎盖下所做的事情。

票数 0
EN

Stack Overflow用户

发布于 2022-11-20 05:37:44

SampleWidgetState是一个状态类,当您调用setState() --它的平均build()方法将重新调用--时,内部的一切都将重新构建。这就是它的工作原理。

如果要防止后代不进行重建,有几种方法,

  1. 使用const关键字。
  2. 扭曲要更改自己状态的小部件,例如使用StatefullBuilder
  3. 将小部件重构为状态小部件,使其具有自己的状态

在您的示例中,Text小部件使用SampleWidgetStateString text = "text1";,它的平均文本小部件不是独立的,它依赖于该状态。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74505124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档