我应该在结尾还是开头调用 super.initState ?

K V*_*Vij 47 dart flutter

我对super.initSate()在 Flutter 中调用的位置感到困惑?在一些代码示例中,它在开始时被调用,而在其他代码示例中则在最后被调用。有区别吗?

我试图用谷歌搜索这个,但没有找到关于这个函数调用位置的任何解释。

哪一个是正确的?

void initState() {
  super.initState();    
  //DO OTHER STUFF
}
Run Code Online (Sandbox Code Playgroud)

或者

void initState() {    
  //DO OTHER STUFF
  super.initState();    
}
Run Code Online (Sandbox Code Playgroud)

cre*_*not 39

这对mixins很重要(因此对你也很重要)

Flutter 框架中的一个范例是在覆盖State. 这就是为什么甚至deactivate有一个mustCallSuper注释
此外,有些人mixin希望您在函数的特定点调用这些生命周期方法的超级方法。

这意味着您应该遵循文档并super.dispose 您的dispose方法结束时调用因为框架中的mixinsState期望是这种情况。
例如:TickerProviderStateMixin并在最后断言SingleTickerProviderStateMixin super.dispose

在调用 super.dispose() 之前,所有 Tickers 都必须 [..] 被处理。

另一个例子:AutomaticKeepAliveMixininitStateand 中执行逻辑dispose

结论

启动initStatesuper.initState结束你disposesuper.dispose你想成为的方便和安全侧添加mixins到你State
此外,请遵循其他生命周期方法(您在 中覆盖的任何方法State)的文档,因为框架将期望您按照文档中的描述调用超级方法。

因此,您应该执行以下操作:

@override
void initState() {
  super.initState();    
  // DO YOUR STUFF
}

@override
void dispose() {
  // DO YOUR STUFF
  super.dispose();
}
Run Code Online (Sandbox Code Playgroud)

然而,它并不真的不管了State,我将在下文中,甚至混入解释,它只事项断言,从我能找到的判断-所以它不会影响您的生产应用。

没关系 State

我认为Pablo BarreraCopsOnRoad的前两个答案具有误导性,因为事情的真相是这真的无关紧要,您不需要看得太远。

那唯一的行动super.initState,并super.dispose采取了State类本身是断言,自assert-statements在只计算调试模式,这非常重要不是在所有曾经编写的程序,即在生产模式。


在下面,我将引导您完成 whatsuper.initStatesuper.disposedo in State,这是当您没有额外的 mixin 时将执行的所有代码。

initState

让我们看看在super.initState第一个(源代码)中到底执行了什么代码:

@protected
@mustCallSuper
void initState() {
  assert(_debugLifecycleState == _StateLifecycle.created);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,只有一个生命周期断言,其目的是确保您的小部件正常工作。因此,只要您在自己的super.initState 某个地方调用initState,您就会看到AssertionError小部件是否未按预期工作。您是否采取了一些先前的行动并不重要,因为这assert只是为了报告您的代码中的某些内容无论如何都是错误的,即使您super.initState在方法的最后调用,您也会看到这一点。

dispose

dispose方法是类似的(来源):

@protected
@mustCallSuper
void dispose() {
  assert(_debugLifecycleState == _StateLifecycle.ready);
  assert(() {
    _debugLifecycleState = _StateLifecycle.defunct;
    return true;
  }());
}
Run Code Online (Sandbox Code Playgroud)

如您所见,它也仅包含处理调试生命周期检查的断言。assert这里的第二个是一个很好的技巧,因为它确保_debugLifecycleState仅在调试模式下更改(因为assert-statements 仅在调试模式下执行)。
这意味着只要你在自己的方法中调用super.dispose 某个地方,你就不会失去任何价值,而不会在 mixins 添加额外功能的情况下。

  • Flutter 官方文档不是很好:( 感谢您的回答:) (5认同)

Cop*_*oad 11

super.initState()应该始终是您的initState方法中的第一行。

从文档:

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

  • 您有文档中引用位置的链接吗?我认为他们改为:措辞_“此方法的实现应该从调用继承的方法开始,如 super.initState() 中所示。”_ [此处](https://api.flutter.dev/flutter/小部件/状态/initState.html) (4认同)
  • @MendelG 是的,他们更新了文档,但本质是相同的。 (2认同)

Pab*_*era 5

正如您在框架的类中看到的那样,您应该在小部件初始化之后(即在super.initState().

我的处理情况在逻辑上会以另一种方式,首先做所有事情,然后调用super.dispose()

@override
void initState() {
  super.initState();
  // DO STUFF
}

@override
void dispose() {
  // DO STUFF
  super.dispose();
}
Run Code Online (Sandbox Code Playgroud)