민프

[Flutter Error]Don't use 'BuildContext's across async gaps.Try rewriting the code to not reference the 'BuildContext' 본문

[Flutter Error]

[Flutter Error]Don't use 'BuildContext's across async gaps.Try rewriting the code to not reference the 'BuildContext'

민프야 2023. 12. 27. 17:03

 

        onPressed: () async {
          // async 키워드 추가
          bool isFirstGuide = await _getIsFirstGuide(); // await 키워드로 비동기 값을 기다림
            if (isFirstGuide) {
                Navigator.pushReplacement(
                  context,
                  MaterialPageRoute(
                    builder: (context) => PoseDetectorPage(
                      exerciseData: widget.exerciseData,
                      detailData: widget.detailData,
                    ),
                  ),
                );
              }
              .
              .
              .
Don't use 'BuildContext's across async gaps.Try rewriting the code to not reference the 'BuildContext'

개발을 하다가 위 코드에서 해당 경고가 나왔습니다.

결론부터 말씀드리자면, BuildContext가 유효하지 않을 수 있기 때문에 경고가 나왔습니다.

해결 방법은 아래 코드를 buildContext를 사용하는 부분 바로 위에 삽입해주시면 됩니다.

  if (!mounted) return; // BuildContext가 유요하지 않을 경우 return

 

if (!mounted) return; 구문을 추가함으로써 'BuildContext's across async gaps' 관련 오류가 해결된 이유는 mounted 속성이 현재 위젯의 BuildContext가 여전히 활성 상태인지 확인하기 때문입니다.

 

이는 async 함수에서 시간이 걸리는 작업(예: 네트워크 호출, 타이머, 사용자의 상호작용 등)을 수행하는 동안 위젯이 계속해서 활성 상태로 유지되는지를 확인합니다.

 

비동기 함수에서 작업을 기다리는 동안 (즉, await 키워드 사용 시) 사용자가 위젯을 나가거나 위젯 트리에서 해당 위젯이 제거될 수 있습니다. 이때, 위젯이 더 이상 활성 상태가 아니면 (즉, 위젯 트리에서 제거되어 mounted == false가 됨), BuildContext도 유효하지 않게 됩니다. 이 경우, Navigator와 같이 BuildContext를 사용하는 후속 작업을 수행하려고 하면 오류가 발생합니다.

 

정리하자면

if (!mounted) return;는 비동기 작업이 완료되고 돌아왔을 때 해당 위젯이 여전히 활성 상태인지 확인하고, 만약 위젯이 활성 상태가 아니면 (mounted == false), 함수에서 더 이상의 작업을 수행하지 않고 바로 반환합니다. 이 방법으로, BuildContext를 사용하는 코드가 위젯이 활성 상태일 때만 실행되도록 보장하여 위와 같은 오류를 방지할 수 있습니다.

Comments