본문 바로가기
도전/플러터(Flutter)

플러터 addPostFrameCallback

by MWT 2023. 1. 13.

포스트 작성자는 플러터뿐만 아니라 코딩 자체에 있어 완전 초짜임을 미리 밝힌다. 그래서 아래 설명 중 잘못된 내용이거나 엉망인 부분도 많을 것이다. 다만 코드 작성중에 오류를 맞이했고, 어떻게든 해결했기에 혹여나 다른 사람이 참고할 수 있도록 글을 남긴다. 

 


QR코드 인식을 하다가 값을 받으면 다른 화면으로 넘어가는 코드를 작성하고 있었다.

Stateful위젯인 QRViewExample에 다음 메소드를 작성해 주었다.

만약 카메라가 QR코드를 인식하여 result값을 받으면 카메라를 멈추고 다른 페이지로 넘어간다.

 

그리고 아래와 같이 빌드할 때 실행되도록 작성했다.

 

이렇게 작성해보니 오류가 발생했다.


The following assertion was thrown while dispatching notifications for TestInt:
setState() or markNeedsBuild() called during build.~~~


위와 같은 문구로 시작하는 오류였다. 보아하니 '빌드가 되는 중에 setState하거나 또 Build해버리면 어쩌냐~'라고 하는 듯 했다. 듣고보니 맞는 말이긴 한데, 그래서 어떻게 하면 좋을지 몰랐다. 여기저기 검색해서 나온 방법들 중에서 addPostFrameCallback이라는 메소드를 활용하는 방법으로 이 문제를 해결했다. 아쉽게도 정확한 원리는 모른다.

addPostFrameCallback함수에 내가 실행시키려고 하는 메소드들을 넣어줬다.

 

 

그나마 조금 이해가 되었던 사이트

https://www.didierboelens.com/2019/04/addpostframecallback/

 

Flutter - addPostFrameCallback

Flutter - How can I show a Dialog the very first time I load a page? How can I do something once a build is complete?

www.didierboelens.com

내 생각에 QRViewExample위젯이 stateful위젯이었기 때문에, 혹은 QR인식을 하려면 카메라에 보이는 정지된 장면을 반복해서 스캔하고 반복해서 해석해야 하기 때문에 이 화면의 위젯들은 끊임없이 rebuild되어야 했던 것 같다. 그래서 위에서 작성한 catchCam함수에 print함수를 넣으니 1초에 몇번씩이나 print함수가 반복되어 실행되는 것을 볼 수 있었다. 그 와중에 나는 '야! 인식했으면 얼른 창 띄워줘.'라고 칭얼대고 있었던 것이다. 그래도 방법을 모르니 계속할 수 밖에....ㅋ