我阅读了文档,但不清楚。
状态为“ [将此对象插入树中时调用。]
将小部件插入树中时,表示它已创建,这意味着将调用类构造函数。初始化的目的是什么?构造函数的目的不是初始化类实例吗?
谢谢你们的时间。
答案 0 :(得分:10)
区别在于(在创建State
对象的情况下)具有initState()
方法:
- 创建对象后并在此时调用
constructor
只需创建一个新的State
实例
initState()
您可以分别使用BuildContext
和StatefulWidget
属性访问State
附加到的context
或widget
。此时State
已经安装。
引用State
:https://docs.flutter.io/flutter/widgets/State-class.html
引用mounted State
:https://docs.flutter.io/flutter/widgets/State/mounted.html
答案 1 :(得分:2)
在某些情况下,创建Widget时需要启动动画或更改状态,然后在构造函数中无法执行此操作,因为您的Widget尚未插入树中。
动画控制器示例
AnimationController _animationController ;
...
@override
void initState() {
... instance the animationController
_animationController.forward();
super.initState();
}
另一个例子,当您从另一个小部件接收到一些参数时,假设您的有状态小部件具有名为“ title”的参数,并且您想在State类中创建一个局部变量来处理状态,则您将不得不做一些事情像这样:
class ExampleWidget extends StatefulWidget {
final String title;
ExampleWidget({this.title});
....
YourStateClass extends State<ExampleWidget> {
var localVariable;
@override
void initState() {
localVariable = widget.title;
super.initState();
}
现在您可以在小部件树中使用localVariable来更新状态。
这有意义吗?
答案 2 :(得分:0)
构造函数用于创建实例(对象)。
初始状态用于初始化已经存在的对象的内容。
例如,
假设您打开一个具有多个路线/页面的应用程序。当您打开任何特定页面时,将创建您内容在屏幕上看到的对象 A (带有一些初始数据)。
现在假设您在该特定页面上按一个按钮(执行更改数据的特定任务)。然后将调用 initstate 初始化对象 A 的数据,而无需重新从头开始打开应用。
也,必须注意,在构建之前调用了initstate,并且此时没有可用的上下文。
就这些。