概述
只要在父widget中调用setState,子widget的didUpdateWidget就一定会被调用,不管父widget传递给子widget构造方法的参数有没有改变。
只要didUpdateWidget被调用,接来下build方法就一定会被调用。
子widget首次被加载时的生命周期:
initState -> build
子widget首次被加载后,如果在父widget中调用setState,子widget的生命周期:
didUpdateWidget -> build
注意
对于List类型的参数,在didUpdateWidget中并不能有效对比list长度的变化:
对于引用类型的数值应该都无法有效对比新旧变化。猜测底层是用两个变量来记录旧值和新值,但因为引用类型记录的是地址,因此两个变量实际指向同一个对象。
class TestView extends StatefulWidget {
final List<double> list;
final int count;
TestView(this.list, this.count);
@override
State<StatefulWidget> createState() {
return _TestViewState();
}
}
class _TestViewState extends State<TestView> {
@override
void initState() {
super.initState();
print("initState");
}
@override
void didUpdateWidget(TestView oldWidget) {
super.didUpdateWidget(oldWidget);
print("didUpdateWidget");
print("list:${oldWidget.list.length}:${widget.list.length}");
print("count:${oldWidget.count}:${widget.count}");
}
@override
Widget build(BuildContext context) {
print("build");
return Container();
}
}
List<double> list = [];
int count = 0;
...
@override
Widget build(BuildContext context) {
return Scaffold(
body: TestView(list, count),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
list.add(null);
count++;
});
},
child: Icon(Icons.add),
),
);
}
点击按钮输出如下:
didUpdateWidget
list:1:1
count:0:1
build
didUpdateWidget
list:2:2
count:1:2
build
didUpdateWidget
list:3:3
count:2:3
build
didUpdateWidget
list:4:4
count:3:4
build
didUpdateWidget
list:5:5
count:4:5
build