[Flutter] didChangeDependencies 현재 스크린에서만 호출

didChangeDependencies()

didChangeDependencies는 플러터의 생명주기와 관련된 함수 중 하나로, initState와 마찬가지로 위젯을 생성할 때 호출하지만 initState와 다르게 의존성이 있는 위젯이 변경될 때마다 호출된다..고 한다. 플러터 State를 잘 몰라서 자세한것 까진 모르겠다.

Admob의 적응형 배너에 사용되는 didChangeDependencies

평생 몰랐을거같은 didChangeDependencies()가 애드몹 적응형 배너의 예시코드에 있어서 사용이 필요했다.

https://developers.google.com/admob/flutter/banner/anchored-adaptive?hl=ko

_loadAd() 메서드를 initState에 넣지 않고 didChangeDependencies에서 호출한 이유는 다른배너와 다르게 적응형배너는 디바이스의 사이즈를 받아와야 하기 때문이다. 일반적으로 didChangeDependencies는 위젯에 어딘가 의존성이 걸려있을 때 사용되는 듯 하다.

다른 스크린에서도 호출되는 didChangeDependencies

이제부터 이 글을 쓴 원인인데, A Screen에 A Tab이 있고, A Tab에서 B Screen으로 이동해서 어떤 상호작용을 했더니 A Screen의 didChangeDependencies이 호출되었다. 좀 알아보니 didChangeDependencies는 위젯트리에 변동이 발생하면 호출해버린다. 나는 A Screen에서 B Screen으로 이동하기 위해 Navigator.pushNamed을 썼고, 당연히 스택에 A Screen이 남아있어서 A Screen의 didChangeDependencies이 호출되었다.

Navigator.pushNamed(context, BScreen.routeName);

현재 스크린에서만 didChangeDependencies 호출하기

해결방법은 비교적 간단하다. 현재 스크린에서만 didChangeDependencies에서 원하는 코드를 호출하도록 수정하면 된다.

@override
void didChangeDependencies() {
  if (ModalRoute.of(context)?.isCurrent ?? false) {
    // 원하는 코드
  }
  super.didChangeDependencies();
}

Leave a Comment