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() 在对象创建后调用,此时 您可以分别使用contextwidget 属性访问BuildContextState 所附加到的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 和类构造函数有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

如何在flutter中调用initState中的异步方法

Flutter的生命周期

Flutter的生命周期

Flutter生命周期

flutter 生命周期

Flutter 在 initState 方法中获取上下文