Don't use 'BuildContext's across async gaps.
Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check.
- ๋ธ๋ก์ผ๋ก ๋ก๊ทธ์ธ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์๋ฅผ ์์ฑํ๊ณ ์์๋ค.
- ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ๋ฉ์ธํ๋ฉด์ผ๋ก ์ด๋ํด์ผํ๊ธฐ ๋๋ฌธ์ view์์ context๋ฅผ ๋ฐ์์ผ๋ง ํ๋ค.
- ํ์ง๋ง ๋ก๊ทธ์ธ ํจ์(๋น๋๊ธฐ)์์์๋ context๋ฅผ ๊ฑด๋ค์ฃผ์ง ๋ง๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ๋ด๋ค.
๋ฌธ์ ์์ธ
BuildContext
BuildContext ๋ ์์ ฏํธ๋ฆฌ์์ ํด๋น ์์ ฏ์ด ํธ๋ฆฌ ์ด๋๋ถ๋ถ์ ์์นํ๊ณ ์๋์ง ์ ์ ์๋ ์ ๋ณด์ด๋ค. ์ฆ ๋ค์ด๋ฐ ๊ทธ๋๋ก ๋น๋ํ๋๋ฐ ํ์ํ ์ ๋ณด(๋ฌธ๋งฅ)์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. ํ๋ฌํฐ์์ UI๋ฅผ ๊ทธ๋ ค๋ผ ๋ build context๋ ํต์ฌ์ ๋ณด๋ก ์์ฉํ๋ค. ์ด์ ๋ ๋ ๋๋ง ๋ฐฉ์ ๋๋ฌธ์ด๋ค.
๊ณต์๋ฌธ์์์ ํ๋ฌํ
์ ๋ ๋๋ง ๋จ๊ณ๋ ํฌ๊ฒ 3๊ฐ์ง Layout, Paint, Composition ๋จ๊ณ๋ก ์๊ฐํ๊ณ ์๋ค. Layout phase์์๋ RenderTree๊ฐ ์์์์ ฏ๋ถํฐ ํ์์์ ฏ๊น์ง constraints๋ฅผ ์ ๋ฌํ๊ณ ๋ค์ ํ์์์ ฏ๋ถํฐ ์์์์ ฏ๊น์ง size๋ฅผ ์ ๋ฌํ๋ค. ๋น์ฐํ ์ด์ผ๊ธฐ์ด์ง๋ง ์์๋ถํฐ ์ต์/์ต๋ ์ ์ฝ์กฐ๊ฑด์ด ๋ง์ง๋ง ํ์ ์์ ฏ ์ ์ฝ๊น์ง ๊ณ์ฐ์ด ๋๊ณ ๋์์ผ ์ฌ์ด์ฆ๊ฐ ๊ฒฐ์ ๋๊ณ ๊ฒฐ์ ๋ ์ฌ์ด์ฆ๋ ํ์๋ถํฐ ์์๊น์ง ์ ๋ฌํ๋ค. ์ด๋ BuildContext ๋ฅผ ์ฌ์ฉํด ํ์์์ ฏ์ ๋์ด๊ฐ๊ณ ์ ๋ณด๋ฅผ ๋ฟ๋ฆฌ๊ณ ํน์ ์์์์ ฏ์ ๋์ด๊ฐ์ ์ ๋ณด๋ฅผ ๋ฟ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค. ์ฆ buildcontext๊ฐ UI๋ฅผ ๊ทธ๋ฆฌ๋ ๋ฐ ํ์ํ ์ ๋ณด์ ๋ฌ์ ์์ด ํต์ฌ์ ์ธ ์ญํ ์ ํ๋ ๊ฒ์ด๋ค.
async Build Context
์ด๋ ๋ง์ฝ ๋น๋๊ธฐํจ์ ๋ด๋ถ๋ก์ง์์ build context๋ฅผ ๋น๋๊ธฐ๋ก ์ฃผ๊ณ ๋ฐ์ผ๋ฉด ์ด๋ค๋ฌธ์ ๊ฐ ์๊ธธ๊น? ๋จผ์ ๊ธฐ๋ณธ์ ์ ๋ ๋น๋๊ธฐ ์์ ์ ์์ ์ ์๋ฃ์์ ์ ์์ธกํ ์ ์๋ค. ๋ฐ๋ผ์ ์์ ์ด ์๋ฃ๋์์ ๋ ์ด๋ค ์ํ๋ณํ๊ฐ ์ผ์ด๋ฌ๋์ง ์ ์ ์๋ค. ์ฌ๊ธฐ์ ๋ชจ๋ ์ด์๊ฐ ์ถ๋ฐํ๋ค.
๊ฐ์ฅ ์ฒซ๋ฒ์งธ๋ก Stale Data ์ด์์ด๋ค. Stale์ "์ฝ๊ฐ ์ํ" ์ด๋ ๋ป์ผ๋ก ๋ค์ด๋ฐ ๊ทธ๋๋ก ์ ๋ฐ์ดํธ ๋์ง ์๋ "์ํด๋ฒ๋ฆฐ" ๋ฐ์ดํฐ(context)๋ฅผ ์ฐธ์กฐํ๊ณ ์์ ์๋ ์๋ค๋ ๊ฒ์ด๋ค. ๋ด๋ถ๋ก์ง์์ context๋ฅผ ๋ฐ์์ I/O ์์ ์ ํ๋ฌ ๋ ๋ฌ๋๋ฐ ๊ทธ์ฌ์ด์ context ๋ณํ๊ฐ ์๊ฒ ๋๋ค๋ฉด I/O ์์ ์ ํ๋ฌ ๋ ๋ ์์ ์ ์ฌ์ ํ "์ํ" context๋ฅผ ํตํด ์์ ์ ํ๊ณ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฆฌํดํ๋ฉฐ ๊ทธ ์ฌ์ด context ๋ณํ๋ฅผ ๋ฐ์ํ์ง ๋ชปํ๋ ๊ฒ์ด๋ค.
๋ง์ฝ ๋น๋๊ธฐ ์์ ์ด ์คํ๋๋ ๋์ ๋ค๋ฅธ ํ๋ฉด์ผ๋ก ์ด๋ํด์ context ๊ฐ ์๋ฉธ๋์๋ค๋ฉด ๋น๋๊ธฐ์์ ์ ์๋ฉธ๋ context๋ฅผ ์ฐธ์กฐํ๋ฉด์ ๋ฐํ์ ํฌ๋์ฌ๊ฐ ๋ฐ์ํ ์๋ ์๋ค. ์์ ์ฝ๋์์ ๋น๋๊ธฐ ์์ (Future.delayed)์ด ์๋ฃ๋ ํ, context๊ฐ ์ฌ์ ํ ์ ํจํ์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ ํ ํ๋ฉด์ด ๋ณ๊ฒฝ๋์ด ํด๋น ์์ ฏ์ด ํธ๋ฆฌ์์ ์ ๊ฑฐ๋์๋ค๋ฉด, context๋ ๋ ์ด์ ์ ํจํ์ง ์๋ค. ์ด ์ํฉ์์ Navigator.of(context).pop()์ ํธ์ถํ๋ฉด ๋ฐํ์ ํฌ๋์๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
๋๋ฒ์งธ๋ Memory Leak ๊ฐ๋ฅ์ฑ์ด๋ค. ์์ ฏํธ๋ฆฌ๊ฐ ์ ๊ฑฐ๋๋ฉด ์ปจํ ์คํธ ๋ํ ์ ๊ฑฐ๋๋ฉด์ ํด๋น ์์ ฏ์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ด์ผํ๋ค. ํ์ง๋ง ์์ ฏ ์ ๊ฑฐ ๊ณผ์ ์ด ๋น๋๊ธฐ ์์ ์ฌ์ด์ ๋ฐ์ํ๋ค๋ฉด ๋น๋๊ธฐ ์์ ์ ์ฌ์ ํ ์ฌ๋ผ์ง context๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋ฉด์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์๋ ์๋ค. ์์ ์์์ฒ๋ผ ๋ฐํ์ ํฌ๋์ฌ๊ฐ ๋ฐ์ํ๋ฉด ๊ทธ๋๋ง ์ ์ ์์ง๋ง ๋ง์ฝ ๋ณด์ด์ง ์๊ฒ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐ์์ํค๊ณ ์๋ค๋ฉด ์ฐพ๊ธฐ ์ฝ์ง ์์ ๊ฒ์ด๋ค.
๋ฌธ์ ํด๊ฒฐ
๋ฌธ์ ํด๊ฒฐ๋ฐฉ๋ฒ์ ํฌ๊ฒ 3๊ฐ์ง๊ฐ ์๋ค.
- Navigator Key (ํน์ Global Key)
- then ๋ฉ์๋
- mounted ์ฒดํฌ (๊ณต์๋ฌธ์ ์ถ์ฒ)
1. Navigator key (or Global Key)
Navigator key (or Global Key)๋ ์์ ฏ ํธ๋ฆฌ ๋ด์์ ํน์ ์์ ฏ์ ๊ณ ์ ํ๊ฒ ์๋ณํ๋ค. (key๋ฅผ ํตํ ์์ ฏ ์๋ณ์๋ฆฌ๋ ์ด๊ณณ์ ์ ๋ฆฌ)
์ฐธ์กฐํ๋ ค๋ ์์ ฏ์ Key๋ฅผ ์ ์ธํ์ฌ ๋น๋๊ธฐ๊ฐ ์ฐ์ด๋ ๊ณณ์์ ํค๋ฅผ ํตํด context์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ ๋น๋๊ธฐ ํจ์์์ currentState != null ์์ ํ์ธํ๊ณ ์์ ์ ์งํํ๊ณ ์๋ค. ์ด๋ ๊ฒ ์ฐธ์กฐ ์ํ๋ฅผ Key๋ก ํ์ธํ๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ๋ก ์ธํ ํฌ๋์ฌ์ ๋ฉ๋ชจ๋ฆฌ๋์๋ฅผ ๋ฐฉ์งํ ์ ์๋ค. ๊ฐ์ธ์ ์ผ๋ก ๋ง์ฝ ํ๋ก์ ํธ ๋ฃฐ์ Key์ฌ์ฉ์ผ๋ก ์ ํ๋ฉด ํน์ ํ์ผ์ Key๋ฅผ ๋ชจ๋ ์ ์ฅํด์ Apps_Key ํํ๋ก ์ฌ์ฉํ๋ฉด ์ข๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
2. Then method
then ์ ์ด์ฉํ ๋ฐฉ๋ฒ์ Closure ํจ์์ ์บก์ณ๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ์ด๋ค. ํด๋ก์ ๋ ํจ์๊ฐ ์ ์ ๋ ๋ ํจ์ ์ค์ฝํ์ ์๋ ๋ณ์๋ฅผ "์บก์ณ"ํด์ ๋์ค์ ์ฌ์ฉํ๋ค. ์ด๋ฌํ ํน์ฑ ๋๋ถ์, ํจ์๊ฐ ์คํ๋๋ ์์ ์ ์๋ณธ ์ค์ฝํ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. ์ ์์ ์์ ScaffoldMessenger๋ context ์ฐธ์กฐ๋ฅผ "์บก์ณ"ํ๊ฒ ๋๋ค. ํจ์๊ฐ ์คํ๋๊ธฐ ์ ์ ์๋ณธ ์ปจํ ์คํธ๋ฅผ ์บก์ณํจ์ผ๋ก์จ ๋น๋๊ธฐ ํจ์๊ฐ ๋๋ ์ดํ ์๋ณธ ์ปจํ ์คํธ๋ฅผ ์ฐธ์กฐํ๋ฉฐ ์ ํจ์ฑ ํ๋จ์ ํ๊ฒ ๋๋ค.
(24.08.02 ์์ )
then ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ํจ์ ๋ด๋ถ์์ mount ์กฐ๊ฑด์ ๊ฑธ๊ฑฐ๋ try-catch๋ก ์ ์ด์ฃผ์ด์ผํ๋ค. ์๋ณธ context์ฐธ์กฐ๋ฅผ ์บก์ณํ๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ์ง๋ง ๋ง์ฝ ์ปจํ ์คํธ๊ฐ ์์ ์ฌ๋ผ์ง ๊ฒฝ์ฐ์๋ ํฌ๋์ฌ๊ฐ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
3. chek mounted
mounted ์์ฑ์ Flutter์์ ์ํ(State) ๊ฐ์ฒด๊ฐ ํธ๋ฆฌ์ ์ฐ๊ฒฐ๋์ด ์๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ Bool ๊ฐ์ด๋ค. ์์ ฏ์ด ํธ๋ฆฌ์ ์ถ๊ฐ๋์์ ๋ mounted๋ true๊ฐ ๋๋ฉฐ, ์์ ฏ์ด ํธ๋ฆฌ์์ ์ ๊ฑฐ๋ ๋ mounted๋ false๊ฐ ๋๋ค. ์ฆ mounted๋ State ๊ฐ์ฒด์ ์์ฑ ์ค ํ๋๋ก, ํด๋น ์์ ฏ์ด ํธ๋ฆฌ์ ์ ๋๋ก ๋ง์ดํธ๋์ด(์ฌ๋ผ์)์๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ธ๋ค. mounted๋ ์์ ฏ์ด ์๋ช ์ฃผ๊ธฐ ๋์ ํธ๋ฆฌ ๋ด์ ์กด์ฌํ๊ณ ์๋์ง๋ฅผ ํ์ธํ๋ ๋ฐ ์ ์ฉํ ์์ฑ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. (ํ์ง๋ง Stateful ์์ ฏ์์๋ง ์ธ ์ ์๋ค๋๊ฒ ๋จ์ )
mounted ์ฌ๋ถ๋ฅผ ํตํด ์์ ฏํธ๋ฆฌ์ context ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค. mounted ๋ ์์ ฏ ์๋ช ์ฃผ๊ธฐ์ ๋ฐ๋ผ ์๋์ ๊ฐ์ด ๊ฐ์ด ๋ณํ๋ค.
์ด๋ฌํ mounted ๊ฐ ๋ณํ๋ฅผ ํตํด ์์ ฏ ์๋ช ์ฃผ๊ธฐ์ ๋ฐ๋ผ ๋น๋๊ธฐ ํจ์์์์ context ์ด์ฉ์ ์์ ํ๊ฒ ํ ์ ์๋ค.