如何仅对flutter中的一个小部件使用setState方法?

时间:2019-10-16 10:11:01

标签: android flutter dart

单击下图中的任何点时,我想显示一些与该点有关的信息。但是,当我使用setState方法更新有关click事件的以下信息时,该图将被重建。我想在此时间序列图中的某个时间放大,但是重建图是一个问题,无法在图上看到标签。如何使用setState方法更新以下信息而不重绘图形?

在下面的图片中,Angle的值应该为15.0,而没有setState的值就不会更新

enter image description here

5 个答案:

答案 0 :(得分:2)

要停止重建某些小部件,我要做的就是将其移到其自己的有状态小部件中。因此,当它是父级重建时,它将不会重建。为了在它们之间进行通信,我使用了回调函数或块模式。因此,您可以做的是将图形移至单独的有状态小部件,并在cilck事件上将数据通过功能回调传递给其父级。

答案 1 :(得分:0)

最好使用 StreamBuilder,请参阅有关它的 youtube 视频。

click to see youtube video

答案 2 :(得分:-1)

您可以将Provider小部件及其Consumer模式使用,以减少更改时重建树的哪些部分。

答案 3 :(得分:-1)

您可以用StatefulBuilder包装小部件:

  

一个柏拉图式小部件,既具有状态又调用一个闭包以获取   其子小部件。

     

传递给构建器的StateSetter函数用于调用   重建而不是典型的State.setState。

以下是文档中的示例:

await showDialog<void>(
  context: context,
  builder: (BuildContext context) {
    int selectedRadio = 0;
    return AlertDialog(
      content: StatefulBuilder(
        builder: (BuildContext context, StateSetter setState) {
          return Column(
            mainAxisSize: MainAxisSize.min,
            children: List<Widget>.generate(4, (int index) {
              return Radio<int>(
                value: index,
                groupValue: selectedRadio,
                onChanged: (int value) {
                  setState(() => selectedRadio = value);
                },
              );
            }),
          );
        },
      ),
    );
  },
);

答案 4 :(得分:-2)

您的问题是基于一个误解。

您要求的是“不要再在XX小部件上调用build”。

但是您正在寻找的是两个不被调用的方法:

  • RenderObject.layout
  • RenderObject.paint

setState对此没有影响。

调用setState不一定会重新绘制关联的窗口小部件树。同样也是如此,不需要setState来重新绘制小部件树。

您正在寻找的是RepaintBoundary之类的东西,它允许部分树在不需要时不重新绘制。