Flutter setState重建所有子级

时间:2020-06-06 16:53:22

标签: flutter flutter-layout

我有三个问题(在列表下方)。

我的设置如下。我的屏幕包含一个包含两个项目的堆栈:

 return Scaffold(
  body: Stack(
    children: <Widget>[
      Positioned.fill(                    <--------------- FIRST CHILD
        child: ASCIIPicture(widget._originalImage, image),
      ),
      AnimatedBuilder(                    <--------------- SECOND CHILD
        animation: _controller,
        builder: (context, child) {
          return Positioned(
            bottom: _slideAnimation.value,
            left: 0,
            right: 0,
            child: GestureDetector(
              onTap: onSettingsTap,
              onVerticalDragUpdate: onSettingsDrag,
              onVerticalDragEnd: onSettingsDragEnd,
              child: child,
            ),
          );
        },
        child: ASCIIOptions(           <- THE WIDGET THAT I DON'T WANT TO REBUILD
          converter: widget._converter,
          onUpdate: updateImage,       <- CALLBACK function
        ),
      )
    ],
  ),
);

ASCIIOptions小部件(第二个子级)允许用户更改一些配置。基于这些配置,第一个小部件(ASCIIPicture)显示不同的内容=>在更改配置时,第一个子项需要重建。为此,我将回调函数updateImage传递给每次配置更改时都会被调用的ASCIIOptions。 updateImage调用setState并更改第一个子代中使用的变量:

void updateImage() {
   setState(() {
     image = widget._converter.convertImage(widget._alphabet);
   });
}

但是,当调用updateImage时,ASCIIPicture和ASCIIOptions都会重新生成。 我的问题:

  1. 为什么ASCIIOptions会重建? ASCIIOptions不变,窗口小部件本身是无状态窗口小部件。
  2. ASCIIOptions是一个无状态小部件,包含3个有状态小部件(如上所述,它允许用户通过SliderWidgets更改一些配置)。 ASCIIOptions本身不具有任何状态-它不包含任何可变变量,而是具有3个有状态的小部件,这些小部件保持自己的状态并在发生变化时调用setState 进行更新。 可以这样做吗?-具有这样的小部件树:有状态->无状态->有状态
  3. 据我了解,如果我有一棵这样的树: Widget tree
    然后在Config1上调用setState只会简单地重绘此映像(Config2也是如此)。这意味着Config1 / 2可以自行处理,而ASCIIOptions基本上是一个容器。 这是正确的吗?

我仍在尝试弄清楚小部件树的工作原理,如果我要问些琐碎的事情,我深表歉意。

1 个答案:

答案 0 :(得分:1)

我假设当您说重建时,是指执行小部件的构建功能。如果是这样,每当父窗口小部件调用setState时,所有子窗口都将重建。但是,只有当它们被标记为脏(已更改)时,它们才会重新绘制/渲染。