【问题标题】:What is initState and super.initState in flutter?Flutter 中的 initState 和 super.initState 是什么?
【发布时间】:2019-02-17 03:22:28
【问题描述】:

在文档中是这样写的,但我无法理解。

将此对象插入树时调用。

框架将为它创建的每个 State 对象仅调用一次此方法。

重写此方法以执行初始化,该初始化取决于此对象插入树的位置(即上下文)或用于配置此对象的小部件(即小部件)。

如果 State 的构建方法依赖于一个自身可以改变状态的对象,例如 ChangeNotifier 或 Stream,或者可以订阅接收通知的其他对象,那么 State 应该在 期间订阅该对象initState,在didUpdateWidget中退订旧对象并订阅新对象,然后在dispose中退订对象。

您不能从此方法中使用 BuildContext.inheritFromWidgetOfExactType。但是在这个方法之后会立即调用didChangeDependencies,并且可以在那里使用BuildContext.inheritFromWidgetOfExactType。

如果您覆盖它,请确保您的方法以调用 super.initState() 开始。

但我不确定它的含义。能解释一下吗?

【问题讨论】:

  • 在widget-tree中第一次插入有状态widget时调用的方法
  • super.initState() 转发到您的小部件的State<T> 基类的默认实现。如果不覆盖,则不会执行默认实现,但小部件依赖于它才能正常工作。
  • “如果你不覆盖,”应该是“如果你不转发,”

标签: flutter dart init


【解决方案1】:

感谢@Remi,initState() 是一个在有状态小部件插入小部件树时调用一次的方法。

如果我们需要做一些初始化工作,比如注册一个监听器,我们通常会覆盖这个方法,因为与build()不同,这个方法只被调用一次。

要取消注册您的听众(或做一些后期工作),您需要覆盖 dispose()method。


来自here

State 的子类可以覆盖 initState 来完成只需要发生一次的工作。例如,重写 initState 来配置动画或订阅平台服务。 initState 的实现需要通过调用 super.initState 开始

当不再需要状态对象时,框架会在状态对象上调用 dispose()。覆盖 dispose 函数以进行清理工作。例如,覆盖 dispose 以取消计时器或取消订阅平台服务。 dispose 的实现通常以调用 super.dispose 结束

【讨论】:

    【解决方案2】:

    initState() 的使用

    initState()State类的方法,在Flutter中被认为是重要的生命周期方法。 initState() 只被调用一次,我们使用它进行一次初始化。

    示例:

    • 初始化依赖于特定BuildContext的数据。

    • 初始化需要在build()之前执行的数据。

    • 订阅Streams

    【讨论】:

      【解决方案3】:

      来自 Flutter 官方文档,当这个对象插入树时调用。

      框架将为它创建的每个State 对象仅调用一次此方法。

      重写此方法以执行初始化,该初始化取决于此对象插入树的位置(即context)或用于配置此对象的小部件(即widget)。

      说明:

      这是创建小部件时调用的第一个方法(当然是在类构造函数之后。)

      initState 只被调用一次。它还必须调用super.initState()

      这个@override方法是最好的时机:

      1. 初始化依赖于特定 BuildContext 的数据 小部件的创建实例。

      2. 在 树。

      3. 订阅 Streams、ChangeNotifiers 或任何其他对象 可以更改此小部件上的数据。

        @override
        initState() {
          super.initState();
         // Add listeners to this class
          cartItemStream.listen((data) {
            _updateWidget(data);
          });
        }
        

      【讨论】:

        【解决方案4】:

        谢谢你的回答,但我也会重申上面的人的状态

        @overrride
        initState() {         // this is called when the class is initialized or called for the first time
          super.initState();  //  this is the material super constructor for init state to link your instance initState to the global initState context
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-02
          • 2019-02-03
          • 1970-01-01
          • 2020-02-10
          • 2022-10-25
          • 2019-01-28
          • 2019-12-24
          • 2021-04-06
          相关资源
          最近更新 更多