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

我不知道在 Flutter 哪里可以打电话给 ABc0?在一些代码示例中,它在开头被调用,在其他代码中在结尾被调用。有区别吗?

我试图谷歌这一点,但没有找到任何解释的立场,这个函数调用。

哪一个是正确的?

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

或者

void initState() {
//DO OTHER STUFF
super.initState();
}
16986 次浏览

从框架的类中可以看出,应该在小部件初始化之后执行所有操作,即在 super.initState()之后。

我的情况下处置将在逻辑上以另一种方式,首先做一切,然后调用 super.dispose()

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


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

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

来自文件:

InitState () : 如果覆盖此属性,请确保方法以调用 InitState ().

这对于 mixin来说很重要(也正因为如此,为了你也很重要)

当在 State中重写生命周期方法时调用 super 方法是 Flutter 框架中的一个 范例。这就是为什么 deactivate也有 mustCallSuper注释
此外 ,一些 mixin期望您在函数的特定点调用这些生命周期方法的 super 方法。

这意味着您应该遵循文档并调用 dispose方法的 super.dispose 最后,因为框架中的 State上的 mixin预期情况就是这样。
例如: TickerProviderStateMixinSingleTickerProviderStateMixin 断言 super.dispose在结尾:

在调用 super.pose ()之前,必须释放所有记事本[ . . ]。

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

结论

如果你想在 State中加入 mixin,那么就从 super.initState 以 ABC3结束你的 dispose开始。
此外,遵循其他生命周期方法的文档(在 State中覆盖的任何方法) ,因为框架期望您调用文档中描述的 super 方法。

因此,你应该做的是:

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


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

然而,真的对于 State来说并不重要,我将在下面解释,甚至对于 Mixin 来说也是如此,它只对我能找到的断言起作用——所以它不会影响您的生产应用程序。

对于 State来说,这并不重要

我认为前两个答案从 Pablo Barrera科普森路误导,因为事情的真相是,它真的没有关系,你不需要看得很远。

super.initStatesuper.disposeState类本身中采取的唯一操作是 断言,而且由于 assert语句只在 调试模式中进行评估,所以一旦构建了应用程序,即在生产模式下,就根本不重要了。


在下面,我将指导您完成 super.initStatesuper.disposeState中所做的工作,这是在没有其他混合函数时将执行的所有代码。

initState

让我们先看看在 super.initState中究竟执行了哪些代码(来源) :

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

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

dispose

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

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

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

每当将新的有状态小部件添加到小部件树中时,都会默认调用 initState。 现在,super.initState 执行 widget 基类的默认实现。如果在 super.initState 之前调用任何依赖于基类的内容,那么这可能会导致问题。 这就是为什么建议以这种方式调用 initState:

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