[Flutter] don't use 'buildcontext's across async gaps

티라노·2025년 2월 17일

Today I Learned

목록 보기
38/38
post-thumbnail

async 함수에서 buildcontext를 사용할 때 생기는 문제에 대해 알아보자

어떤 오류인가요?

이 함수를 살펴보자.
async 함수로 첫 줄에서 getPlayLists 라는 비동기 함수를 호출한 뒤 context.pop 을 수행한다. 그런데 BuildContext를 참조하기 전 context.mounted라는 조건을 달아두었다. 코드 구성에서 알 수 있듯이 오늘의 주제가 된 오류는 비동기 함수에서 BuildContext를 참조하려고 할 때 발생하는 이슈이다.

오늘은 이 조건이 왜 필요한지, 지키지 않으면 어떤 문제가 발생하고 어떻게 해결할 수 있는지 알아보자.

발생 원인은?

Flutter에서 위젯은 트리의 구성 요소가 변동함에 따라 얼마든지 삭제하고 새로 생성될 수 있다. 그런데 만약 비동기 함수가 작업하는 동안 위젯에 변동사항이 생긴다면, 그 다음에 참조해야 하는 context 또한 이전과 달라졌을 것이다.
이런 까닭에 유효하지 않은 BuildContext를 참조할 가능성이 있으므로 당장 오류가 발생하지 않더라도 안정성이 떨어지는 코드 구성이라고 할 수 있다.

해결 방법

1) 유효성 검사

BuildContext를 사용하기 전에 이 context가 아직 유효한지(현재 위젯 트리에 마운트되어있는지) 검사하는 방법이다.

// 함수에서
if(mounted){}

// 위젯에서
if(context.mounted){}

2) BuildContext 참조하지 않음

state등을 활용해서 ui를 조정하는 방식이다. 위젯이 자주 리뉴얼되고 다양한 상태가 얽혀 있는 페이지를 구성한다면 context를 활용한 네비게이션을 남용하기보다 페이지 자체의 상태 관리를 이용하자.

0개의 댓글