ChangeNotifer를 사용하다 보면 종종 만날 수 있는 에러다.
특히 비동기 함수에 notifyListners()를 걸어놓은 경우에
예기치 못한 앱 흐름에서 발생할 수 있다.
notifyListners()를 호출했지만, 이미 해당 ChangeNotifer 클래스가 disposed 됐다는 오류다.
setState() called after dispose().
위 오류랑 같은 맥락이다.
setState() called after dispose().
을 해결했던 방법과 동일하다.
void setState(VoidCallback fn) {
if (mounted) {
super.setState(fn);
}
}
State 클래스의 mounted 값을 통해 해당 클래스가 위젯트리에 존재하는지
확인하고 나서 setState()를 호출하도록 오버라이드했다.
마찬가지로 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();
}
}
}
감사합니다! 고민거리가 하나 줄었네요 ㅎㅎ