Flutter 中的 initState 和类构造函数有啥区别?
Posted
技术标签:
【中文标题】Flutter 中的 initState 和类构造函数有啥区别?【英文标题】:What is the difference between initState and a class constructor in Flutter?Flutter 中的 initState 和类构造函数有什么区别? 【发布时间】:2019-02-03 14:59:45 【问题描述】:我阅读了文档,但不清楚。
它声明“[initState is] 当这个对象被插入到树中时调用。”
当一个小部件被插入到树中时,就意味着它已经被创建,这意味着类构造函数被调用。初始化的目的是什么?构造函数的目的不就是初始化类实例吗?
感谢大家的宝贵时间。
【问题讨论】:
你能链接到你正在阅读的文档吗?我猜是:docs.flutter.io/flutter/widgets/State/initState.html @T.Woody 是的,就是这样。我通读了 5 遍以上。我仍然不明白“取决于插入对象的位置”或“用于配置此小部件”是什么意思。这不就是类构造函数的用途吗? 我在看直接代码,看看能不能找到。 github.com/flutter/flutter/… 您自己是否直接查看过代码?有帮助时不看的地方的反馈:) 我相信initState
源自(并且行为类似于)在比较文档读取方式后:apache.github.io/incubator-heron/api/java/com/twitter/heron/api/…
【参考方案1】:
不同之处在于(在创建State
对象的上下文中)它具有initState()
方法:
constructor
只需创建一个新的State
实例
initState()
在对象创建后调用,此时 您可以分别使用context
和widget
属性访问BuildContext
或State
所附加到的StatefulWidget
。此时State
已经挂载。
参考State
:https://api.flutter.dev/flutter/widgets/State-class.html
参考mounted State
:https://api.flutter.dev/flutter/widgets/State/mounted.html
【讨论】:
如果你来自 python 世界。构造函数类似于 __new__(),initState 类似于 __init__()。【参考方案2】:在某些情况下,您需要在创建 Widget
时启动动画或更改状态,然后无法在构造函数中执行此操作,因为您的 Widget
尚未插入树中。
AnimationController
的示例
AnimationController _animationController ;
...
@override
void initState()
... instance the animationController
_animationController.forward();
super.initState();
另一个例子,当你从另一个 Widget
收到一些参数时,假设你的 StatefulWidget
有一个名为 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
来更新状态。
【讨论】:
来自 twitter API 的这个在 Flutter 上下文中也有意义吗? apache.github.io/incubator-heron/api/java/com/twitter/heron/api/… @diegoveloper 哇,你的第一个解释很清楚。我现在已经掌握了。但是,对于第二个示例....您不能只通过 YourStateClass 构造函数的构造函数传递“title”变量吗?如:YourStateClass(title); 可以,但不能在构造函数中调用 setState 最后一个问题。如果您可以通过 YourStateClass 构造函数传递“title”属性来访问它,那么通过 initState() 来访问它有什么好处? @WalterM ok 在这种情况下是相反的,假设您在构造函数中初始化了 localVar,然后将 localVar 放入小部件中。您将看到该值,因为它是在您的小部件出现在树中之前设置的。但是,如果您在 initState 中初始化 localVar,并在您的小部件中使用您的 localVar,则在您调用 setState 之前您不会看到更改,因为您的小部件在您初始化值之前已经创建。【参考方案3】:构造函数用于创建实例(对象)。
initstate 用于初始化已存在对象的内容。
例如,
假设您打开一个具有多个路由/页面的应用。当您打开任何特定页面时,会创建其内容的对象 A(带有一些初始数据),您会在屏幕上看到该对象。
现在假设您在该特定页面上按下一个按钮(执行更改数据的特定任务)。然后将调用 initstate 来初始化对象 A 的数据,而无需您重新打开应用程序。
另外,必须注意的是 initstate 在构建之前被调用,并且在那一刻没有可用的上下文。
就是这样。
【讨论】:
以上是关于Flutter 中的 initState 和类构造函数有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章