【问题标题】:Flutter setState rebuilds all childrenFlutter setState 重建所有子节点
【发布时间】:2020-06-06 16:53:22
【问题描述】:

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

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

 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. 据我了解,如果我有一棵这样的树:
    然后在 Config1 上调用 setState 只会重绘这个图像(同样适用于 Config2)。这意味着 Config1/2 自己处理,而 ASCIIOptions 基本上是一个容器。 这是正确的吗?

我仍在试图弄清楚小部件树是如何工作的,如果我问的是琐碎的事情,请道歉。

【问题讨论】:

    标签: flutter flutter-layout


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2018-09-22
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      相关资源
      最近更新 更多