아래 오류는 플러터(flutter)를 처음 접하는 개발자부터 중급 이상의 개발자까지 두루 접하게 되는 문제인것 같아요!
저도 개발하면서 몇번이나 만났는지 몰라요ㅎㅎ 😆
Error
setState() called after dispose().
이 에러는 대부분의 경우 비동기 작업 중에 발생하는데, 해당 작업이 완료되기 전에 해당 위젯이 dispose되었을 때 발생합니다. 일반적으로 이 문제는 비동기 작업이 완료되기 전에 해당 위젯이 화면에서 사라지는 경우 발생하는데, 여기서는 시간 선택 후에 해당 위젯이 dispose되기 때문에 발생한 것 같네요.
이 문제를 해결하기 위해서는 비동기 작업이 완료된 후에 setState()를 호출하지 않도록 해야합니다.
해당 코드를 작동할 때 나오는 로그에요ㅎㅎ 같이 살펴볼까요?
로그
setState() called after dispose()
위의 로그를 자세히 읽어보면 몇가지 해결 방법을 추천해 주고 있네요~~ 😇
우선, 이 에러가 발생한 원인부터 살펴봐요.
원인
해당 에러는 비동기 작업이 완료된 후에 해당 위젯이 dispose되었을 때 발생합니다. 여기서는 시간 선택 후에 해당 위젯이 dispose되기 때문에 발생한 것 같네요.
그럼 어떻게 해결해야할까요?
몇가지 해결책을 알려드릴게요 😎
해결책
- 비동기 작업이 완료된 후에만 setState()를 호출하도록 변경하기
Future initTimePicker() async { final TimeOfDay picked = await showTimePicker( context: context, initialTime: new TimeOfDay(hour: selectedDate.hour, minute: selectedDate.minute), ); if (picked != null) { selectedDate = new DateTime(selectedDate.year, selectedDate.month, selectedDate.day, picked.hour, picked.minute); setState(() {}); // move setState() here } }
- dispose() 메소드에서 비동기 작업 취소하기
@override void dispose() { // cancel any ongoing async tasks // 예시: _timer.cancel(); super.dispose(); }
- 비동기 작업이 완료된 후에만 setState()를 호출하는 방법을 찾기
'Flutter' 카테고리의 다른 글
error Looking up a deactivated widget's ancestor is unsafe [Flutter] (0) | 2023.11.01 |
---|---|
한번에 여러 개의 파라미터 전달하기 Multiple Parameters Using go_router in Flutter (0) | 2023.11.01 |
No MediaQuery ancestor could be found starting from the context that was passed to MediaQuery.of() [flutter] error (0) | 2023.11.01 |
Flutter 빌드 실패 Failed to build gradle [Flutter] Android (0) | 2023.11.01 |
Getting null in Facebook access token [Flutter] error (0) | 2023.10.30 |
No GoRouter found in context [flutter] error (0) | 2023.10.30 |
Flutter Error: Vertical viewport was given unbounded height (0) | 2023.10.17 |
Firebase Firestore에서 'in' 연산자를 사용할 때 발생하는 오류 해결하기 (0) | 2023.10.17 |