查看类里面的方法 ctrl + F12
1.0 State
在说到StatefulWidget之前,先说下State。State的作用有两点:
-
在widget构建的时候可以被同步读取;
-
在widget的生命周期中可能会被改变。
1.1 State生命周期
State的生命周期有四种状态:
-
created:当State对象被创建时候,State.initState方法会被调用;
-
initialized:当State对象被创建,但还没有准备构建时,State.didChangeDependencies在这个时候会被调用;
-
ready:State对象已经准备好了构建,State.dispose没有被调用的时候;
-
defunct:State.dispose被调用后,State对象不能够被构建。
完整生命周期如下:
-
创建一个State对象时,会调用StatefulWidget.createState;
-
和一个BuildContext相关联,可以认为被加载了(mounted);
-
调用initState;
-
调用didChangeDependencies;
-
经过上述步骤,State对象被完全的初始化了,调用build;
-
如果有需要,会调用didUpdateWidget;
-
如果处在开发模式,热加载会调用reassemble;
-
如果它的子树(subtree)包含需要被移除的State对象,会调用deactivate;
-
调用dispose,State对象以后都不会被构建;
-
当调用了dispose,State对象处于未加载(unmounted),已经被dispose的State对象没有办法被重新加载(remount)。
1.2 setState
State中比较重要的一个方法是setState
,当修改状态时,widget会被更新。比方说点击CheckBox,会出现选中和非选中状态之间的切换,就是通过修改状态来达到的。
查看setState源码,在一些异常的情况下将会抛出异常:
-
传入的为null;
-
处在defunct阶段;
-
created阶段还没有被加载(mounted);
-
参数返回一个Future对象。
检查完一系列异常后,最后调用代码如下:
_element.markNeedsBuild();
markNeedsBuild内部,则是通过标记element为diry,在下一帧的时候重建(rebuild)。可以看出setState并不是立即生效,它只是将widget进行了标记,真正的rebuild操作,则是等到下一帧的时候才会去进行。
了解了state的生命周期,以后就可以方便的写操作了。
比如如果是欢迎页,那么欢迎页的延时跳转逻辑就可以写到
initState()方法里面
@override void initState() { super.initState(); new Future.delayed(const Duration(seconds: 2), () { //延时操作后,实现跳转逻辑 return true; }); }