【发布时间】: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 都会重新生成。 我的问题:
- 为什么要重建 ASCIIOptions? ASCIIOptions 不会改变,小部件本身是无状态小部件。
- ASCIIOptions 是一个无状态小部件,包含 3 个有状态小部件(如前所述,它允许用户通过 SliderWidgets 更改一些配置)。 ASCIIOptions 本身没有任何状态 - 它不包含任何可变变量,相反,它有 3 个有状态的小部件,它们拥有自己的状态并调用 setState 以在发生变化时自行更新。 可以这样做吗? - 拥有这样的小部件树:有状态 -> 无状态 -> 有状态
- 据我了解,如果我有一棵这样的树:
然后在 Config1 上调用 setState 只会重绘这个图像(同样适用于 Config2)。这意味着 Config1/2 自己处理,而 ASCIIOptions 基本上是一个容器。 这是正确的吗?
我仍在试图弄清楚小部件树是如何工作的,如果我问的是琐碎的事情,请道歉。
【问题讨论】: