【问题标题】:What is the difference between initState and a class constructor in Flutter?Flutter 中的 initState 和类构造函数有什么区别?
【发布时间】:2019-02-03 14:59:45
【问题描述】:

我阅读了文档,但不清楚。

它声明“[initState is] 当这个对象被插入到树中时调用。”

当一个小部件被插入到树中时,就意味着它已经被创建,这意味着类构造函数被调用。初始化的目的是什么?构造函数的目的不就是初始化类实例吗?

感谢大家的宝贵时间。

【问题讨论】:

标签: android ios flutter


【解决方案1】:

不同之处在于(在创建State 对象的上下文中)它具有initState() 方法:

  • constructor 只需创建一个新的State 实例

  • initState() 在对象创建后调用,此时 您可以分别使用contextwidget 属性访问BuildContextState 所附加到的StatefulWidget。此时State 已经挂载。

参考Statehttps://api.flutter.dev/flutter/widgets/State-class.html

参考mounted Statehttps://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 在构建之前被调用,并且在那一刻没有可用的上下文

就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2011-04-16
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多