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

时间:2019-10-15 17:40:20

标签: flutter dart

我不知道该如何颤抖地呼叫super.initSate()?在某些代码示例中,它在开头被调用,而在其他示例中,则被称为结尾。有区别吗?

我试图用Google搜索它,但是没有找到有关此函数调用位置的任何解释。

哪个是正确的?

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

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

4 个答案:

答案 0 :(得分:0)

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

从逻辑上讲,我处理的情况是,首先做所有事情,然后调用super.dispose()

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

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

答案 1 :(得分:0)

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

来自文档:

  

initState():如果重写此方法,请确保您的方法以对的调用开头     super.initState()。

答案 2 :(得分:0)

这对mixin来说确实很重要(也正是因为这个原因[em> 对您来说也是)

State中覆盖生命周期方法时,在Flutter框架中调用super方法是范例。这就是为什么甚至deactivate都有mustCallSuper annotation的原因。 另外,某些mixin希望您在函数的特定位置调用这些生命周期方法的超级方法。

这意味着您应该遵循文档并在super.dispose方法的末尾调用dispose,因为mixin中的State框架希望情况确实如此。
例如:TickerProviderStateMixinSingleTickerProviderStateMixin assert super.dispose结尾:

  

在调用super.dispose()之前,必须先处理所有股票代码。

另一个示例:AutomaticKeepAliveMixininitStatedispose中执行逻辑。

结论

Start your initState with super.initStateend your dispose with super.dispose,如果您想轻松而安全地向mixin添加State
此外,请遵循有关其他生命周期方法(在State中覆盖的任何方法)的文档,因为框架将期望您按照文档中的说明调用超级方法。

因此,以下是您应该做的事情:

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

但是,State并不真正重要,我将在下文甚至是mixin中对此进行解释,它仅对根据我所能找到的断言而言至关重要,因此不会影响您的生产应用。

对于State

没关系

我认为Pablo BarreraCopsOnRoad的前两个答案是误导性的 ,因为事实的真相是,它实际上并不重要,您不需要看远。

super.initStatesuper.disposeState类本身中采取的唯一动作是断言,并且由于assert语句仅在调试模式,构建您的应用(即在生产模式下)根本没有关系。


下面,我将指导您完成super.initStatesuper.disposeState的操作,这是当您没有其他mixin时将要执行的所有代码。

initState

让我们首先确切地了解在super.initStatesource)中执行了什么代码:

@protected
@mustCallSuper
void initState() {
  assert(_debugLifecycleState == _StateLifecycle.created);
}

如您所见,只有一个生命周期断言,其目的是确保您的小部件正常工作。因此,只要您在自己的super.initStateinitState 某个地方致电,如果您的小部件无法正常工作,您就会看到AssertionError。无论您是否采取了任何先前的操作都没有关系,因为assert仅是为了报告代码中的某些错误,即使您在结束时调用super.initState也会看到错误方法。

dispose

dispose方法类似于(source):

@protected
@mustCallSuper
void dispose() {
  assert(_debugLifecycleState == _StateLifecycle.ready);
  assert(() {
    _debugLifecycleState = _StateLifecycle.defunct;
    return true;
  }());
}

如您所见,它还仅包含处理 debug 生命周期检查的断言。第二个assert是一个很好的技巧,因为它可以确保_debugLifecycleState仅在调试模式下更改(因为assert语句仅在调试模式下执行)。
这意味着只要您在自己的方法中调用super.dispose somewhere ,而没有mixins添加其他功能,就不会失去任何价值。

答案 3 :(得分:0)

每当将新的有状态小部件添加到小部件树中时,默认会调用

initState。 现在,super.initState执行小部件基类的默认实现,如果在super.initState之前调用任何依赖基类的东西,这可能会导致问题。 这就是为什么建议您以这种方式调用initState的原因:

Execute Process Task