setState() or markNeedsBuild() called during build.
작업을 하다가 가끔씩 이런 오류메시지를 만날 수 있습니다. 해당 오류 메시지는 위젯이 현재 빌드 중일 때 setState()나 markNeedsBuild() 같은 메서드를 호출하면 안 되기 때문입니다. 간단하게 요약하면, 이 오류는 빌드 중에 상태 변경을 시도했기 때문에 발생합니다.
@override
void initState() {
super.initState();
widget.itemListModel.fetch();
}
저 같은 경우에는 프로바이더를 사용하면서 initState단계에서 notifyListener() (setState()라고 생각해 주세요.) 함수가 포함된 메서드를 실행하면서 발생했습니다. 화면을 그리기 전에 initState의 코드를 먼저 실행하고 해당 코드에는 비동기 작업을 수행하고 끝나면 화면을 다시 그리게 요청하는 notifyListener 함수가 포함되어 있습니다.
오류가 나는 단계를 글로 보자면
(initState) -> (비동기작업 수행) -> build 화면그리기 시작 -> build과정 중에 비동기 작업이 끝나서 화면을 다시 그리게 요청하는 notifyListener() 실행 -> 이 과정 중에서 build가 끝나지 않았는데 다시 화면을 그리려 해서 나는 오류입니다.
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
widget.itemListModel.fetch();
});
}
간단한 해결 방법은 WidgetsBinding.instance.addPostFrameCallback((timeStamp) {}); 를 사용해서 build가 끝난 다음 실행하도록 강제할 수 있습니다.
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {}); 은 Flutter에서 현재 프레임이 끝난 후에 실행할 작업을 예약하는 방법입니다. 이를 통해 화면이 완전히 렌더링된 후에 원하는 작업을 안전하게 수행할 수 있습니다.
'Flutter > 오류해결' 카테고리의 다른 글
[Flutter] Error: The type 'JSObject' can't be used as supertype. (0) | 2024.08.08 |
---|---|
[Flutter] command not found: flutterfire (0) | 2024.07.23 |
[Flutter] Upgrader Package Not Functioning When Changing Language: How to Fix the Issue (0) | 2024.07.02 |
[Flutter] error: cannot find symbol (0) | 2024.06.21 |
[Flutter] arb 파일 안열리는 문제 해결 (0) | 2024.06.20 |