State에서 context를 사용해야할 때

devkwon·2023년 3월 15일
0

문제 발생

어느 날 DropDown을 만드는 도중 문제가 생겼다.
바로 context를 통해 Bloc에서 데이터를 받아와야하는데 Stateful Widget의 initState()에서는 context에 접근이 불가능한 것이다. 그렇다고 build안에서 context에 접근하고 setState를 하면 무한 반복이 되므로 해당 방법도 통하지 않았다. 따라서 해결 방법이 무엇이 있을까 하다가 구글링으로 방법을 찾았다. 바로 didChangeDependencies()를 사용하는 것이다.

해결법

  @override
  void didChangeDependencies(){
    if (!this._isInitialized) {// Only
      final ..vm = context.read<...VM>();
      ..vm.getPrivacyLevel().then((value) {
        dropdownList=value!;
        dropdownValue=dropdownList.first;
        setState(() {
          print('done');
        });
      });
      this._isInitialized = true; 
    }
    super.didChangeDependencies();
  }

didChangeDependencies를 활용하는 방법인데,

didChangeDependencies는 해당 State의 dependency가 변경되었을 때 call되는 콜백메소드로 initState 후 호출된다. 또 다른 경우로는 이전의 호출이 나중에 build 되는 자식 위젯을 변경한 경우, 프레임워크에서 자식 개체가 변했다는 것을 알려주기 위해 호출한다.

또한 이 메소드는 context를 접근이 가능해서 우리가 원하는 문제를 해결할 수 있을 것으로 보였다. 하지만 여러번 호출이 될 가능성이 있어 예상치 못한 문제가 발생할 수 있으므로 flag 변수(_isInitialized)를 하나 넣어 한 번만 실행되도록 logic을 설정하였다. 결과는 대성공이었다.

0개의 댓글