didUpdateWidget详解

概述

只要在父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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值