gpt4 book ai didi

flutter - 我应该在最后还是开始时调用 super.initState?

转载 作者:行者123 更新时间:2023-12-01 03:05:17 26 4
gpt4 key购买 nike

我不知道在哪里调用 super.initSate()在 flutter ?在某些代码示例中,它在开头调用,而在其他代码示例中则在结尾调用。有区别吗?
我试图用谷歌搜索,但没有找到关于这个函数调用位置的任何解释。
哪一个是正确的?

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

最佳答案

mixin 来说确实很重要s(也正因为如此对你来说)
这是一个 范式 在 Flutter 框架中重写 State 中的生命周期方法时调用 super 方法.这就是为什么即使 deactivate 有一个 mustCallSuper annotation .
此外,一些 mixin s 期望您在函数的特定点调用这些生命周期方法的 super 方法。
这意味着您应该遵循文档并调用 super.dispose 最后您的dispose方法因为 mixinState在框架中期望是这样的。
例如: TickerProviderStateMixin SingleTickerProviderStateMixin assert super.dispose在末尾:

All Tickers must [..] be disposed before calling super.dispose().


另一个例子: AutomaticKeepAliveMixin 执行 initState 中的逻辑和 dispose .
结论
Start your initState with super.initState end your dispose with super.dispose 如果您想轻松安全,请添加 mixin给你的 State .
此外,请遵循其他生命周期方法的文档(您在 State 中覆盖的任何方法),因为框架会期望您调用文档中描述的 super 方法。
因此,以下是您应该做的:
@override
void initState() {
super.initState();
// DO YOUR STUFF
}

@override
void dispose() {
// DO YOUR STUFF
super.dispose();
}
但是,对于 State 来说并不重要。 ,我将在下面解释,甚至对于 mixins,它只对从我能找到的东西判断的断言很重要——所以它不会影响你的生产应用程序。 State 没关系
我认为 Pablo Barrera 的前两个答案和 CopsOnRoad具有误导性,因为事情的真相是它真的无关紧要,你不需要看得太远。
super.initState 的唯一操作和 super.dispose 收下 State类本身是 断言并且因为 assert -statements 仅在 Debug模式下进行评估,一旦构建您的应用程序(即在生产模式下)就完全没有关系。

下面,我将引导您了解 super.initStatesuper.disposeState ,这是当你没有额外的 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;
}());
}
如您所见,它还只包含处理 的断言。调试 生命周期检查。第二个 assert这是一个很好的技巧,因为它确保 _debugLifecycleState仅在 Debug模式下更改(因为 assert -语句仅在 Debug模式下执行)。
这意味着只要您调用 super.dispose在你自己的方法中的某个地方,如果没有 mixins 添加额外的功能,你不会失去任何值(value)。

关于flutter - 我应该在最后还是开始时调用 super.initState?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58400001/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com