답변:
mixin
(그리고 당신 때문에 그것 때문에 )Flutter 프레임 워크 의 패러다임 은에서의 라이프 사이클 메소드를 대체 할 때 수퍼 메소드를 호출하는 것 State
입니다. 이것이 주석deactivate
이있는 이유 입니다. 또한 일부 는 함수의 특정 지점에서 해당 수명주기 메소드의 수퍼 메소드를 호출 할 것으로 예상합니다.mustCallSuper
mixin
당신은 문서 및 전화 따라야한다는이 수단 super.dispose
끝에 당신의 dispose
때문에 방법 mixin
에의 State
프레임 워크에서이이 경우 기대합니다.
예를 들면 다음 TickerProviderStateMixin
과 어설 말 :SingleTickerProviderStateMixin
super.dispose
super.dispose ()를 호출하기 전에 모든 티커를 [..]에 폐기해야합니다.
또 다른 예 : and AutomaticKeepAliveMixin
in 로직을 실행 합니다.initState
dispose
당신의 시작 initState
과 함께super.initState
하고 결국 당신 dispose
과super.dispose
당신이 추가 쉽고 안전을하려면 mixin
당신에들 State
.
또한 State
프레임 워크에서 문서에 설명 된대로 수퍼 메소드를 호출 할 것으로 예상하므로 다른 라이프 사이클 메소드 (겹쳐 쓰는 메소드)에 대한 문서를 따르십시오 .
따라서 다음을 수행해야합니다.
void initState() {
super.initState();
//DO OTHER STUFF
}
그러나 실제로는 중요 하지 않습니다 State
. 다음에서 설명하고 심지어 믹스 인에서도 설명 할 수있는 것으로 판단하는 어설 션에만 중요하므로 프로덕션 앱에는 영향을 미치지 않습니다.
State
Pablo Barrera 와 CopsOnRoad 의 이전 두 가지 대답 은 문제의 진실이 실제로 중요하지 않으며 멀리 볼 필요 가 없기 때문에 오해의 소지 가 있다고 생각합니다.
유일한 행동 super.initState
과 super.dispose
에 걸릴 State
클래스 자체는 주장 하고 있기 때문에 assert
-statements 만 평가됩니다 디버그 모드 , 그것은 생산 모드에서, 즉, 모든 빌드 번 응용 프로그램에서 중요하지 않습니다.
다음에 는 추가 믹스 인이 없을 때 실행되는 모든 코드 인, super.initState
그리고 super.dispose
수행 할 작업을 안내합니다 State
.
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
디버그 모드에서만 변경 되도록 보장하기 때문에 좋은 트릭입니다 (- assert
문은 디버그 모드에서만 실행 됨).
이것은 당신이 당신의 자신의 방법으로 super.dispose
어딘가에 전화 하는 한, 추가 기능을 추가하는 믹스 인 없이는 가치를 잃지 않을 것입니다.
initState()
방법이 하나뿐 assert(...)
이므로 super.initState()
프로덕션 앱에서 전화 를 걸면 어떤 이점이 있습니까?
mustCallSuper
이후로 2 년 넘게 Flutter 팀이이 방법을 도입 함으로써 마음이 멀다는 것을 의미 합니다. 거기에 배치하면 어떤 이점이 있습니까?
mixin
여전히 이것에 대한 단일 진술이 있을 것 initState
입니다 assert(...)
. 따라서 super.initState()
프로덕션 앱을 호출하는 것의 중요성은 무엇 입니까?
super.initState()
항상 initState
메소드 의 첫 번째 행이어야합니다 .
문서에서 :
initState () : 이것을 무시하면, 메소드가 super.initState ()를 호출하여 시작하는지 확인하십시오.
프레임 워크의 클래스에서 볼 수 있듯이 위젯이 초기화 된 후 모든 것을 수행해야합니다 super.initState()
.
처분의 경우 논리적으로 다른 방법으로 먼저 모든 것을 수행 한 다음을 호출 super.dispose()
합니다.
@override
void initState() {
super.initState();
// DO STUFF
}
@override
void dispose() {
// DO STUFF
super.dispose();
}
새로운 상태 저장 위젯이 위젯 트리에 추가 될 때마다 기본적으로 initState가 호출됩니다. 이제 super.initState는 위젯의 기본 클래스에 대한 기본 구현을 수행합니다. 기본 클래스에 따라 super.initState 전에 호출하면 문제가 발생할 수 있습니다. 따라서 이런 방식으로 initState를 호출하는 것이 좋습니다.
@override
void initState() {
super.initState();
// DO STUFF
}
dispose
반대 이기 때문에 약간의 결함이 있습니다. 프레임 워크는 super.dispose
마지막 에 전화 를 기대 하지만 권장 사항은 맞습니다.