Flutter的生命周期函数

  1. 构造函数
  2. initState 初始化状态,只调用一次;
  3. didChangeDependencies在initState执行完立刻调用,当依赖的InheritedWidget发生build时也会调用;
  4. build画画用的;
  5. didUpdateWidget状态改变时调用,如调用了setState函数;
  6. deactivate相当于Android的onStop方法;
  7. dispose销毁时调用。

测试

页面打开

1
2
3
I/flutter (30299): 调用了initState
I/flutter (30299): 调用了didChangeDependencies
I/flutter (30299): 调用了build

页面刷新

状态没变

测试代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
@override
Widget build(BuildContext context) {
  print('调用了build');
  return Scaffold(
    appBar: AppBar(),
    body: Container(
      child: MaterialButton(
          child: Text('主动刷新页面'),
          onPressed: () {
            print('我主动调用了setState');
            setState(() {});
          }),
    ),
  );
}

输出:

1
2
I/flutter (30299): 我主动调用了setState
I/flutter (30299): 调用了build

可以看到状态没有变化的时候,是不会调用didUpdateWidget函数的。

状态改变测试1

测试代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
///创建一个变量,通过改变这个变量来改变状态
int i = 0;

@override
Widget build(BuildContext context) {
  print('调用了build');
  return Scaffold(
    appBar: AppBar(),
    body: Container(
      child: MaterialButton(
          child: Text('主动刷新页面'),
          onPressed: () {
            print('我主动调用了setState');
            setState(() {
              i = 1;
            });
          }),
    ),
  );
}

输出:

1
2
3
I/flutter (30299): 调用了initState
I/flutter (30299): 调用了didChangeDependencies
I/flutter (30299): 调用了build

这里可以看到,我把赋值操作写在setState的回调里面,可以触发调用了didChangeDependencies

状态改变测试2

测试代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
///创建一个变量,通过改变这个变量来改变状态
int i = 0;

@override
Widget build(BuildContext context) {
  print('调用了build');
  return Scaffold(
    appBar: AppBar(),
    body: Container(
      child: MaterialButton(
          child: Text('主动刷新页面'),
          onPressed: () {
            print('我主动调用了setState');
             i = 2;
            setState(() { });
          }),
    ),
  );
}

输出:

1
2
I/flutter (30299): 我主动调用了setState
I/flutter (30299): 调用了build

这里可以看到,我把赋值操作**写在setState的回调外面,didChangeDependencies函数就不会触发了。

总结

当使用setState方法时:

页面退出

1
2
I/flutter (30299): 调用了deactivate
I/flutter (30299): 调用了dispose