我有三个问题(在列表下方)。
我的设置如下。我的屏幕包含一个包含两个项目的堆栈:
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都将重建。我的问题:
[我仍在尝试弄清楚小部件树的工作原理,如果我要问些琐碎的事情,我深表歉意。
我假设您说的是重建,是指调用小部件的构建功能。每当父窗口小部件使用setState时,都会调用build函数。但是,仅当子小部件被标记为脏(已更改)时,它才会重绘/渲染。
您可以将ASCIIOptions()提取到一个有状态的小部件中,然后从父级调用它