[Flutter] notifyListeners() 안전하게 사용하기 (ChangeNotifier was used after being disposed)

Tykan·2022년 5월 17일
1

🤯 ChangeNotifier was used after being disposed

ChangeNotifer를 사용하다 보면 종종 만날 수 있는 에러다.

특히 비동기 함수에 notifyListners()를 걸어놓은 경우에
예기치 못한 앱 흐름에서 발생할 수 있다.

notifyListners()를 호출했지만, 이미 해당 ChangeNotifer 클래스가 disposed 됐다는 오류다.

setState() called after dispose().
위 오류랑 같은 맥락이다.

💫 안전하게 notifyListeners() 호출하기

setState() called after dispose(). 을 해결했던 방법과 동일하다.

setState()는 어떻게 안전하게 호출했나?

  
  void setState(VoidCallback fn) {
    if (mounted) {
      super.setState(fn);
    }
  }

State 클래스의 mounted 값을 통해 해당 클래스가 위젯트리에 존재하는지
확인하고 나서 setState()를 호출하도록 오버라이드했다.

notifyListeners() 에서는?

마찬가지로 ChangeNotifer가 dispose 됐는지 알 수 있으면 된다.

class MyNotifier extends ChangeNotifer {
  
  //  mounted 처럼 사용할 bool 변수 선언
  bool _disposed = false;
  
  // dispose 할 때 _disposed -> true
  
  void dispose() {
    _disposed = true;
    super.dispose();
  }

  // _disposed == false 일 때만, super.notifyListeners() 호출!
  
  notifyListeners() {
    if (!_disposed) {
      super.notifyListeners();
    }
  }
}
profile
개발자 Theo :: 고민은 성장의 힘

1개의 댓글

comment-user-thumbnail
2022년 11월 24일

감사합니다! 고민거리가 하나 줄었네요 ㅎㅎ

답글 달기