我不知道该如何颤抖地呼叫super.initSate()
?在某些代码示例中,它在开头被调用,而在其他示例中,则被称为结尾。有区别吗?
我试图用Google搜索它,但是没有找到有关此函数调用位置的任何解释。
哪个是正确的?
void initState() {
super.initState();
//DO OTHER STUFF
}
或
void initState() {
//DO OTHER STUFF
super.initState();
}
答案 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
框架希望情况确实如此。
例如:TickerProviderStateMixin
和SingleTickerProviderStateMixin
assert super.dispose
结尾:
在调用super.dispose()之前,必须先处理所有股票代码。
另一个示例:AutomaticKeepAliveMixin
在initState
和dispose
中执行逻辑。
Start your initState
with super.initState
和end your dispose
with super.dispose
,如果您想轻松而安全地向mixin
添加State
。
此外,请遵循有关其他生命周期方法(在State
中覆盖的任何方法)的文档,因为框架将期望您按照文档中的说明调用超级方法。
因此,以下是您应该做的事情:
void initState() {
super.initState();
//DO OTHER STUFF
}
但是,State
并不真正重要,我将在下文甚至是mixin中对此进行解释,它仅对根据我所能找到的断言而言至关重要,因此不会影响您的生产应用。
State
我认为Pablo Barrera和CopsOnRoad的前两个答案是误导性的 ,因为事实的真相是,它实际上并不重要,您不需要看远。
super.initState
和super.dispose
在State
类本身中采取的唯一动作是断言,并且由于assert
语句仅在调试模式,构建您的应用(即在生产模式下)根本没有关系。
下面,我将指导您完成super.initState
中super.dispose
和State
的操作,这是当您没有其他mixin时将要执行的所有代码。
initState
让我们首先确切地了解在super.initState
(source)中执行了什么代码:
@protected
@mustCallSuper
void initState() {
assert(_debugLifecycleState == _StateLifecycle.created);
}
如您所见,只有一个生命周期断言,其目的是确保您的小部件正常工作。因此,只要您在自己的super.initState
中initState
某个地方致电,如果您的小部件无法正常工作,您就会看到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