๐ ์๋ฌ ๋ฉ์์ง
Assertion failed: file:///Users/jayoengchoi/flutter/packages/flutter/lib/src/widgets/navigator.dart:5645:12
!_debugLocked is not true
See also: https://docs.flutter.dev/testing/errors
- Presentation Layer๋ฅผ MVVM-C ํจํด์ผ๋ก ๋ก๊ทธ์ธ ์ ๋ฌด์๋ฐ๋ผ ์ฝ๋๋ค์ดํฐ๋ก ๋ค๋น๊ฒ์ดํ ํ๋ ์ฝ๋๊ฐ ์์๋ค.
- Navigator.push() ํธ์ถ ์ ์ฑ์ด ๊ฐ์ ์ข ๋ฃ(Crash) ๋๋ ํ์์ด ๋ฐ์ํ๋ค.
๐ ๋ฐ์ ์์ธ ๋ถ์
1๏ธโฃ _debugLocked๋?
Flutter์ Navigator๋ ์ค๋ณต ๋ค๋น๊ฒ์ด์ ํธ์ถ์ ๋ฐฉ์งํ๊ธฐ ์ํด _debugLocked ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ค.
- Navigator.push() ๋๋ Navigator.pop()์ด ํธ์ถ๋๋ฉด _debugLocked = true๊ฐ ๋์ด ์ ๋๋ฉ์ด์ ์ด ๋๋ ๋๊น์ง ๋ค๋ฅธ ๋ค๋น๊ฒ์ด์ ํธ์ถ์ ๋ง๋๋ค.
- _debugLocked == true ์ํ์์ ์ถ๊ฐ๋ก push()๋ฅผ ํธ์ถํ๋ฉด Assertion ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๐ ์ฆ, ๋ค๋น๊ฒ์ด์ ์ ๋๋ฉ์ด์ ์ด ๋๋๊ธฐ ์ ์ ์๋ก์ด push()๋ฅผ ํธ์ถํ๋ฉด ์ถฉ๋์ด ๋ฐ์ํ๋ค.
2๏ธโฃ navigatorKey.currentState == null
์๋ ์ฑ์ ์์์ ์ธ ๋ฉ์ธํ์ผ์ MaterialApp ์์ navigatorKey๋ฅผ ๋ฃ์ด์ฃผ์ด์ผํ๋ค. ํ์ง๋ง MVVM-C ํจํด์ ์ํด ํ๋ฉด์ ํ ๊ด๋ จ ์ฝ๋๋ ์ฝ๋๋ค์ดํฐ ๊ฐ์ฒด์ ์บก์ํํด ๋ ์ํ์๊ณ navigatorKey ๊ฐ ๋ฆ๊ฒ ํธ์ถ๋จ์ ๋ฐ๋ผ currentState == null ์ธ ์ํฉ์์ ์ฒซ ๋ทฐ์ ํ์ด ๋ฐ์ํ๊ณ ์์๋ค.
3๏ธโฃ navigatorKey.currentState == null๊ณผ _debugLocked์ ๊ด๊ณ
๐จ ์ง๋ฌธ: navigatorKey๊ฐ null์ด๋ฉด ์ _debugLocked ์๋ฌ๊ฐ ๋ฐ์ํ ๊น?
navigatorKey.currentState == null์ธ ์ํ์์ Navigator.push()๋ฅผ ํธ์ถํ๋ฉด Flutter๋ ์๋ก์ด NavigatorState๋ฅผ ์ฐพ๊ธฐ ์ํด build()๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ค.
์ด ๊ณผ์ ์์ ๋ค์๊ณผ ๊ฐ์ ์ผ์ด ๋ฐ์ํ๋ค:
- Navigator.push()๊ฐ ์คํ๋จ
- ์ด๋ navigatorKey.currentState == null์ด๋ฉด NavigatorState๋ฅผ ์ฐพ๊ธฐ ์ํด build()๊ฐ ๋ค์ ํธ์ถ๋จ.
- Flutter๊ฐ ์์ ฏ์ ๋ฆฌ๋น๋ํ๋ ๊ณผ์ ์์ _debugLocked๊ฐ ํ์ฑํ๋จ
- Navigator๋ ์ ๋๋ฉ์ด์ ์ ์์ํ๊ธฐ ์ํด _debugLocked = true๋ก ์ค์ ํจ.
- ํ์ง๋ง ์ด ๊ณผ์ ์์ ๋ค์ push()๊ฐ ์คํ๋ ๊ฒฝ์ฐ _debugLocked๊ฐ ์ด๋ฏธ true ์ํ์ด๋ฏ๋ก Assertion ์๋ฌ๊ฐ ๋ฐ์.
- ์ฆ, navigatorKey.currentState == null ์ํ์์ push()๋ฅผ ํธ์ถํ๋ฉด Navigator๊ฐ ์์ ํ ์ด๊ธฐํ๋์ง ์์ ์ํ์์ ๋์ํ๊ฒ ๋๊ณ , ์ด๋ก ์ธํด _debugLocked๊ฐ ์์์น ๋ชปํ ์ํ์์ ์ ์ง๋จ.
๐ ์ ๋ฆฌํ๋ฉด, navigatorKey.currentState == null ์ํ์์ ๋ค๋น๊ฒ์ด์ ์ ํธ์ถํ๋ฉด Flutter๊ฐ ๋ค๋น๊ฒ์ดํฐ๋ฅผ ๋ค์ ์ด๊ธฐํํ๋ ๊ณผ์ ์์ _debugLocked๊ฐ ์์๋ณด๋ค ์ค๋ ์ ์ง๋๋ฉฐ ์ถฉ๋์ด ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
๐ก ํด๊ฒฐ ๋ฐฉ๋ฒ
WidgetsBinding.instance.addPostFrameCallback() ํ์ฉ
WidgetsBinding.instance.addPostFrameCallback() ํจ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด _debugLocked = false ๊ฐ ๋์ด์ผ ๋ค์ ์ก์ ์ด ๋ค์ด๊ฐ๋ค. ์ฆ, ํ์ฌ UI ์ ๋ฐ์ดํธ ๋ฐ ์ ๋๋ฉ์ด์ ๋ฐ ์ ํ ์ด ์๋ฃ๋ ์ดํ์ ์คํ๋๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ด์ ์์ (navigator ๋น๋)๊ฐ ์๋ฃ๋์ด navigatorKey.currentState = null ์ด ์๋ ์ํ์์ ์์ ํ๊ฒ Navigator.push()๊ฐ ์คํ๋๋ค.