我不知道在 Flutter 哪里可以打电话给 ABc0?在一些代码示例中,它在开头被调用,在其他代码中在结尾被调用。有区别吗?
我试图谷歌这一点,但没有找到任何解释的立场,这个函数调用。
哪一个是正确的?
void initState() { super.initState(); //DO OTHER STUFF }
或者
void initState() { //DO OTHER STUFF super.initState(); }
从框架的类中可以看出,应该在小部件初始化之后执行所有操作,即在 super.initState()之后。
super.initState()
我的情况下处置将在逻辑上以另一种方式,首先做一切,然后调用 super.dispose()。
super.dispose()
@override void initState() { super.initState(); // DO STUFF } @override void dispose() { // DO STUFF super.dispose(); }
super.initState()应该始终是 initState方法中的第一行。
initState
来自文件:
InitState () : 如果覆盖此属性,请确保方法以调用 InitState ().
mixin
当在 State中重写生命周期方法时调用 super 方法是 Flutter 框架中的一个 范例。这就是为什么 deactivate也有 mustCallSuper注释。 此外 ,一些 mixin期望您在函数的特定点调用这些生命周期方法的 super 方法。
State
deactivate
mustCallSuper
这意味着您应该遵循文档并调用 dispose方法的 super.dispose 最后,因为框架中的 State上的 mixin预期情况就是这样。 例如: TickerProviderStateMixin和 SingleTickerProviderStateMixin 断言 super.dispose在结尾:
dispose
super.dispose
TickerProviderStateMixin
SingleTickerProviderStateMixin
在调用 super.pose ()之前,必须释放所有记事本[ . . ]。
另一个例子: AutomaticKeepAliveMixin在 initState和 dispose中执行逻辑。
AutomaticKeepAliveMixin
如果你想在 State中加入 mixin,那么就从 super.initState 和 以 ABC3结束你的 dispose开始。 此外,遵循其他生命周期方法的文档(在 State中覆盖的任何方法) ,因为框架期望您调用文档中描述的 super 方法。
super.initState
因此,你应该做的是:
@override void initState() { super.initState(); // DO YOUR STUFF } @override void dispose() { // DO YOUR STUFF super.dispose(); }
然而,真的对于 State来说并不重要,我将在下面解释,甚至对于 Mixin 来说也是如此,它只对我能找到的断言起作用——所以它不会影响您的生产应用程序。
我认为前两个答案从 Pablo Barrera和 科普森路是 误导,因为事情的真相是,它真的没有关系,你不需要看得很远。
super.initState和 super.dispose在 State类本身中采取的唯一操作是 断言,而且由于 assert语句只在 调试模式中进行评估,所以一旦构建了应用程序,即在生产模式下,就根本不重要了。
assert
在下面,我将指导您完成 super.initState和 super.dispose在 State中所做的工作,这是在没有其他混合函数时将执行的所有代码。
让我们先看看在 super.initState中究竟执行了哪些代码(来源) :
@protected @mustCallSuper void initState() { assert(_debugLifecycleState == _StateLifecycle.created); }
如您所见,只有一个生命周期断言,其目的是确保小部件正常工作。因此,只要您在自己的 initState中调用 super.initState 某个地方,就会看到一个 AssertionError,如果您的小部件没有按预期工作的话。如果您采取了一些先前的操作,这并不重要,因为 assert只是用来报告代码中的某些错误,即使您在方法的最后调用 super.initState,您也会看到这一点。
AssertionError
dispose方法是类似的(来源) :
@protected @mustCallSuper void dispose() { assert(_debugLifecycleState == _StateLifecycle.ready); assert(() { _debugLifecycleState = _StateLifecycle.defunct; return true; }()); }
如您所见,它还只包含处理 调试生命周期检查的断言。这里的第二个 assert是一个很好的技巧,因为它确保了仅在调试模式下更改 _debugLifecycleState(因为 assert-语句仅在调试模式下执行)。 这意味着,只要您在自己的方法中调用 super.dispose 某个地方,就不会丢失任何值,除非 Mixin 添加额外的功能。
_debugLifecycleState
每当将新的有状态小部件添加到小部件树中时,都会默认调用 initState。 现在,super.initState 执行 widget 基类的默认实现。如果在 super.initState 之前调用任何依赖于基类的内容,那么这可能会导致问题。 这就是为什么建议以这种方式调用 initState:
@override void initState() { super.initState(); // DO STUFF }