我对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 都必须 [..] 被处理。
另一个例子:AutomaticKeepAliveMixin在initStateand 中执行逻辑dispose。
启动initState与super.initState和结束你dispose与super.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 Barrera和CopsOnRoad的前两个答案具有误导性,因为事情的真相是这真的无关紧要,您不需要看得太远。
那唯一的行动super.initState,并super.dispose采取了State类本身是断言,自assert-statements在只计算调试模式,这非常重要不是在所有曾经编写的程序,即在生产模式。
在下面,我将引导您完成 whatsuper.initState和super.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 添加额外功能的情况下。
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 次 |
| 最近记录: |