setState() called after dispose() 발생 원인과 해결 방법
setState()는 StatefulWidget에서 Widget을 업데이트할 때 사용된다. Widget을 업데이트하기 위해 setState()를 사용하면 의도하지 않게 setState() called after dispose()를 접한다. 이 문서는 에러 발생 원인과 해결 방법을 정리한다.
발생 원인
이 에러의 발생원인은 Widget이 화면에서 해제된 이후에 setState()가 호출되었기 때문이다. setState() 함수는 StatefulWidget lifecycle과 관련이 깊다. setState()는 화면을 갱신할 때 사용되기 때문인데, 아직 Widget이 화면에 생성되지 않았거나 이미 사라진 경우라면 화면 갱신을 할 수 없기 때문이다. 화면에 Widget이 연결되어있는지 확인하는 property가 있다. bool 타입의 mounted property를 통해 화면에 Widget이 있는지 확인할 수 있다.
mounted == true 의미
mounted가 true일 경우, 위젯을 제어할 수 있는 buildContext에 접근이 가능하다는 의미가 된다. buildContext에 접근이 가능해야만 setState()를 호출할 수 있다. createState() 함수가 호출되면 mounted는 true가 된다.
mounted == false 의미
mounted가 false일 경우, buildContext에 접근할 수 없다는 의미이며 setState()를 호출할 경우 에러가 발생한다. 모든 프로세서가 종료되면 mounted는 false가 된다.
해결 방법
setState()를 mounted property가 true인지 확인한 뒤 호출한다.
if (this.mounted) {
setState((){
...
}
}
댓글
댓글 쓰기