我对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
mixin
s很重要(因此对你也很重要)Flutter 框架中的一个范例是在覆盖State
. 这就是为什么甚至deactivate
有一个mustCallSuper
注释。
此外,有些人mixin
希望您在函数的特定点调用这些生命周期方法的超级方法。
这意味着您应该遵循文档并super.dispose
在您的dispose
方法结束时调用,因为框架中的mixin
sState
期望是这种情况。
例如:TickerProviderStateMixin
并在最后断言:SingleTickerProviderStateMixin
super.dispose
在调用 super.dispose() 之前,所有 Tickers 都必须 [..] 被处理。
另一个例子:AutomaticKeepAliveMixin
在initState
and 中执行逻辑dispose
。
启动initState
与super.initState
和结束你dispose
与super.dispose
你想成为的方便和安全侧添加mixin
s到你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 Barrera和CopsOnRoad的前两个答案具有误导性,因为事情的真相是这真的无关紧要,您不需要看得太远。
那唯一的行动super.initState
,并super.dispose
采取了State
类本身是断言,自assert
-statements在只计算调试模式,这非常重要不是在所有曾经编写的程序,即在生产模式。
在下面,我将引导您完成 whatsuper.initState
和super.dispose
do 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 添加额外功能的情况下。
Cop*_*oad 11
super.initState()
应该始终是您的initState
方法中的第一行。
从文档:
initState():如果你覆盖它,确保你的方法以调用 super.initState() 开始。
正如您在框架的类中看到的那样,您应该在小部件初始化之后(即在super.initState()
.
我的处理情况在逻辑上会以另一种方式,首先做所有事情,然后调用super.dispose()
。
@override
void initState() {
super.initState();
// DO STUFF
}
@override
void dispose() {
// DO STUFF
super.dispose();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8769 次 |
最近记录: |