我有一个Parent小部件,它包含一些状态,在本例中是一个计数器.

此状态使用其构造函数传递给Child小部件.

现在,根据我的理解,每次Parent的状态改变时,Child都应该被重新构建,因为它在Parentbuild()函数中,而build()在每次状态改变时被调用.

这个概念使我相信每次计数器改变时都会打印INIT STATE!消息.但事实并非如此!

我本质上想要一个只要Child的构造函数参数(message)改变就只触发一次的"钩子".

请问有没有人可以解释一下,为何会这样,怎样才能有上述的"钩子"呢?

class Child extends StatefulWidget {
  final String message;

  const Child(this.message, {Key key}) : super(key: key);

  @override
  _ChildState createState() => _ChildState();
}

class _ChildState extends State<Child> {
  @override
  void initState() {
    print("INIT STATE!");
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text(widget.message),
    );
  }
}

class Parent extends StatefulWidget {
  @override
  _ParentState createState() => _ParentState();
}

class _ParentState extends State<Parent> {
  int _counter = 0;

  @override
  void initState() {
    Timer.periodic(Duration(seconds: 1), (_) {
      if (mounted) {
        setState(() {
          _counter += 1;
        });
      }
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Child(_counter.toString());
  }
}

推荐答案

好的,看起来这一点在State级的文档中已经明确提到了.

正确的方法是重写State子类中的didUpdateWidget方法.

Flutter相关问答推荐

为什么Riverpod生成器在这种情况下不生成AsyncNotiator?

Flutter 蜂窝单元测试

在保持标高=1的情况下更改AppBar立面 colored颜色 /遮罩

缩短经常使用的行Theme.of(context).colorScheme

如何在Date Time类中只显示日期?

如何更改Flutter 中文本的混合模式?

如何在 Flutter 中设计像 zomato 应用程序一样的搜索字段?

网页浏览器不支持鼠标滚动的行项目

Flutter屏幕适配 - 在模拟器和真实手机上文本尺寸不同

Flutter / 为什么当我点击我的图片时我的模型没有更新?

我想在文本结束后显示分隔线.它会在第一行、第二行或第三行结束

如何使这种相机叠加在Flutter 中?

我想在一个屏幕上有两个相同区域的列表视图,我该如何设置?

type '({bool growable}) => List' 不是类型转换中类型 'List' 的子类型

如何根据字符串值动态构建和显示小部件?

Flutter - 使用 pin 进行身份验证

如何获得Flutter 的时差?

将一个 Flutter 应用程序集成到另一个 Flutter 应用程序中

我收到这个错误我无法解决

RangeError(索引):无效值:有效值范围为空:点击文章时为0