끝이나 시작 부분에 super.initState를 호출해야합니까?


10

super.initSate()in flutter 를 어디로 불러야할지 혼란 스러울 까요? 일부 코드 예제에서는 처음과 끝에서 호출됩니다. 차이가 있습니까?

나는 이것을 구글하려고 시도했지만이 함수 호출의 위치에 대한 설명을 찾지 못했다.

어느 것이 맞습니까?

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

또는

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

답변:


4

그것은 중요합니다 mixin(그리고 당신 때문에 그것 때문에 )

Flutter 프레임 워크 의 패러다임 은에서의 라이프 사이클 메소드를 대체 할 때 수퍼 메소드를 호출하는 것 State입니다. 이것이 주석deactivate 이있는 이유 입니다. 또한 일부 는 함수의 특정 지점에서 해당 수명주기 메소드의 수퍼 메소드를 호출 할 것으로 예상합니다.mustCallSuper
mixin

당신은 문서 및 전화 따라야한다는이 수단 super.dispose 끝에 당신의 dispose때문에 방법 mixin에의 State프레임 워크에서이이 경우 기대합니다.
예를 들면 다음 TickerProviderStateMixin어설 말 :SingleTickerProviderStateMixin super.dispose

super.dispose ()를 호출하기 전에 모든 티커를 [..]에 폐기해야합니다.

또 다른 예 : and AutomaticKeepAliveMixinin 로직을 실행 합니다.initStatedispose

결론

당신의 시작 initState과 함께super.initState 하고 결국 당신 disposesuper.dispose 당신이 추가 쉽고 안전을하려면 mixin당신에들 State.
또한 State프레임 워크에서 문서에 설명 된대로 수퍼 메소드를 호출 할 것으로 예상하므로 다른 라이프 사이클 메소드 (겹쳐 쓰는 메소드)에 대한 문서를 따르십시오 .

따라서 다음을 수행해야합니다.

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

그러나 실제로는 중요 하지 않습니다 State. 다음에서 설명하고 심지어 믹스 인에서도 설명 할 수있는 것으로 판단하는 어설 션에만 중요하므로 프로덕션 앱에는 영향을 미치지 않습니다.

중요하지 않습니다 State

Pablo BarreraCopsOnRoad 의 이전 두 가지 대답 은 문제의 진실이 실제로 중요하지 않으며 멀리 볼 필요 없기 때문에 오해의 소지있다고 생각합니다.

유일한 행동 super.initStatesuper.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 어딘가에 전화 하는 한, 추가 기능을 추가하는 믹스 인 없이는 가치를 잃지 않을 것입니다.


1
Flutter 공식 문서는 좋지 않습니다 :( 답변 주셔서 감사합니다 :)
CopsOnRoad

설명해 주셔서 감사합니다. 설명 initState()방법이 하나뿐 assert(...)이므로 super.initState()프로덕션 앱에서 전화 를 걸면 어떤 이점이 있습니까?
CopsOnRoad

1
정말 고마워. 이제 말이 되네요! 그래서 나는 더 안전한쪽에 있고 좋은 프로그래밍 연습을 위해 코드의 시작 부분에 유지하는 것이 좋습니다.
K Vij

@creativecreatororbebe가 아니라면 Flutter 팀이 설립 된 mustCallSuper이후로 2 년 넘게 Flutter 팀이이 방법을 도입 함으로써 마음이 멀다는 것을 의미 합니다. 거기에 배치하면 어떤 이점이 있습니까?
CopsOnRoad

@creativecreatororbe not not 팀이 그것을 만들었더라도 mixin여전히 이것에 대한 단일 진술이 있을 것 initState입니다 assert(...). 따라서 super.initState()프로덕션 앱을 호출하는 것의 중요성은 무엇 입니까?
CopsOnRoad

3

super.initState()항상 initState메소드 의 첫 번째 행이어야합니다 .

문서에서 :

initState () : 이것을 무시하면, 메소드가 super.initState ()를 호출하여 시작하는지 확인하십시오.


2

프레임 워크의 클래스에서 볼 수 있듯이 위젯이 초기화 된 후 모든 것을 수행해야합니다 super.initState().

처분의 경우 논리적으로 다른 방법으로 먼저 모든 것을 수행 한 다음을 호출 super.dispose()합니다.

@override
void initState() {
  super.initState();
  // DO STUFF
}

@override
void dispose() {
  // DO STUFF
  super.dispose();
}

고마워. 그러나 일부 코드 예제에서이를 발견했습니다. 그것은 initState 메소드의 끝에서 호출됩니다 ...
K Vij

그게 내가 말한거야
Pablo Barrera

0

새로운 상태 저장 위젯이 위젯 트리에 추가 될 때마다 기본적으로 initState가 호출됩니다. 이제 super.initState는 위젯의 기본 클래스에 대한 기본 구현을 수행합니다. 기본 클래스에 따라 super.initState 전에 호출하면 문제가 발생할 수 있습니다. 따라서 이런 방식으로 initState를 호출하는 것이 좋습니다.

@override
void initState() {
  super.initState();
  // DO STUFF
}

추론은 dispose반대 이기 때문에 약간의 결함이 있습니다. 프레임 워크는 super.dispose 마지막 에 전화 기대 하지만 권장 사항은 맞습니다.
creativecreatoror

다른 것을 폐기하기 전에 super.dispose를 호출하면 기본 클래스에 의존하는 구성 요소가 충돌 할 수 있습니다.
Anirudh Sharma
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.