포스트 작성자는 플러터뿐만 아니라 코딩 자체에 있어 완전 초짜임을 미리 밝힌다. 그래서 아래 설명 중 잘못된 내용이거나 엉망인 부분도 많을 것이다. 다만 코드 작성중에 오류를 맞이했고, 어떻게든 해결했기에 혹여나 다른 사람이 참고할 수 있도록 글을 남긴다.
QR코드 인식을 하다가 값을 받으면 다른 화면으로 넘어가는 코드를 작성하고 있었다.
Stateful위젯인 QRViewExample에 다음 메소드를 작성해 주었다.
그리고 아래와 같이 빌드할 때 실행되도록 작성했다.
이렇게 작성해보니 오류가 발생했다.
The following assertion was thrown while dispatching notifications for TestInt:
setState() or markNeedsBuild() called during build.~~~
위와 같은 문구로 시작하는 오류였다. 보아하니 '빌드가 되는 중에 setState하거나 또 Build해버리면 어쩌냐~'라고 하는 듯 했다. 듣고보니 맞는 말이긴 한데, 그래서 어떻게 하면 좋을지 몰랐다. 여기저기 검색해서 나온 방법들 중에서 addPostFrameCallback이라는 메소드를 활용하는 방법으로 이 문제를 해결했다. 아쉽게도 정확한 원리는 모른다.
그나마 조금 이해가 되었던 사이트
https://www.didierboelens.com/2019/04/addpostframecallback/
내 생각에 QRViewExample위젯이 stateful위젯이었기 때문에, 혹은 QR인식을 하려면 카메라에 보이는 정지된 장면을 반복해서 스캔하고 반복해서 해석해야 하기 때문에 이 화면의 위젯들은 끊임없이 rebuild되어야 했던 것 같다. 그래서 위에서 작성한 catchCam함수에 print함수를 넣으니 1초에 몇번씩이나 print함수가 반복되어 실행되는 것을 볼 수 있었다. 그 와중에 나는 '야! 인식했으면 얼른 창 띄워줘.'라고 칭얼대고 있었던 것이다. 그래도 방법을 모르니 계속할 수 밖에....ㅋ
'도전 > 플러터(Flutter)' 카테고리의 다른 글
플러터 QR인식 패키지(qr_code_scanner) (0) | 2023.01.13 |
---|---|
플러터 입력값(Input)을 받는 위젯, TextField와 TextFormField (0) | 2023.01.12 |