Flutter setState重建所有子项

问题描述 投票:0回答:2

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

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

 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基本上是一个容器。 这是正确的吗?

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

flutter flutter-layout
2个回答
0
投票

我假设您说的是重建,是指调用小部件的构建功能。每当父窗口小部件使用setState时,都会调用build函数。但是,仅当子小部件被标记为脏(已更改)时,它才会重绘/渲染。


-1
投票

您可以将ASCIIOptions()提取到一个有状态的小部件中,然后从父级调用它

© www.soinside.com 2019 - 2024. All rights reserved.