Android์์๋ ์์คํ
์์ ์ธ์ ๋ ์ง Activity๋ฅผ ์ข
๋ฃ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ํ๋์ด ํฌ๊ทธ๋ผ์ด๋์ ์์ง ์์ ๋ ๋๋ ๋ก์ผ์ผ ๋ณ๊ฒฝ๊ณผ ๊ฐ์ด ์ฒ๋ฆฌ๋์ง ์์ ๊ตฌ์ฑ ๋ณ๊ฒฝ์ผ๋ก ์ธํด Android์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ ๋ ๋ฐ์ํฉ๋๋ค.
Android๊ฐ Activity๋ฅผ ์ข
๋ฃํ์ ๋ ์ฌ์ฉ์๊ฐ ์ฒ์๋ถํฐ ๋ค์ ์์ํด์ผ ํ๋ ๊ฒ์ ํผํ๊ธฐ ์ํด ์์คํ
์ Activity๊ฐ ์ผ์ ์ค์ง๋ ๋ onSaveInstanceState(โฆ)
ํธ์ถํฉ๋๋ค. ์ฌ๊ธฐ์ ์ฑ์ Bundle
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด์ผ ํฉ๋๋ค. , ๊ทธ๋ฆฌ๊ณ ํ๋์ด ์์คํ
์ ์ํด ์ข
๋ฃ๋ ๊ฒฝ์ฐ ์์
์ด ์ฌ๊ฐ๋ ๋ onCreate(โฆ)
๋ฐ onRestoreInstanceState(โฆ)
๋ชจ๋์ ์ ์ฅ๋ ๋ฒ๋ค์ ์ ๋ฌํฉ๋๋ค.
๋ด๊ฐ ์๋ํ Flutter ์ฑ(Flutter ๊ฐค๋ฌ๋ฆฌ ๋ฐ FAB ํญ ์นด์ดํฐ๊ฐ ์๋ ๊ธฐ๋ณธ ํ๋ก์ ํธ)์์ Android๊ฐ Flutter ์ฑ์ Activity๋ฅผ ์ข ๋ฃํ๋๋ก ์ถฉ๋ถํ ์ฑ์ ์ด๋ฉด Flutter ํ๋์ผ๋ก ๋์์ฌ ๋ ๋ชจ๋ ์ํ๊ฐ ์์ค๋ฉ๋๋ค( ์ต๊ทผ ์์ ์์ ์์ ์ ์ ๊ฑฐํ์ง ์์).
์์๋๋ ๋ด์ฉ: ์ฑ์ UI๊ฐ ์๋์ง ์์ ์ํ์์ ์ค๋จํ ๊ฒ๊ณผ ๋์ผํ ์ํ์
๋๋ค.
๊ฒฐ๊ณผ: ํ๋์ด ์ฒ์๋ถํฐ ๋ค์ ์์๋์ด ๋ชจ๋ UI ์ํ๊ฐ ์์ค๋๊ณ ์ฌ์ง์ด ์ ๋ง ๊ธด ํ์๋ ์์ค๋ฉ๋๋ค.
https://github.com/flutter/flutter/issues/3427 ๋ ๊ด๋ จ์ด ์์ ์ ์์ต๋๋ค.
@eseidelGoogle ๋ง์ต๋๋ค. ํ์ฌ ๋ฒ์ ๊ณผ ๊ฐ์ ์ ์๋ค๋ฉด ์ด๋ค ํ์์ผ๋ก flutter Activity ์ํ๋ฅผ ์ ์ฅํ ์ ์์ต๋๊น?
์ง๊ธ ์ฐ๋ฆฌ๋ ์๋ฌด๊ฒ๋ ์ ์ฅํ์ง ์์ต๋๋ค.
ํ๋ ์์ํฌ ์์ฒด์๋ ์ ์ฅํ ๊ฐ์น๊ฐ ๊ฑฐ์ ์๋ ์ํ๊ฐ ์์ต๋๋ค. ๋ชจ๋ ์ ๋๋ฉ์ด์ ๊ณผ ์ด์ ๊ฐ์ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ํญ์ ์ด๊ฒ์ ์ฑ์ ๋งก๊ธฐ๋ ๊ฒ์ผ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์๋ง๋ Dart ์์ค์์ ๊ทธ๊ฒ์ ๋ ธ์ถํด์ผ ํ ๊ฒ์ ๋๋ค. (์ง๊ธ์ Java ์์ค์์๋ง ๋ ธ์ถ๋ฉ๋๋ค.)
@Hixie Android์์ ๋ชจ๋ ํ๋ ์์ํฌ ๋ณด๊ธฐ๋ ์์คํ ์์ ์๋์ผ๋ก ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ๋ฏ๋ก ๊ฐ๋ฐ์๊ฐ ์ธ์คํด์ค ์ํ์ UI๊ฐ ์๋ ๋ถ๋ถ์ ์๋์ผ๋ก ์ ์ฅํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉ์๊ฐ ์์๋ ์์น, ์คํฌ๋กค ์์น, ์ผ๋ถ ๋ฒํผ์ ํ์ฑํ ์ํ, ์ด์ ํ๋ฉด ์ํ ๋ฑ์ ์ ์ฅํ๊ธฐ ์ํด ๊ฐ๋ฐ์๊ฐ ๋งค๋ฒ ๋ชจ๋ ์์ฉ๊ตฌ๋ฅผ ์์ฑํด์ผ ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ชจ๋ UI ์์ ฏ์ ๋ํด ํ๋ฌํฐ๊ฐ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํด์๋ ์ ๋ฉ๋๋ค. ์โฆ?
Flutter์๋ ์ ์ฅํ ํ๋ ์์ํฌ ์ํ๊ฐ ๊ฑฐ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ฒํผ์ ํ์ฑํ ์ํ๋ ์ํ๊ฐ ์๋๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ๊ณตํ๋ ์ ๋ ฅ์ ๋๋ค. ํ์ฌ ๊ฒฝ๋ก ๊ธฐ๋ก์ ํ๋ ์์ํฌ์ ์ ์ฅ๋์ง๋ง ํ๋ ์์ํฌ๊ฐ ๋ค์ ๋น๋ํ ์ ์๋ ์ํ๋ก ์ ์ฅ๋์ง๋ โโ์์ต๋๋ค(์์ฉ ํ๋ก๊ทธ๋จ ์ฝ๋์์ ์ ๊ณตํ๋ ๊ฐ์ฒด์ ๋ชจ๋ ์ธ์คํด์ค์ด๊ธฐ ๋๋ฌธ์). ์คํฌ๋กค ์์น๋ ์ค์ ๋ก ์ ์ฅํ ์ ์๋ ์ ์ผํ ํญ๋ชฉ์ ๋๋ค(ํ์ฌ ์ฑ์์ ์ด์๋จ์ ์คํ ์ด๊ฐ ์๋ ์คํ ์ด์ ์ ์ฅํจ).
๊ทธ๋ฌ๋ ์ด์จ๋ ์ฐ๋ฆฌ๋ ํ์คํ ์ค๋๋ณด๋ค ๋ ์ํด์ผ ํฉ๋๋ค.
๊ฒฝํ ๋ง์ Android ๊ฐ๋ฐ์๋ก์ ์ ๋ iOS ๊ฐ๋ฐ์๋ค๊ณผ์ ๋ํ์ ์ฐธ์ฌํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋์ผ Flutter๊ฐ iOS ๋ฐ Android ์ฑ์ ๋น๋ํ๊ธฐ ์ํ ์๋ฒฝํ ํ๋ ์์ํฌ๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ฐ์ดํฐ, ๊ธฐ๋ณธ ์ค์ , ์บ์ ๋ฐ์ดํฐ ๋ฐ ์ํ๋ฅผ ๊ฐ๋ฐ์์๊ฒ ๊ฐ์ฅ ์น์ํ ๋ฐฉ์์ผ๋ก ์ ์ฅํ๋ ค๋ฉด ํ๋ ์์ํฌ์ ์ง์์ฑ ๊ธฐ๋ฅ์ด ์ค์ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ ๋ด๊ฐ ์ด๋ด์ค์ ๋ชฐ๋์ด? ์ด๊ฒ์ ์ค์ ๋ก ์ค์ํ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์ ์ฅ์น์์ ํ๋ก์ธ์ค๊ฐ ์์ฃผ ์ฝ๊ฒ ์ข ๋ฃ๋ ์ ์๋ค๋ ์ ์ ์ธ๊ธํ ๊ฐ์น๊ฐ ์์ต๋๋ค!
onSaveInstanceState
serialization.dart ๋ฅผ ํตํด PageStore
(๋๋ ๊ด๋ จ)์ ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ์ ์ฅํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
@Takhion ๋น์ ์ด ์ธ๊ธํ๋ "PageStore"๋ฅผ ์ฐ๊ฒฐํ ์ ์์ต๋๊น? ๋๋ ์ด ๋ฌธ์ ๊ฐ ๊ณง ์์ ๋์ง ์์ ๊ฒ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๊ด์ฌ์ด ์์ต๋๋ค(2029๋ 12์ 31์ผ์ IMHO์๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋๋ค)
@LouisCAD ๊ฐ ์ฌ๊ธฐ์ ์๋์ง ํ์ธ: https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/page_storage.dart
๊ทธ๋๋ ๊ทธ ์ด์์ ์ ์ฅํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ต์ํ ํ์ฌ ๊ฒฝ๋ก์ ์ผ๋ถ ์ํ๋?
@Hixie๋ ์ด๋ป๊ฒ ์๊ฐํ์ธ์?
์ฐ๋ฆฌ๋ ํ์ฌ ์ด๊ฒ์ ์ฝ๊ฒ ํ๊ธฐ ์ํด ์๋ฌด๊ฒ๋ ํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์์ง ์ด ๋ฌธ์ ๋ฅผ ์์ธํ ์ฐ๊ตฌํ์ง ์์์ต๋๋ค. ํ์ฌ๋ก์๋ ์ ์งํ๋ ค๋ ์ ๋ณด๋ฅผ ์๋์ผ๋ก ์ ์ฅํ๊ณ ์ฑ์ด ๋ณต์๋๋ฉด ์๋ก ์ ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ฐ๋ฐ์๊ฐ ์ง์ ์ํ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ์ํ ์๋ช ์ฃผ๊ธฐ ์ด๋ฒคํธ("๋น์ ์ ์ด์ ๋ง ์ฃฝ์์ต๋๋ค!", "์ถํํฉ๋๋ค, ๋น์ ์ ์ด์ ๋ณต์๋์์ต๋๋ค")๋ฅผ Dart ์ฝ๋์ ๋ ธ์ถํฉ๋๊น? ๊ฐ๋ฐ์๊ฐ ์๋ฃจ์ ์ ํ์ํ ์ ์๋๋ก ์ ๊ธ์ ํด์ ํ๊ธฐ์ ์ถฉ๋ถํ ๊ธฐ๋ฅ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์๊ฐ?
@sethladd ๊ฐ๋ฐ์์๊ฒ ๋ ธ์ถ์ํค๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. Flutter๋ ๊ฐ๋ฐ์๊ฐ ๋๋ฝ๊ณ ์ ์ง ๊ด๋ฆฌ๊ฐ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ ์ฅํฉํ ์์ฉ๊ตฌ ์ฝ๋๋ก ๊ฐ ์ฑ์ ๋ํด ์๋์ผ๋ก ๋ฐ๋ณต์ ์ผ๋ก ์ํํ ํ์ ์์ด UI ์ํ๋ ์ ์ฅํด์ผ ํฉ๋๋ค.
@LouisCAD ํผ๋๋ฐฑ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋จ๊ณ๋ณ๋ก ์๊ฐํ๊ณ ์์ต๋๋ค... 1๋จ๊ณ๋ ๋ฌด์์ธ๊ฐ์? ์๋ช ์ฃผ๊ธฐ ์ด๋ฒคํธ๊ฐ ์์ง ๋ ธ์ถ๋์ด ์์ต๋๊น?
@sethladd ๋ด๊ฐ ์ฐพ์ ์ ์๋ ๊ฒ์ ์ด๊ฒ์ด ์ธ์คํด์ค ์ํ๋ฅผ ์ ์ฅ/๋ณต์ํ๊ธฐ ์ํ ์ฝ๋ฐฑ์ ๋ ธ์ถํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
@Hixie ๋ #3427์์ ์๋ช ์ฃผ๊ธฐ์ ๋ํ ํํฌ๊ฐ ์๋ค๊ณ ์ธ๊ธํ์ต๋๋ค. https://docs.flutter.io/flutter/widgets/WidgetsBindingObserver-class.html ์ ์๋ฏธํฉ๋๊น?
Flutter๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๋ฌ ํ๋์ ์ฌ์ฉํฉ๋๊น? (์: ์ ํ๋ฉด์ผ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ).
ํ๋ก์ธ์ค ์ข ๋ฃ๋ ๋งค์ฐ ์ผ๋ฐ์ ์ด๋ฉฐ ์ฌ์ฉ์๊ฐ ํ ๋ฒํผ์ ๋๋ฅด๊ณ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ/CPU ์ง์ฝ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ข ๋ฃ๋ฉ๋๋ค(๋๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋๋ฌด ์ค๋ซ๋์ ๋ฐฑ๊ทธ๋ผ์ด๋์ ์์๋ ๊ฒฝ์ฐ). ์ด๊ฒ์ Android OS์ ํ์์ ์ธ ๋ถ๋ถ์ ๋๋ค. ๋ชจ๋ ํ๋ฉด(ํ๋)์ ์ํ๋ฅผ ์ ์งํ๊ณ ๋ณต์ํ ์ ์์ด์ผ ํ๋ฉฐ onStop() ์ดํ์ ์ธ์ ๋ ์ง ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ ์ ์์ต๋๋ค.
Android๋ ์ฌ์ฉ์๊ฐ ์ข ๋ฃ๋ ์ฑ์ผ๋ก ๋์๊ฐ๋ฉด ํ๋์ ๋ฐฑ์คํ์ ๋ค์ ๋ง๋ค๊ณ , ๋งจ ์ ํ๋์ด ๋จผ์ ์์ฑ๋ ๋ค์ ๋ฐฑ์คํ ๊ธฐ๋ก์ผ๋ก ๋์๊ฐ๋ฉด ๋ฐฑ์คํ์ ํ๋์ด ์ฃผ๋ฌธํ์ผ๋ก ๋ค์ ์์ฑ๋ฉ๋๋ค. Flutter๊ฐ ์ฌ๋ฌ ํ๋์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ ํฐ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค(์ฌ์ฉํ๋์ง ํ์คํ์ง ์์).
์ฆ, ์ํ ์ ์ฅ์ด ๊ตฌํ๋์ง ์์ ๊ฒฝ์ฐ ์์คํ ์ ํ๋์ ๋ค์ ์์ฑํ์ง๋ง ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ์์ค๋์ด(ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋จ) ๋ถ์ผ์น ๋ฐ ์ถฉ๋๋ก ์ด์ด์ง๋๋ค.
Android https://medium.com/inloop/android-process-kill-and-the-big-implications-for-your-app-1ecbed4921cb ์์ ํ๋ก์ธ์ค ์ข ๋ฃ์ ๋ํ ๊ธฐ์ฌ๋ฅผ ์์ฑํ์ต๋๋ค.
๋ํ Android๊ฐ onStop() ์ํ๋ฅผ ์ง๋๋ฉด(ํ์ ํด๋ฆญํ ํ ๋๋ ์ฑ์ด ํ์ฌ ํฌ๊ทธ๋ผ์ด๋ ์ฑ์ด ์๋ ๊ฒฝ์ฐ onSaveInstanceState(Bundle) ๋ฅผ ํธ์ถํ์ฌ ์ํ๋ฅผ ์ ์ฅํด์ผ ํจ์ ์๋ ค์ค๋๋ค. ๋ฐ๋ผ์ Flutter๋ ์ด onSaveInstanceState ์ฝ๋ฐฑ์ Activity์์ "ํ๋ฉด"์ผ๋ก ์ ๋ฌํ ์ ์์ด์ผ ํฉ๋๋ค. ํ๋์ onCreate(Bundle storedInstanceState) ๋๋ onRestoreInstanceState(Bundle storedInstanceState) ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ์์ ์ ์ฅ๋ ์ํ์ ๋ฒ๋ค์ ๋ค์ ๊ฐ์ ธ์ต๋๋ค.
์์ฝํ์๋ฉด Flutter๋ onSaveInstanceState() ๋ฐ onRestoreInstanceState() ์ฝ๋ฐฑ์ ๊ฐ๋ฐ์์๊ฒ ์ ๋ฌํ ์ ์์ต๋๋ค. ์ด์์ ์ผ๋ก๋ Android Bundle ๊ฐ์ฒด๋ฅผ Flutter์์๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ผ๋ก ๋ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ค์ ๋จ๊ณ๋ ํ๋ฉด ์์ ๋ชจ๋ Flutter ์์ ฏ๋ ์ด๋ฌํ ์ฝ๋ฐฑ์ ๋ํด ์๋ฆผ์ ๋ฐ๊ณ ํ์ฌ ์ํ๋ฅผ ์ ์งํ๋ ๋ฐ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
๊ทธ๋ฐ ๋ค์ Android OS๋ ๋ฒ๋ค์ ๊ฐ์ ธ์ ์ค์ ๋ก ๋์คํฌ์ ์ ์งํ์ฌ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋๊ณ ๋ค์ ์ง๋ ฌํ ํด์ ๋ ์ ์๋ ๊ฒฝ์ฐ ์์ค๋์ง ์๋๋ก ํฉ๋๋ค.
ํ์ด์ ๋น์ด ์ :-). ์ด Android ์ํ/์๋ช ์ฃผ๊ธฐ ์ง์ฅ์ Flutter์ ๋๋ฌด ๋ง์ด ์๊ฐํ์ง ์๋๋ก ์ฃผ์ํ์ธ์.
iOS์์ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋น์ทํ ๊ฒ์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง ์ฌ์ฉํ๋ ๋ฐ "ํ์ํ" ๊ฒ์ ์๋๋๋ค(?).
์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ์ ์ ์๊ฒ ์ ํฉํฉ๋๋ค. ์ง๋ ฌํ๋ redux ์ํ๋ฅผ ์ ์ฅ/๋ก๋ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๋ชจ๋ ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! @Takhion ๋ ์ฌ๊ธฐ์ ๋์์ ์ฃผ๊ฒ ๋ค๊ณ ์ ์ํ์ต๋๋ค. API ๋์์ธ๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ข์ ์์์ด ๋ ์ ์์๊น์? ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ํ๋ค๋ฉด ๋ ๊ณต์์ ์ผ๋ก ํตํฉํ ์ ์์ต๋๋ค. ๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ์์ค ์์ง(์๋ ๊ฒฝ์ฐ)์์ ์ํํด์ผ ํ๋ ์์ ์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก: ๊ตฌ์ฒด์ ์ธ API ์ ์์ ๋ฌด์์ ๋๊น?
Flutter๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๋ฌ ํ๋์ ์ฌ์ฉํฉ๋๊น? (์: ์ ํ๋ฉด์ผ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ)
@DanielNovak Flutter๋ ์์ฒด "๋ผ์ฐํ " ์์คํ ์ ์ฌ์ฉํ๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋จ์ผ ํ๋์ ๋จ์ผ ๋ณด๊ธฐ๋ฅผ ํตํด Android์ ํตํฉ๋ฉ๋๋ค. ๋น์ ์ ํ์ด๋ธ๋ฆฌ๋ ์๋๋ก์ด๋ / ๋จ๋ฆผ ์ ํ ๋ฆฌ์ผ์ด์ ๊ณผ ๊ฐ์ ์ ์ฌ์ ์ผ๋ก ์ฌ๋ฌ ํ๋ ๋ฐ ๋จ๋ฆผ๋ณด๊ธฐ ๋ฑ์ ํ ์ ์์ง๋ง,์ด ๊ฒฝ์ฐ์ ๋น์ ์ ์ฝ๊ฒ / ์ ์ฝ ํ ์ ์์ต๋๋ค ์ง์ ์๋๋ก์ด๋๋ฅผ ํตํด ์ธ์คํด์ค ์ํ๋ฅผ ๋ณต์ํฉ๋๋ค.
์ง๋ ฌํ๋ redux ์ํ๋ฅผ ์ ์ฅ/๋ก๋ํฉ๋๋ค.
@zoechi ์ ์ฅ๋ ์ธ์คํด์ค ์ํ ๋ฒ๋ค์ ์ ์ฒด Android ์ฑ ์ํ์ ๋ํด 1MB์ ํ๋ ์ ํ์ผ๋ก IPC๋ฅผ ํต๊ณผํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋ง๋ ๊ทธ๋ ๊ฒ ํ๊ณ ์ถ์ง ์์ ๊ฒ์ ๋๋ค. ์ ์์ ๋ฐ๋ฅด๋ฉด ์ธ์คํด์ค ์ํ๋ ํ ์คํธ ์ ๋ ฅ, ์คํฌ๋กค ์์น, ํ์ฌ ํ์ด์ง ๋ฑ ์ฌ์ฉ์๊ฐ ์ํํ๋ ๋ชจ๋ ์งํ ์ค์ธ ํ๋์ ๋์ผํ ์กฐ๊ฑด์ ์ฌํํ ์ ์๋ ๋ฐ์ดํฐ ์กฐ๊ฐ์ด์ด์ผ ํฉ๋๋ค. ๋์คํฌ์ ์ง์๋๊ฑฐ๋ ๋ค๋ฅธ ์ํ์์ ํ์๋ฉ๋๋ค.
Flutter๋ Android onPause ์๋ช
์ฃผ๊ธฐ ์ด๋ฒคํธ๋ฅผ ๋
ธ์ถํฉ๋๋ค. Android onDestroy() ์๋ช
์ฃผ๊ธฐ ์ด๋ฒคํธ ๋ ๋
ธ์ถ๋์ง ์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ธ์คํด์ค ๊ด๋ จ ์ํ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด onPause() ์ด๋ฒคํธ์ ์ฐ๊ฒฐํ๋ ๊ฒ์
๋๋ค.
Android์ onSaveInstanceState() ๋ฐ onRestoreInstanceState () ์ ํธํ
@sethladd @LouisCAD ๋์์ธ ์ ์์๋ฅผ ๋ง๋ ์ฌ๋์ด ์์ต๋๊น?
@raju-bitter onPause()๋ ์ต์ ์ด ์๋๋ฏ๋ก onSaveInstanceState()์ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ค์์ onPause()๊ฐ onSaveInstanceState๋ณด๋ค ๋ ์ ๊ธฐ์ ์ผ๋ก ํธ์ถ๋๋ค๋ onSaveInstanceState์ javadoc์ ๋๋ค(ํ์ํ ๊ฒ๋ณด๋ค ๋ ์์ฃผ ๋๋ ์ ํ ํ์ํ์ง ์์ ๋ ์ํ ์ ์ฅ์ ํธ๋ฆฌ๊ฑฐํ ์ ์์).
์ด ๋ฉ์๋๋ฅผ ํ๋์ด ๋ฐฑ๊ทธ๋ผ์ด๋์ ๋ฐฐ์น๋๊ฑฐ๋ ์๋ฉธ๋ ๋ ํญ์ ํธ์ถ๋๋ onPause() ๋๋ ์๋ฉธ ์ ์ ํธ์ถ๋๋ onStop()๊ณผ ๊ฐ์ ํ๋ ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ๊ณผ ํผ๋ํ์ง ๋ง์ญ์์ค. ์ด ๋ฉ์๋๊ฐ ์๋ onPause() ๋ฐ onStop()์ด ํธ์ถ๋๋ ํ ๊ฐ์ง ์๋ ์ฌ์ฉ์๊ฐ ํ๋ B์์ ํ๋ A๋ก ๋ค์ ํ์ํ ๋์ ๋๋ค. ํน์ ์ธ์คํด์ค๊ฐ ๋ณต์๋์ง ์๊ธฐ ๋๋ฌธ์ B์์ onSaveInstanceState(Bundle)๋ฅผ ํธ์ถํ ํ์๊ฐ ์์ต๋๋ค. , ๊ทธ๋์ ์์คํ ์ ๊ทธ๊ฒ์ ํธ์ถํ์ง ์์ต๋๋ค. onPause()๊ฐ ํธ์ถ๋๊ณ onSaveInstanceState(Bundle)๊ฐ ์๋ ๊ฒฝ์ฐ๋ ํ๋ B๊ฐ ํ๋ A๋ณด๋ค ๋จผ์ ์์๋ ๋์ ๋๋ค. ์์คํ ์ ํ๋ A์์ onSaveInstanceState(Bundle) ํธ์ถ์ ํผํ ์ ์์ต๋๋ค. A์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์ํ๋ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค.
@ํํค์จ
์ธ์คํด์ค ์ํ ๋ฒ๋ค์ ์ ์ฒด Android ์ฑ ์ํ์ ๋ํด 1MB์ ์๊ฒฉํ ์ ํ์ผ๋ก IPC๋ฅผ ํต๊ณผํด์ผ ํฉ๋๋ค.
๊ทธ๊ฑด ๋ด ๋ฌธ์ ๊ฐ ์๋์ผ.
์ง์/๋ณต์ ์์ ์ ์์์ผ๋ง ๋์คํฌ์ ์์ ์ ์ ์งํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
onSaveInstanceState
/ onRestoreInstanceState
์ ํํ๋ ๊ฒ์ ์ฌ์ด ๋ถ๋ถ์
๋๋ค. Flutter๋ View์ ํฌํจ๋์ด ์์ผ๋ฉฐ ํด๋น ์ฝ๋ฐฑ์ ์ ์ ํ ์ก์ธ์ค ๊ถํ์ด ์์ต๋๋ค. ๋ด๊ฐ ํ๋ ค๊ณ ํ๋ ๊ฒ์ ํน์ "๋ฆฌํฌ์งํ ๋ฆฌ"์ ํฌํจ๋ ๊ฐ์ฒด๋ฅผ ์ค์ ๋ก ์๋์ผ๋ก ์ง๋ ฌํํ๋ ๋์์ธ ์ ์๊ณผ ํ๋กํ ํ์
์ ๋ง๋ค์ด ์ฌ์ฉํ๋ ๊ฒ์ด (๋ชจ๋ ๊ฒ์ ์๋์ผ๋ก ์ํํด์ผ ํ๋ ๊ฒ๊ณผ๋ ๋์กฐ์ ์ผ๋ก) ๊ณ ํต ์์ด ๋๋๋ก ํ๋ ๊ฒ์
๋๋ค.
@Takhion ๋น์ ์ ๋ด ๋ ๊ฐ ์๋์ ๋ฐ๋์ ๋๋ค. ์ ์์ ๋ณด๊ธฐ ์ํด ๊ธฐ๋ค๋ฆด ์ ์์ต๋๋ค!
์๊ฒ ์ต๋๋ค. ์ด์ ๋ํ PR์ ์์ฑ ์ค์ด๊ณ ์ฅ์ ๋ฌผ์ ๋ถ๋ช์ณค์ต๋๋ค. [ View.onSaveInstanceState
](๋๋ [ Activity.onSaveInstanceState
]) ๋ ์ ์ฅ๋ ์ธ์คํด์ค ์ํ๋ฅผ ๋๊ธฐ์ ์ผ๋ก ์ ๊ณตํด์ผ ํ๋ฉฐ , ๋ด ๊ฒฝํ(๊ทธ๋ฆฌ๊ณ ์ด [์ฝ๋ฉํธ])์ ํธ์คํธ/ํ๋ซํผ ๋ฉ์์ง ๊ฐ async ๋ง ๋ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. Android์ ๋ฉ์์ง ๋๊ธฐ์ด์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
@sethladd @Hixie @eseidelGoogle @jason-simmons Ad-hoc C/C++ ์ฝ๋๋ฅผ ํฌํจํ์ง ์๋ Android์์ Flutter๋ก ๋จ์ผ ๋๊ธฐ/์ฐจ๋จ ํธ์ถ์ ๋ง๋๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ์๋ ค์ฃผ์ธ์. [ dart:jni
์ํดํ๋ค]?
์ฐธ์กฐ @mravn-google
ํ๋ซํผ ๋ฉ์์ง์ ๋น๋๊ธฐ ํน์ฑ์ Dart UI๊ฐ Android ํ๋ซํผ ์ฝ๋ฐฑ์ ์ฌ์ฉ๋๋ ์ค๋ ๋์ ๋ค๋ฅธ ์ค๋ ๋์์ ์คํ๋๋ค๋ ์ฌ์ค์์ ๋น๋กฏ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์น๋ฅผ ์ฌ์ฉํ์ฌ ํญ์ ๋น๋๊ธฐ API ํธ์ถ์ ๋๊ธฐ API ํธ์ถ๋ก ์ ํํ ์ ์์ต๋๋ค.
final MethodChannel channel = new MethodChannel(messenger, someName);
final CountDownLatch latch = new CountDownLatch(1);
channel.invokeMethod("someMethod", someArguments, new MethodChannel.Result() {
<strong i="6">@Override</strong>
public void success(Object result) {
// handle successful invocation
latch.countDown();
}
<strong i="7">@Override</strong>
public void error(String errorCode, String errorMessage, Object errorDetails) {
// handle failed invocation
latch.countDown();
}
<strong i="8">@Override</strong>
public void notImplemented() {
// handle invocation of unimplemented method
latch.countDown();
}
});
try {
latch.await();
} catch (InterruptedException e) {
// handle interruption
}
// handle xxx
์์น์ ๊ฐ์ latch.await()
๋ฐํ ํ ์คํ๋๋ ์ฝ๋๋ก ์ ๋ฌํด์ผ ํ๋ ๊ฒฝ์ฐ ๋์น ์์ final AtomicReference<SomeType>
๋ณ์(๋๋ ์ด์ ์ ์ฌํ)๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
@mravn-google ๊ฐ์ฌํฉ๋๋ค!
@mravn-google์ ๋ด๊ฐ ์๋ํ ์ฒซ ๋ฒ์งธ ์ ๊ทผ ๋ฐฉ์์ด์ง๋ง Android์ ๊ธฐ๋ณธ ์ค๋ ๋๋ await()
ํธ์ถ์์ ์์ํ ๋ฉ์ถฅ๋๋ค.
@Takhion ๋ฌผ๋ก ์ด์ฃ .
๋์น๋ฅผ ์ฌ์ฉํ์ฌ ํญ์ ๋น๋๊ธฐ API ํธ์ถ์ ๋๊ธฐ API ํธ์ถ๋ก ์ ํํ ์ ์์ต๋๋ค.
... ๋น๋๊ธฐ ์๋ต์ด ์ด๋ฏธ ์๋ ์ค๋ ๋์ ์ ๋ฌ๋์ง ์๋ ํ :-/
๊ทธ๋ ๋ค๋ฉด onSaveInstanceState
๋ํ ์ผ์ข
์ ๋๊ธฐํ ํธ๋์
ฐ์ดํฌ๊ฐ ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค. Dart ์ธก ๊ณ์ฐ๊ณผ ๊ด๋ จ๋ ๋๊ธฐํ ์๋ต์ด ํ์ํ ๋ค๋ฅธ ์ ์ฌํ ์ฝ๋ฐฑ์ ์๊ณ ์์ต๋๊น? ์ด๋ ๋ฒ์ฉ ๋๊ธฐ ํ๋ซํผ ๋ฉ์์ง ๊ตํ์ ์๊ตฌํฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ onSaveInstanceState
๋ํด ํน์ ์์
์ ์ํํ ์ ์์ต๋๋ค.
@mravn-google ๋ถํํ๋ Android์๋ ์ด๋ฌํ ๋ถ์พํ "๋๊ธฐ์ ๊ธฐํ์ ์ฐฝ"์ด _full_ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ชจ๋ ๊ฒ์ด ๋ฉ์๋ ํธ์ถ์์ ๋ฐํ๋๊ธฐ ์ ์ ๋ฐ์ํด์ผ ํฉ๋๋ค! ๋ด ๋จธ๋ฆฌ ๊ผญ๋๊ธฐ์: ๋ง์ Activity
์๋ช
์ฃผ๊ธฐ ์ด๋ฒคํธ, Broadcast Receiver
, SyncAdapter
๋ฉ์๋ ๋ฑ. ์์งํ ์ด์ ์๋ ๋ ํฐ ๋ฌธ์ ๊ฐ ์๋์๋ค๋ ์ฌ์ค์ ๋๋์ต๋๋ค!
์ ์๊ฐ์ Flutter๊ฐ "๋ค์ดํฐ๋ธ" API๋ฅผ ํตํด ๊ฐ๋ฅํ ๊ฒ๊ณผ ์ง์ ํ ๊ธฐ๋ฅ ํจ๋ฆฌํฐ๋ฅผ ๋ฌ์ฑํ๋ ค๋ฉด ๋๊ธฐ์ ๋ฉ์์ง ํต์ ์ด ํ์ํฉ๋๋ค.
@mit-mit SystemChannels.lifecycle ๋ฐ ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ฒ์ ์๋ฏธํ์ต๋๋ค.
https://github.com/flutter/flutter/issues/7560 ๊ณผ ๋์ผํฉ๋๊น?
@sethladd ๊ทธ๋ ๊ฒ ์๊ฐํฉ๋๋ค.
@mravn-google ๊ฐ์ฌํฉ๋๋ค! ๋๋ ๋ํ์ ์ค๋ณต์ ์ ๊ฑฐํ๊ณ ์ค์ ์ง์คํํ๊ธฐ ์ํด ์ด๊ฒ์ ์ฐฌ์ฑํ์ฌ #7560์ ๋ซ์์ต๋๋ค.
์ ๋ ์ด๋ฌํ ์ข
๋ฅ์ ํ๋ซํผ ๋ Dart ํต์ ์ ์ํด MethodChannel
์ ๋๊ธฐ์ ๋์๋ฌผ์ ์ถ๊ฐํ๋ ์ชฝ์ผ๋ก ๊ธฐ์ธ๊ณ ์์ต๋๋ค.
@mravn-google ์ด๋ป๊ฒ ๋์ด๊ฐ๋์? ๋ด๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค?
@Takhion ๊ฐ์ฌํฉ๋๋ค! ๊ณง ์์ด์ผํฉ๋๋ค. ์ ๋ ๋๊ธฐ ๋ฐฉ์ ์ฑ๋์์ ์์
์ค์ด๋ฉฐ ํ๋ฃจ๋ ์ดํ ์์ PR์ ๋ฐ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ผ๋จ ๊ฑฐ๊ธฐ์ ๋น์ ์ ๋ฆฌ๋ทฐ๋ฅผ ์์ฒญํ ๊ฒ์
๋๋ค. ์ ์ฑ๋์ ์ต๋ํ ๋นจ๋ฆฌ onSaveInstanceState
์ ์ฐ๊ฒฐํ์ฌ ํด๋น ์๋๋ฆฌ์ค์์ ๋ชจ๋ ๊ฒ์ด ์๋ํ ๋๋ก ์๋ํ๋์ง ํ
์คํธํ๊ณ ์ถ์ต๋๋ค. ๊ธฐ์ฌํ ์ ์๋ ์์ ์ฑ์ด ์ด๋ฏธ ์๋ค๋ฉด ์ ๋ง ์ข์ ๊ฒ์
๋๋ค.
@mravn-google ๊ต์ฅํฉ๋๋ค! ํ๋ ์์ํฌ๋ฅผ ์ง์ ์์ ํ๋ ์ค์ด๋ผ ์ฑ์ ์์ง๋ง ์ํ์ ํ์คํ ๋๋ฆด ์ ์์ต๋๋ค. Btw Android ์ธก์์ ์ฝ๋ฑ์ด ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ BinaryMessages
์ง์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค(๋จ์ง ๋ฐ์ดํธ๊ฐ ์ ๋ฌ๋จ). ๊ด์ฐฎ์ต๋๊น?
๋ํฌ๋ค ๋ก.
@Takhion ์ฝ๋ฑ์ด ํ์ ์๋ค๋ฉด BinaryMessages
์ง์ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ด์ฐฎ์ต๋๋ค. ์ถ๊ฐํ๊ฒ ์ต๋๋ค
void setSynchronousMessageHandler(String channel, ByteData handler(ByteData message))
๊ทธ ์์ ์.
@Takhion ์คํธ๋ผ์ดํฌ. handler
๋ฅผ ํธ์ถํ๊ธฐ ์ํด Dart VM์ ๋๊ธฐ์ ํธ์ถ์ ํ ์๋ ์์ต๋๋ค. ๋ฐ๋ผ์ BinaryMessages
๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๋์ ํ์์ ๊ฐ์ด Dart ์ฝ๋์ ๊ด์ ์์ ๋ชจ๋ ๊ฒ์ด ๋๊ธฐํ๋ฉ๋๋ค. BinaryMessenger
๋ฐ ํ๋ซํผ ์ธก์ ๊ตฌํ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค. ์ถ๊ฐํ๊ฒ ์ต๋๋ค
ByteBuffer sendSynchronous(String channel, ByteBuffer message);
FlutterView
์ง์ํ๋ ํ๋ซํผ ๋ณด๊ธฐ ์ฝ๋๋ ๋น๋๊ธฐ ํ๋ซํผ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ ๋์น๋ฅผ ๊ธฐ๋ค๋ฆผ์ผ๋ก์จ ์ด๋ฅผ ๊ตฌํํฉ๋๋ค. ํด๋น ํ๋ซํผ ๋ฉ์์ง์ ํฌํจ๋ ์๋ต ๊ฐ์ฒด๋ ํ๋ซํผ ์ค๋ ๋(ํ์ฌ ์ฐจ๋จ๋จ)์ ์๋ต ์ฒ๋ฆฌ ํด๋ก์ ๋ฅผ ๊ฒ์ํ์ง ์๊ณ ๋์ ์๋ต์ ์ ์ฅํ๊ณ ๋์น๋ฅผ ํด์ ํฉ๋๋ค.
@mravn-google์ ๋น๋๊ธฐ ํธ์ถ์ด๋๋ผ๋ Dart ์ธก์์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ณด๋ด๋ ๊ฒ์ ๋ง์ง ์๊ธฐ ๋๋ฌธ์ ์ ์๊ฒ ํจ๊ณผ์ ์
๋๋ค. +1:
Dart ๋น๋๊ธฐ ์๋ต์์ Future.value(...)
๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ต์ ํ๊ฐ ์์ ๊ฒ ๊ฐ์๋ฐ์?
@Takhion https://github.com/flutter/engine/pull/4358 ์์ ์ดํด๋ณด์ธ์.
๋๋ ๋น์ ์ด ์ฌ๊ธฐ์์ ์ฃผ๋ก Android ํ๋ซํผ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก iOS์๋ ์ด๋ค ์ด์ ๋ก ์ฑ์ด ์ข ๋ฃ๋์์ ๋ UI ์ํ๋ฅผ ์ ์ฅ/๋ณต์ํ๋ ๋ค์ ์ ์ฌํ ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ์ฑ์ผ๋ก ์ ํํ๋ฉด ํ์ฌ ์ฑ์ด ์ผ์ ์ค๋จ๋๊ณ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ์ผ๋ก ์ธํด ์ข ๋ฃ๋ ์๋ ์์ต๋๋ค. ๊ณต์ ๋ฌธ์ ์์ ์ด ํ๋ก์ธ์ค์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
iOS ๊ฐ๋ฐ์๋ ์ด ๋ณด์กด/๋ณต์ ์ ์ฐจ๊ฐ ๊ฑฐ์ ์๋์ผ๋ก ์ํ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค. ๋น์ ์ ๋ชฉํ๊ฐ ์ง์ ํ ํฌ๋ก์ค ํ๋ซํผ ํ๋ ์์ํฌ๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ผ๋ฉด ์ด ์ ์ ํ์คํ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
Android๋ฅผ ํ๋ซํผ์ผ๋ก ๋์์ผ๋ก ํ๋ ๊ฒ์ด ์ต์ํ Activity ๊ณ์ฝ์ ๊ธฐ๋ณธ ์ฌํญ์ ์ค์ํ๋ ค๊ณ ํ๋ค๊ณ ์๊ฐํ ๊ฒ์ ๋๋ค....
@Zhuinden ์์ง ๋ฒ ํ ๋ฒ์ ์ด๋ผ๊ณ ๋ถํํ์ง ๋ง์? :)
๋ค๋ฅธ ๋๊ธฐ API๋ onLowMemory
๋ฐ onTrimMemory
๋ฐ onConfigurationChanged
IOS์๋ ์ ์ฌํ API ๋๋ ๋ฉ์ปค๋์ฆ์ด ์๋์ง ์ ์ ์์
Flutter์์ ๊ฒฐํจ์ด ์๋ Android ์ ์ฅ ๋ฐ ๋ณต์ ๋ฉ์ปค๋์ฆ์ ์ฌํํ๊ณ ์ถ์ง ์์ ์ ์์ต๋๋ค. ํธ๋์ญ์ ํฌ๊ธฐ ์ ํ์ผ๋ก ์ธํด ์ ์ฒด ์ํ๋ฅผ ๋ฒ๋ค์ ์ ์ฅํ ์ ์์ต๋๋ค.
Android์์๋ ์ฌ๋ฌ ์ํ ์ ์ฅ/๋ณต์ ๋ ผ๋ฆฌ๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
๊ฐ๋ฐ์๊ฐ ์ง์ ๋ถํ๊ณ ๋ฒ๊ทธ๊ฐ ๋ง์ ๋ก์ง์ ๊ตฌํํ๋ ๊ฒ์ ์ ๋ง ์ฝ์ต๋๋ค. ๋ด ๊ฒฝํ์ ์ํ ์ ์ฅ ๋ฐ ๋ณต์์ด ์ ๋๋ก ์ํ๋๋ ๊ฒ์ ๋ณด๋ ๊ฒ์ ์ ๋ง ๋๋ญ ๋๋ค.
Flutter์์ ๊ฐ๋ฐ์์ ์ํ๋ ๋จ์ผ ์ ๋ณด ์์ค์
๋๋ค.
๊ฐ๋ฐ์๋ ์ ํ๋ ๊ธฐ๋ณธ ํ๋ซํผ ๋ฉ์ปค๋์ฆ์ ๊ฑฐ์น์ง ์๊ณ ๋ณ๊ฒฝ๋ ๋ ์ด ์ํ๋ฅผ ๋์คํฌ์ ์ ์งํด์ผ ํฉ๋๋ค.
๋ฌผ๋ก ์คํฌ๋กค ์์น๋ฅผ ์ฝ๊ฒ ์ ์ฅํ ์๋ ์์ง๋ง ๋๊ฐ ์ ๊ฒฝ์ ์ฐ๊ฒ ์ต๋๊น?
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ณต์์ ์ํ ์ข์ UX๋ ์ฌ์ฉ์๊ฐ ์ด์ ๊ณผ ๋์ผํ ํ๋ฉด์ ๋ด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ์ค๋๋ Flutter๋ก ์ด๋ฏธ ์ด ์์
์ ์ํํ ์ ์์ต๋๋ค.
์์ : ์ํ ์ ์ฅ/๋ณต์์ ๋ ์์ฉ๊ตฌ(๋ด๋น๊ฒ์ดํฐ์ ๊ฐ์ ๊ฒฝ์ฐ)๋ก ๋ง๋ค๊ธฐ ์ํด Flutter ์ธก๋ฉด์์ ๊ฐ์ ์ ์ฌ์ง๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋ซํผ ์ ์ฅ/๋ณต์ ์ํ์ ๋ํ ํํฌ๋ฅผ ์ ๊ณตํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋ฌผ๋ก ์คํฌ๋กค ์์น๋ฅผ ์ฝ๊ฒ ์ ์ฅํ ์๋ ์์ง๋ง ๋๊ฐ ์ ๊ฒฝ์ ์ฐ๊ฒ ์ต๋๊น?
๋ชจ๋ ์ฌ๋? ์ค์๋ก ๋ฐฉํฅ ๋ณ๊ฒฝ์ ํธ๋ฆฌ๊ฑฐํ ๋๋ง๋ค ์ฑ์ด ๋ชฉ๋ก์ ์ฌ์ค์ ํ๋ฉด ์ ๋ง ์ข์ ํ ๊ฒ์ ๋๋ค. :NS
@Saketme FWIW, Flutter๋ ๋ฐฉํฅ ๋ณ๊ฒฝ ์ ์คํฌ๋กค ์์น๋ฅผ ์ฌ์ค์ ํ์ง ์์ต๋๋ค.
์ฝ๊ฐ์ ๋ฉํฐํ์คํน๊ณผ ํจ๊ป Flutter ์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ Android Go ๊ธฐ๊ธฐ์์ ์ฌ๋ฏธ์์ด์ผ ํฉ๋๋ค! 1GB ์ดํ์ RAM์ด ์๋ฐ์ ๋ฐ์ ๋๋ง๋ค ์งํ ์ํฉ์ด ์์ค๋ฉ๋๋ค.
@Saketme : @mravn-google์ด ๋งํ๋ฏ์ด Flutter๋ Android ํ๋๊ณผ ๊ฐ์ ๊ตฌ์ฑ ๋ณ๊ฒฝ์ ๊ตฌ์๋์ง ์์ต๋๋ค.
ํ์ํ ์ ์ผํ ์ํ ๊ด๋ฆฌ๋ ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์ ์๋ ๋์ OS์ ์ํด ์ข
๋ฃ๋๋ ๊ฒฝ์ฐ์
๋๋ค.
@LouisCAD ํ์คํ ์ํ ์ ์ฅ ๋ฐ ๋ณต์์ด ์ค์ํฉ๋๋ค.
Flutter ๊ฐ๋ฐ์๋ ์ด๋ฏธ ์ด ๋ก์ง์ ๋๋ถ๋ถ์ ์ค์ค๋ก ๊ตฌํํ ์ ์์ผ๋ฉฐ Flutter๋ ์์ฉ๊ตฌ๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ Android์์ ์ ๊ณตํ๋ ๋ฉ์ปค๋์ฆ์๋ ๊ฒฐํจ์ด ์์ผ๋ฉฐ Activity onSaveInstanceState
/ onRestoreInstanceState
ํดํนํ๋ ๋์ Flutter๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋์ ๊ฒ์ ์ค๊ณํ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ์ ํ์ฌ ์ํ๋ ๋ฌด์์ ๋๊น?
TextField
๊ธด ๋ฉ์์ง๋ฅผ ์
๋ ฅํ๋ ์ฑํ
์ฑ์ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค.
๊ฐ์๊ธฐ ์ ํ๋ฅผ ๋ฐ๊ณ ์ ์ ํ OS๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ผ๋ก ์ฑํ
์ฑ์ ์ข
๋ฃํฉ๋๋ค.
์ ํ ํตํ ํ ์ฑํ
์ฑ์ผ๋ก ๋์๊ฐ๋๋ค. Flutter๊ฐ ๋ด๊ฐ ์
๋ ฅํ ๋ฉ์์ง๋ฅผ ์๋์ผ๋ก ์ ์งํ๊ณ ๋ค์ ์์ฑํฉ๋๊น? ๋๋ ์ฑ์ด ์๋์ผ๋ก ์ ์ง๋๊ณ ๋ค์ ์์ฑ๋์ด์ผ ํฉ๋๊น?
์คํฌ๋กค ์์น์ ๊ฒฝ๋ก ์ธ์ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฐ์๊ฐ ๊ด๋ฆฌํ์ง ์๋ "์ํ"๋ ๋ฌด์์ ๋๊น?
@nsreenath ๋ชจ๋ ์ฑํ ์ฑ์ ๋ช
๋๋ ์ค์ ๋ก ์ด๊ฒ์ ๋ํด ์ค๊ณ Flutter ๊ฐ๋ฐ์๊ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ด ํ๋ก์ธ์ค ์ข ๋ฃ์์ ๋ค์ ๋์์๋์ง ๋๋ ์์ ํ ์๋ก์ด ์ธ์คํด์ค์ธ์ง ๊ฐ์งํ๋ ๊ฒ์ด ์ค์ ๋ก ๋งค์ฐ ์ฝ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค.
savedInstanceState == null
๋ฅผ ํ์ธํ๋ ํ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค( onSaveInstanceState(bundle)
ํญ๋ชฉ์ 1๊ฐ ์ด์ ๋ฃ์๋ค๊ณ ๊ฐ์ ). ์ ์ ๋ถ์ธ ํ๋๊ทธ isFirstInit == false
๋ฐ savedInstanceState != null
์ด๋ฉด ํ๋ก์ธ์ค ์ข
๋ฃ ํ์
๋๋ค.
๊ทธ๋ฐ ๋ค์ savedInstanceState == null
๋ฅผ ๊ฐ์งํ๋ฉด ์๋์ผ๋ก ์ง์์ง ์ ์๋ ๋ณต์กํ ์ํ์ ๋ํ ์ง๋ ฌํ/์ญ์ง๋ ฌํ ์ฝ๋ฐฑ์ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ์์์ ๋ถ์ธ ๊ฐ๋ง ์ ์งํ๋ฉด ๋์ง๋ง ์์ฒด ์ง์์ฑ ์์คํ
์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
SavedInstanceState == null์ ํ์ธํ๋ ํ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค(onSaveInstanceState(bundle)์ ํญ๋ชฉ์ 1๊ฐ ์ด์ ๋ฃ์๋ค๊ณ ๊ฐ์ ).
iOS์๋ savedInstanceState
๋ฐ onSaveInstanceState
๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฑ์ ์ฌ์ ํ โโOS์ ์ํด ์ข
๋ฃ๋ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ์ํฌํ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
๊ทธ๋ ๋ค๋ฉด Flutter์์ ํ๋ฉด ๊ธฐ๋ก์ ๋ณด์กดํ๊ธฐ ์ํด ํ์ฌ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
์ถ์ ๋ฌผ๋ก ์ฑ์ ํ๋ฉด์ด ํ๋๋ง ์๋ ๊ฒฝ์ฐ์๋ ์ค์ํ์ง ์์ต๋๋ค.
@Zhuinden ์ด์จ๋ ํ์ํ ๋ง์ ์๋๋ฆฌ์ค๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค.
a) ์ฑํ
์:
์ ์ก๋์ง ์์ ํ
์คํธ ํ๋์ ์์ฑ๋ ์ด์ ๋ด์ฉ์ ํญ์ ์ ์ฅํ๊ณ ๋ณต์ํ์ญ์์ค.
b) ๊ธด ํ์์ ์:
"์๋ก์ด ์ ํ๋ฉด"๊ณผ "ํ๋ก์ธ์ค ์ข ๋ฃ ํ ์ ํ๋ฉด"์ ๋ํ ํน์ ์ง์์ด ์ ์ฉํ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์์ง๋ง ์ฑ ์ฝํ ์ธ ๋ฅผ ํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ง์ํ๋๋ก ๋์์ธํ ๋๋ ๊ทธ๋ ๊ฒ ์ผ๋ฐ์ ์ด์ง ์์ ์ ์์ต๋๋ค.
@storix ํ์ฌ ๊ฒฝ๋ก๋ฅผ ์๋์ผ๋ก ์ ์งํ๊ณ ์ฑ์ด ๋ค์ ์์๋ ๋ ๋ณต์ํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ๋๋ฌด ๋ง์ ์์ฉ๊ตฌ, ๋์ํฉ๋๋ค. ํ์ง๋ง ์ฌ์ ํ ๊ฐ๋ฅํฉ๋๋ค.
๋ํ: ๋ง์ ์๋๋ก์ด๋ ๊ฐ๋ฐ์๋ค์ ์ผ๋ง๋ ์ ์ ์์ iOS ์ฑ/๊ฐ๋ฐ์๋ค์ด ์ํ ๋ณต์์ ๊ท์ฐฎ๊ฒ ํ๋์ง์ ๋๋ ๊ฒ์
๋๋ค. ๋ด๊ฐ ์๋ ๋๋ถ๋ถ์ ๊ฐ๋ฐ์๋ ๊ทธ๊ฒ์ด ๋ฌธ์ ๋ผ๋ ์ฌ์ค์กฐ์ฐจ ๋ชจ๋ฅด๊ณ ์์ต๋๋ค. ๊ณ ๊ธ ์ฅ์น์์๋ง ์์
ํ๋ ๊ฒ์ด ์ฌ์น๋ผ๊ณ ์๊ฐํ์ญ์์ค.
@Zhuinden https://github.com/flutter/flutter/issues/6827#issuecomment -335160555 ์ ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ์ด ๋ด ์ฑํ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์๋ํ์ต๋๋ค. ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ ํ๋ ๋๋ง๋ค ์ผ๋ถ ์ํ๋ฅผ ์ ์ฅํฉ๋๋ค. https://docs.flutter.io/flutter/dart-ui/AppLifecycleState-class.html ๋
Flutter ํ์ด UI ์ํ๋ฅผ ์ ์ง/๋ณต์ํ๋ ํ์ค ๋ฐฉ๋ฒ์ผ๋ก Android/iOS ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ๋ ธ์ถํ์ง ์๋๋ก ์ด๊ตฌํ๊ณ ์ถ์ต๋๋ค. ๋ค์ดํฐ๋ธ ์ฑ์์๋ ์ ๋๋ก ์๋ํ๊ณ ์ฝ๋ฉํ๊ธฐ ์ด๋ ค์ ๊ณ UI์ ์ ํ๋ฆฌ์ผ์ด์ ์ํ ์ฌ์ด์ ๊ฒฝ๊ณ๊ฐ ํ๋ฆฟํ ๊ฒฝ์ฐ๊ฐ ๋ง์๊ณ ๊ฐ๊ฐ์ ๋ํด ์๋ก ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ด ์ ๊ณต๋์์ต๋๋ค. ์ด ๋ชจ๋ ์ด์ง์ ์ธ API๋ฅผ Flutter๋ก ๊ณต๊ฐํ๋ ๊ฒ์ ๋ถ๋๋ฌ์ด ์ผ์ ๋๋ค(ํนํ ํฅํ ์ถ๊ฐ ํ๋ซํผ์ ๋์์ผ๋ก ํ๋ ๊ฒฝ์ฐ).
Flutter์ ์ํ ๋น์ ์ฅ ์์ ฏ์ UI ์ํ์ ๋ํ ์ฑ ์์ ์์ ฏ์์ ์ฑ์ผ๋ก _์ด๋ฏธ_ ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ๋ฏ๋ก UI โโ์ํ๋ฅผ ์ ์ง/๋ณต์ํ๋ ๋ฌธ์ ๋ ๋์ _app_ ์ํ๋ฅผ ์ ์ง/๋ณต์ํจ์ผ๋ก์จ ์ ์ ๋ ๋ง์ด ๋ค๋ฃจ์ด์ง๊ณ ์์ต๋๋ค. iOS ๋ฐ Android์์์ ๊ฐ์ด UI์ ์ฑ ์ํ๋ฅผ ๋ค๋ฅด๊ฒ ์ทจ๊ธํ๋ ๊ฒ๊ณผ๋ ๋์กฐ์ ์ผ๋ก ์ด๊ฒ์ ์ข์ ๊ฒ์ผ๋ก ๋ด ๋๋ค.
ScrollView ๋ฐ TextField์ ๊ฐ์ ์ผ๋ถ Flutter ์์ ฏ์ ์์ ฏ์ ๋์ ์ํ๋ฅผ ์บก์ํํ๋ "์ปจํธ๋กค๋ฌ" ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ค ๋ฉด์์๋ ์์ ฏ ์ํ์ ์ค๋ ์ท์ธ "๊ธฐ๋ ํ" ๊ฐ์ฒด๋ก ์๋ํ๋ฉฐ ๋์ค์ ์์ ฏ์ ๋ค์ ์ ๊ณตํ์ฌ ์ด์ ๊ตฌ์ฑ์ผ๋ก ์ํ๋ฅผ ๋ณต์ํ ์ ์์ต๋๋ค. ์ต์ํ ์๋ฆฌ. ์ด๋ฌํ "๊ธฐ๋ ํ"์ ์ ์ง/๋ณต์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฒด ์ํ ๊ด๋ฆฌ์ ์ผ๋ถ๋ก ์ด๋ฅผ ์ฑ ์์ง ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฑ/UI ์ํ ์ด๋ถ๋ฒ์ด ์ข ๋ฃ๋๊ณ ์ตํธ์ธ์ด ๋๋ฉฐ Flutter ํ๋ ์์ํฌ์์ UI ์ํ ๋ณด์กด ํํฌ๋ฅผ ์ ๊ณตํ ํ์๊ฐ ์์ต๋๋ค(์ ์์๋ก ์ข์ต๋๋ค!).
์ฆ, ๊ฐ๋ฐ์์ ์ฑ ์์ผ๋ก ํ๋ ์ต๋ํ ์ฝ๊ฒ ๋ง๋ค๋๋ก ํ์ญ์์ค. ๊ฐ๋ฐ์๊ฐ ๋ฐ์ฏค ์์ฑ๋ ์์์ด Flutter๊ฐ ์ฌ๋ฌ ํธ์ถ์ ๊ฑธ์ณ ์ง์๋๊ธฐ์ ์ถฉ๋ถํ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ก ๊ฐ์ฃผ๋ ๋งํผ ์ถฉ๋ถํ ์ค์ํ๋ค๊ณ ์ฃผ์ฅํ ์ ์์ต๋๋ค. ๊ฐ์ฒด์ ์ํ๋ฅผ ์ ์งํ๋ฉด ๋ฒ์ ๊ด๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ด๊ฒ์ด ๋ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด ๋ฌธ์ ์ ์ง์ ์ด ์์์ต๋๊น? '์ฒซ ์คํ'๊ณผ '๋ณต์๋' ํ๋ก์ธ์ค ์ํ๋ฅผ ๊ตฌ๋ณํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ข ๋ฃ๋ ํ๋ก์ธ์ค๋ก ๋ค์ ์ด๋ํ ๋ ์ฌ๋ฐ๋ฅธ ํ๋ฉด์ ํ์ํ๋๋ก ํ๋ก๊ทธ๋๋ฐํ ์ ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
@lukaspili๋ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค. "ํ์ํ ์ ์ผํ ์ํ ๊ด๋ฆฌ๋ ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์ ์๋ ๋์ OS์ ์ํด ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ์ ๋๋ค."
์, ๊ทธ๋ ๋ค๋ฉด ๋ผ์ฐํฐ ์คํ์ ์ด๋ป์ต๋๊น? ๋์คํฌ์ ์ ์ฅ๋ ํ์๊ฒ ์ต๋๊น? ๋ํ ๋๋ ๋ t find proper solution to determine that application was restored. Every time when app goes to background I need to save router stack, app data, state to disc? What if I don
t ์ฌ์ฉ ๋์ ์ค๋?
์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ก ํ๋ฌ๊ทธ์ธ์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ์ ๊ณตํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด ์ ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. #22328
์ด ๋ฌธ์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
๋๋ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค. Firebase ์ค์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํตํด ์ฌ๊ธฐ์ ํ ์คํธ ์ ๋ ฅ์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ฐฉ๋ฒ์ ๋งค์ฐ ์กฐ์กํ๊ณ ๋ชจ๋ ๋จ์ผ ์ฌ์ฉ์๊ฐ ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋ฆฌ๋๋ ์ ๋๋ฏ๋ก ํ์ฅ์ฑ ์ต์ ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋ฐ๋ผ์ ๋ด ๋ฐ์ดํฐ๋ Gmail ๊ณ์ ์ ๋ํ ์ก์ธ์ค ๊ถํ์ด ์๋ ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋์ด ์ฌ์ฉํ ์ ์์ต๋๋ค. Redis๋ฅผ ์ฌ์ฉํด ๋ณด์์ง๋ง ๋ค๋ฅธ ์ฌ์ฉ์๋ฅผ ์ํด ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณ๋์ ๋ชฉ๋ก์ ์์ฑํ ์ ์์ง๋ง ํญ์ POST ๋ฐฉ์์ผ๋ก ์ํ๋ฉ๋๋ค. ์ฆ, ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๋๋ง๋ค ๋ณด๊ธฐ๋ฅผ ์๋ก ๊ณ ์ณ์ผ ํฉ๋๋ค. ์ฆ, ์ค์๊ฐ ์์์ด ์์ต๋๋ค. ์ฐธ์ผ๋ก ํฐ ๊ฒฐํจ์ ๋๋ค.
์ฌ๊ธฐ์ ๋ ํฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋๋ ๋ ๋ฌ ์ ์ @matthew-carroll ๊ณผ ์ฝ๊ฐ์ ๋ํ๋ฅผ ๋๋ด๊ณ ์ด๊ฒ์ด ์งํ ์ค์ด๋ผ๊ณ ํ์ ํฉ๋๋ค.
๋๋ ์ด๊ฒ์ ๋ค๋ฃจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๊ธฐ ์์ํ์ต๋๋ค . ์ค์ ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ์ง๋ ์์ง๋ง Dart ์ ์ฉ ๊ตฌํ์ ๋ํ ์์ด๋์ด ์ค ํ๋์ ๋๋ค. #6225๋ ์ผ์ ์กฐ๊ธ ๊น๋ค๋กญ๊ฒ ๋ง๋ค์์ต๋๋ค.
Flutter๋ก ๋ง๋ ๊ฒ์ผ๋ก ์๋ ค์ง Google Ads ์ฑ์ ํ๋์ด ๋ค์ ์์๋ ํ์๋ ํ์ ์ํ๋ฅผ ์ ์งํฉ๋๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ์ง๋ผ๋ ๊ตฌํ ๋ฐฉ๋ฒ์ ์๋ ๊ฒ์ ์ข์ ์ฐธ๊ณ ์๋ฃ๊ฐ ๋ ๊ฒ์ ๋๋ค.
@aletorrado ์ฌ์ฉ์๊ฐ Android/IOS '์์ ๊ด๋ฆฌ์'์์ ์ฑ์ ์ญ์ ํ๋ค๊ฐ ๋์ค์ ๋ค์ ์คํํ ๊ฒฝ์ฐ Google Ads ์ฑ์ด ํ์ ์ํ๋ฅผ ์ ์งํ๋์?
@gitspeak ์๋์, ํ๋์ด OS์ ์ํด ์๋์ผ๋ก ์ข ๋ฃ๋ ๊ฒฝ์ฐ์๋ง ์ํ๋ฅผ ์ ์งํฉ๋๋ค(onSaveInstanceState ํํฌ ์ฌ์ฉ).
@aletorrado ๊ทธ๋ผ ์๋ง ๊ทธ๊ฒ ์ ์ผํ ๋ฐฉ๋ฒ์ผ ๊ฒ์ ๋๋ค...
์ค์ ๋ก Google Ads ์ฑ์ ๋ค์ด๊ฐ๋ ค๊ณ ์๋ํ์ง๋ง ์ฒซ ๋ฒ์งธ ํ๋ฉด ์ด์ธ์ ๋ชจ๋ ํ๋ฉด์ ์ก์ธ์คํ๋ ค๋ฉด ํ์ฑ ๊ณ์ ์ด ์์ด์ผ ํฉ๋๋ค. DI๊ฐ ์ค์ ๋ก ์๋ํ๋์ง ํ ์คํธํ ์ ์์ต๋๋ค.
๊ทธ๋ ์ต๋๋ค. ๋ณด์ฅ. ๋ํ ์คํฌ๋กค ์์น์ ๊ฐ์ ๋ค๋ฅธ ์ํ๋ฅผ ์ ์งํฉ๋๋ค.
ํผ๋์ ๋ช ํํ ํ๊ธฐ ์ํด:
์ด ๋ฐฉ๋ฒ์ ๋ฌธ์ ๋ฅผ ์ ํ ํด๊ฒฐํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ถ์ฅํ์ง ์์ต๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๋ฉด ์ ์ฒด ์ํ๊ฐ ์ฌ์ ํ ์์ค๋ฉ๋๋ค. ์ค์ > ์ฑ์์ ํ๋ก์ธ์ค๋ฅผ ์ค์งํ์ฌ Google Ads์์ ์ด ์์ ์ ์๋ํ ์ ์์ต๋๋ค. UI๊ฐ ์์ค๋ฉ๋๋ค.
๊ฒฉ๋ฆฌ ์ํ๋ฅผ ๋ก์ปฌ๋ก ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ง๋ง ๊ทธ๊ฒ์ด ์ผ๋ง๋ ์คํ ๊ฐ๋ฅํ๊ณ ์์ ํ์ง ํ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ๋ง์ ์กฐ์ฌ๊ฐ ํ์ํฉ๋๋ค.
ํ์ฌ๋ก์๋ ์์์ ์ค๋ช ํ ์๋ฃจ์ ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ๊ธฐ๋ณธ ๋ฉ์๋์ ์ฐ๊ฒฐํ๊ณ ๋์ค์ ๋ณต์ํ ์ ์๋๋ก ์ฑ ์ํ๋ฅผ ์ ํ์ ์ผ๋ก ์ ์ฅํฉ๋๋ค. iOS์ Android ๋ชจ๋์์ ํ๋ ์์ํฌ๊ฐ ์ง์ํ๋ ์๋ ์๋ฃจ์ ์ ์์ง ๋ฉ์์ต๋๋ค.
์ค์ > ์ฑ์์ ํ๋ก์ธ์ค๋ฅผ ์ค์งํ์ฌ Google Ads์์ ์ด ์์ ์ ์๋ํ ์ ์์ต๋๋ค. UI๊ฐ ์์ค๋ฉ๋๋ค.
์๋ ์์ ํ ๊ด์ฐฎ์ต๋๋ค. ์ฑ์ ๊ฐ์ ์ค์งํ๋ฉด ์ํ๊ฐ ์์ค๋ฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ํ๋ก ์ข ๋ฃ๋๋ฉด ์ ๋ฉ๋๋ค.
์ด๋ ์ชฝ์ด๋ , ๋์คํฌ/๋ฒ๋ค์ ์๋ฌด๊ฒ๋ ์ ์งํ์ง ์๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ์ฑ๊ธํค ์ธ๋ฉ๋ชจ๋ฆฌ๋ก ์ ์งํ๋ฉด ์์ค๋ฉ๋๋ค.
์ฑ ์์ฒด๋ฅผ ์์ ํ๊ธฐ ์ํด Google Ads ๊ณ์ ์ ๋ง๋ค์ง ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ณ์ ์์ด ์ฑ์ ํ ์คํธํ ์ ์๋ค๋ ๊ฒ์ ์ ๊ฐ์ ๋๋ค. :์๊ฐํ๋ ์ผ๊ตด:
๊ธฐ๋ณธ ๋ฉ์๋์ ์ฐ๊ฒฐํ๊ณ ๋์ค์ ๋ณต์ํ ์ ์๋๋ก ์ฑ ์ํ๋ฅผ ์ ํ์ ์ผ๋ก ์ ์ฅํฉ๋๋ค.
์ค์ ๋ก ๊ฐ์ฅ ์ข์ ํด๊ฒฐ์ฑ ์ ํ์ฑ ์ํ๋ฅผ ๋์คํฌ์ ์ ์งํ๊ณ Android ๊ธฐ๋ณธ ์ธก์์ ํ๋ก์ธ์ค ์ข ๋ฃ๋ฅผ ๊ฐ์งํ๋ ๊ฒ์ ๋๋ค. ํ๋ก์ธ์ค ์ข ๋ฃ๋ฅผ ๊ฐ์งํ๋ฉด ๋์คํฌ์์ ๋ค์ ๋ก๋ํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์ง์ฐ๊ณ ์ฒ์๋ถํฐ ๋ค์ ์์ํ์ญ์์ค.
๋๋ Flutter์ ๋ด๋น๊ฒ์ดํฐ์ ๋ํด ์ถฉ๋ถํ ์์ง ๋ชปํฉ๋๋ค setHistory
์คํ์ด๋ Conductor ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ setBackstack
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ๊ธฐ๋ก์ ์ฌ๊ตฌ์ฑํ ์ ์๋์ง ์๋ ค์ค๋๋ค.
ํ๋/ํ๋๊ทธ๋จผํธ๋ ActivityRecord/FragmentRecord๋ฅผ ์ฌ์ฉํ์ฌ ๋ด๋ถ์ ์ผ๋ก ์ด ํญ๋ชฉ์ ์ฒ๋ฆฌํ๋ฏ๋ก ๊ทธ ์ด์์ ์ธ๊ธ๋์ง ์์ต๋๋ค.
๋ชจ๋ ํต์ฐฐ๋ ฅ @mehmetf์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ํ ์ ์ฅ/๋ณต์ ์ง์์ด ๊ตฌํ๋๊ธฐ๊น์ง ๋ฉ์๋ค๋ ์ฌ์ค์ด ์ํ๊น์ต๋๋ค.
flutter_redux๋ ์ผ๋ถ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ์ง๋ ฌํ
๊ธ์, ๋น์ ์ด Redux ์ ์ฅ์์ ์ผ๋ฃฉ์ ๋์คํฌ์ ์ ์งํ๋ค๋ฉด. "ํ๋ก์ธ์ค ์ข ๋ฃ ํ ๋ฌดํ ๋ก๋ฉ ๋ํ ์์" ๋ฌธ์ ์ ์ฃผ์ํ์ญ์์ค. :์๊ฐํ๋ ์ผ๊ตด:
ํผ๋์ ๋ช ํํ ํ๊ธฐ ์ํด:
์ฌ์ค ์ข ๋ ํท๊ฐ๋ ค์..
์ผ๋ฆฌ ์ด๋ตํฐ ์ค ํ๋์ด๊ธฐ ๋๋ฌธ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ์ ์ํด ํน์ดํ ์์ ์ ์ํํด์ผ ํ์ต๋๋ค. ๊ทธ๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋(ํ๋์ด ์๋) ์ฃผ์ ๊ฒฉ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์ ์งํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์ฑ๋ ๋ ์ด ๊ฒฉ๋ฆฌ๋ฅผ Flutter ๋ณด๊ธฐ์ ์ ๋ฌํฉ๋๋ค.
๊ทธ๊ฒ์ด ๋น๋ฉดํ ๋ฌธ์ ์ ์ด๋ค ๊ด๋ จ์ด ์์ต๋๊น? Dart ๋ถ๋ฆฌ๋ ๋ณ๋์ ํ๋ก์ธ์ค์์ ์คํ๋ฉ๋๊น?
"์ํ ์ ์ง"๋ก ๊ด์ฐฐํ๊ณ ์๋ ๊ฒ์ ์์์ ์ค๋ช ํ ๋ฐฉ๋ฒ๋ก ์ ๋ถ์์ฉ์ ๋๋ค. Google Ads์์ ์กํฐ๋นํฐ๋ฅผ ์ข ๋ฃํด๋ Flutter์ "UI"๋ ์ฃฝ์ง ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ์ ์ฐ๊ฒฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ณด๊ด๋ฉ๋๋ค. ํ๋์ด ๋ค์ ์์๋๋ฉด ๋์ผํ ๊ฒฉ๋ฆฌ๋ฅผ ๋ก๋ํ๊ณ ๋น์ฌ๋ผ UI๋ฅผ ๋ค์ ๊ฐ์ ธ์ต๋๋ค.
๋ด ์ดํด๋ @aletorrado ๊ฐ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ ํ "์ํ ์ ์ง"๋ฅผ ๊ด์ฐฐํ๋ค๋ ๊ฒ์ ๋๋ค. ์๋ง๋ ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ด๋ํ์ ๋(ag ํ ๋ฒํผ ๋๋ฆ)์ผ ๊ฒ์ ๋๋ค.
์ฐธ๊ณ : ๋ฐํ์์ "ํ๋์ด ์ฃฝ์ผ๋ฉด" ํญ์ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํด์ผ ํฉ๋๋ค.
์ด ๋ฐฉ๋ฒ์ ๋ฌธ์ ๋ฅผ ์ ํ ํด๊ฒฐํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ถ์ฅํ์ง ์์ต๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๋ฉด ์ ์ฒด ์ํ๊ฐ ์ฌ์ ํ ์์ค๋ฉ๋๋ค. ์ค์ > ์ฑ์์ ํ๋ก์ธ์ค๋ฅผ ์ค์งํ์ฌ Google Ads์์ ์ด ์์ ์ ์๋ํ ์ ์์ต๋๋ค. UI๊ฐ ์์ค๋ฉ๋๋ค.
@Zhuinden์ด ์ธ๊ธํ๋ฏ์ด ์ด๊ฒ์ "์์ ๊ด๋ฆฌ์"์์ ์ฑ์ ์ญ์ ํ๋ ์ ํจํ "์ํ ์ ์ง" ์๋๋ฆฌ์ค๊ฐ ์๋๋๋ค.
๊ฒฉ๋ฆฌ ์ํ๋ฅผ ๋ก์ปฌ๋ก ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ง๋ง ๊ทธ๊ฒ์ด ์ผ๋ง๋ ์คํ ๊ฐ๋ฅํ๊ณ ์์ ํ์ง ํ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ๋ง์ ์กฐ์ฌ๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๊ฒ์ ๊ทธ๊ฒ์ ๋ํด ๊ฐ ๋ฐฉ๋ฒ์ด ์๋๋๋ค. Android์ ๊ฒฝ์ฐ "์ํ ์ ์ง"๊ฐ ์ฌํ ํ๋ก์ธ์ค ์ข ๋ฃ๊ฐ ํ์ํ ์๋๋ฆฌ์ค์ ๋ํด ํ๋ ์ํ๋ฅผ ์ ์ฅํ๋๋ก ๋ช ์์ ์ผ๋ก ๋ง๋ค์ด์ก์ผ๋ฏ๋ก onSaveInstanceState ๋ฉ์ปค๋์ฆ์ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค. IOS ์ฑ ๋ผ์ดํ ์ฌ์ดํด์ ์ต์ํ์ง ์์ต๋๋ค.
ํ์ฌ๋ก์๋ ์์์ ์ค๋ช ํ ์๋ฃจ์ ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ๊ธฐ๋ณธ ๋ฉ์๋์ ์ฐ๊ฒฐํ๊ณ ๋์ค์ ๋ณต์ํ ์ ์๋๋ก ์ฑ ์ํ๋ฅผ ์ ํ์ ์ผ๋ก ์ ์ฅํฉ๋๋ค. iOS์ Android ๋ชจ๋์์ ํ๋ ์์ํฌ๊ฐ ์ง์ํ๋ ์๋ ์๋ฃจ์ ์ ์์ง ๋ฉ์์ต๋๋ค.
๋ฐํ์์ด ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํ ์ ์ ํ Android ๊ธฐ๋ฅ์ ์น์ธํ๋ ๊ฒ๋ณด๋ค ์๋ฃจ์ ์ด ์ค๋ช ๋์ง ์์์ต๋๋ค.
๋ฐํ์์ด ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํ ์ ์ ํ Android ๊ธฐ๋ฅ์ ์น์ธํ๋ ๊ฒ๋ณด๋ค ์๋ฃจ์ ์ด ์ค๋ช ๋์ง ์์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ผ์ ๋ํด ์ค๋ช ํ์ง๋ง Flutter๊ฐ ํ์ํ ๊ฒ์ ์ง์ํ๋์ง ์๋ ค์ค ๋งํผ Flutter์ ๋ํด ์ถฉ๋ถํ ์์ง ๋ชปํฉ๋๋ค(์ฃผ์ด์ง ์๊ฐ์ ์์์ ํ์ ๊ธฐ๋ก์ ์ค์ ํ ์ ์๋ ๊ธฐ๋ฅ ๐ ).
@Zhuinden ์์ onSaveInstanceState๊ฐ ๋ค๋ฃจ๋ "
... ๊ทธ๋ฆฌ๊ณ ์ ์ ์ฅ์ ๋ฐ๋ณตํ์๋ฉด: Android ์์ /ํ๋, ์๋น์ค, ์ ํ๋ฆฌ์ผ์ด์ ์๋ช ์ฃผ๊ธฐ(onSaveInstanceState ํฌํจ)๋ ๋ชจ๋ Android ํ๋ก๊ทธ๋๋ฐ ๊ณ์ฝ์ ์ผ๋ถ์ ๋๋ค. ์ฑ ํ๋ก์ธ์ค ์ ์์คํ ์์ค ์ ์ฝ์ ๋ถ๊ณผํ๋ ์๋จ์ด๋ฉฐ Flutter ์ฝ๋๊ฐ Android ์ฑ ํ๋ก์ธ์ค ๋ด์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ ์ฝ์ ์ฐํํ๋ ๊ฒ์ ํ๋ช ํ์ง ์์ต๋๋ค.
์น์ ํ๋ Android ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ,
๊ตฌ์ฑ ๋ณ๊ฒฝ๋ฟ๋ง ์๋๋ผ ํ๋ก์ธ์ค ์ข ๋ฃ ์ค์๋ ์ํ๋ฅผ ์ ์ฅํ์ฌ ์ฌ์ฉ์์๊ฒ ์ต๊ณ ์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ์ด์ ์ ๋คํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์์ 200๊ฐ ๋๊ธ์์ Flutter๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช๊ณ ์๋ค๋ ๊ฒ์ ์ฝ์์ ๊ฒ์ ๋๋ค. ๊ทธ ์ด์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋ ค๋๋ฆฌ๊ณ ์ ํฉ๋๋ค .
onSavedInstanceState
์์ต๋๊น?onSavedInstanceState
ํ๋ ค๋ฉด ๊ฐ๋ฐ์๊ฐ ์ฑ ์ํ๋ฅผ ๋๊ธฐ์ ์ผ๋ก ์ ์ฅํด์ผ ํฉ๋๋ค. ์ฆ์ ๋์๊ฐ์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ Flutter์์ ํต์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๋๊ธฐ์์
๋๋ค( Future
). ๋ฐ๋ผ์ Android์์ ์์ฒญํ ๋ Flutter ์ฑ์์ ์ ์ฅ๋ ์ํ๋ฅผ ์์ฒญํ ์ ์์ต๋๋ค.
_ํ์ง๋ง ๋ฏธ๋ฆฌ ์์ฑํ๋ค๋ฉด ์ ์ฅ๋ ์ํ๋ก ๋๋๋ฆด ์ ์์ง ์๊ฒ ์ต๋๊น?_
๋ฌธ์ ๋ onSavedInstanceState
์ ์ก์ธ์คํ ์ ์๋ค๋ ๊ฒ์ด ์๋๋ผ ํ์ด๋ฐ์
๋๋ค. Android๊ฐ ์ํ๋ฅผ ์ ์ฅํ๋๋ก ์์ฒญํ ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ํ์๊ฐ ์์ต๋๋ค.
onSavedInstanceState
๋ฃ๊ณ ์ด ์ด๋ฒคํธ์ ๋ํด Flutter ์ฑ์ ์๋ฆด ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฑ ์ํ๋ฅผ ์ ์ฅํ๊ณ file
์๋๋ค. ์ฑ์ด ํ๋ก์ธ์ค ์ข
๋ฃ์์ ๋ณต๊ตฌ๋๋ฉด(Android ์ธก์์ savedInstanceState
๋ฅผ ํตํด ์ด๋ฅผ ๊ฐ์งํ ์ ์์) ํ์ผ ์์คํ
์์ ํ์ผ์ ๋ก๋ํ๊ณ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ํ๋ฅผ ๋ณต๊ตฌํฉ๋๋ค. (ํํธ: ํ๋ซํผ ์ฑ๋์ ์ฌ์ฉํ์ธ์. ์๊ฐ๋ณด๋ค ์ฝ์ต๋๋ค.)
์ฌ์ฉ์๊ฐ ์ฑ์ ์ข ๋ฃํ์ ๋ ์ํ๋ฅผ ๋ณต๊ตฌํ๊ฑฐ๋ ๋๋ฌด ์ค๋๋ ๊ฒฝ์ฐ ์ ์ฅ๋ ์ํ๋ฅผ ํด์ ํ ์๋ ์์ต๋๋ค!
ํ์ด๋จธ๋ฅผ ์คํํ๊ณ ํ๋ซํผ ์ธก์ ์ฑ ์ํ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ง์์ ์ผ๋ก ์ ์ฅํ ์ ์์ต๋๋ค. 3์ด๋ง๋ค ํฉ์๋ค. ๊ทธ๋ฐ ๋ค์ Android๊ฐ onSavedInstanceState
๋ฅผ ํธ์ถํ๋ฉด ์ด์ ์ ์ ์ฅํ ์ํ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. (์, ์ง๋ 3์ด ๋์ ๋ฐ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ์์ ์ ์์ต๋๋ค.)
์๋ฃจ์
B์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฅ๋ ์ํ๋ ํ๋ซํผ ์ธก์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ช ์ด๋ง๋ค ์ํ๋ฅผ ์ ์ฅํ๋ ๋์ ์ฌ์ฉ์๊ฐ ์ผ๋ถ ์์
์ ์ํํ ํ ์ํ๋ฅผ ์ ์ฅํ๋๋ก ์๋์ผ๋ก ์์ฒญํฉ๋๋ค. (์๋์ ์ด๊ณ TextField
์ ํ
์คํธ๋ฅผ ์
๋ ฅํ๊ณ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค).
3๊ฐ์ง ์๋ฃจ์ ๋ชจ๋ ๊ฒฐํฉ ๊ฐ๋ฅํ๋ฉฐ ์ฑ์ ๊ฐ์ฅ ์ ํฉํ ๊ฒ์ ์ฌ์ฉํ์ญ์์ค.
Android View
์ ๋ฌ๋ฆฌ Widget
์๋ onSaveInstanceState
์ฝ๋ฐฑ์ด ์์ต๋๋ค. ์์ ฏ ํธ๋ฆฌ๋ ์๋์ผ๋ก ์ ์ฅ๋์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ข์ ์ผ์
๋๋ค! UI์ ์ํ๋ ์ต์ข
์ ์ผ๋ก ๋ถ๋ฆฌ๋๋ฉฐ ๋ทฐ ์ํ๋ฅผ ๋ณต์ํ๊ฑฐ๋ ํ๋ ๋ฐ ์กฐ๊ฐ์ ์ธ์คํด์คํํ ๋ ๋ฐ์ฌ ๋ง๋ฒ์ด ์์ต๋๋ค.
์ํ๋ฅผ ์ ์ฅํ๋ ค๋ฉด ์ฑ์ ๊ฐ ํ๋ฉด์ ๋ฐ๋ณตํ๊ณ ๋ณต์ํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์ ์ฅํด์ผ ํฉ๋๋ค. ๋๋ ์ด๊ฒ์ json์์ ํ๋ ๊ฒ์ ์ข์ํ์ง๋ง ๋ ๋์ ์ฑ๋ฅ์ ์ํด protobuf๋ฅผ ์ ํํ ์ ์์ต๋๋ค(์ต์ ํํ๊ธฐ ์ ์ ์ธก์ ํ์ญ์์ค!).
์ฐ๋ฆฌ๊ฐ ์ฌ๋ํ๋ ์ํ ์นด์ดํฐ ์ฑ์ ๋ณด๋ฉด ๋งค์ฐ ์ฝ์ต๋๋ค.
// complete app state of sample application
{
"counter": 24,
}
์ฌ๋ฌ ํ๋ฉด ๋๋ ๋ํ ์์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ค์ ์ฑ ์ํ json์ผ๋ก ๋๋ ์ ์์ต๋๋ค.
{
"currentRoute": "/todo-detail/241",
"routes": {
"todo-detail/241": {
"edited": "true",
"title": "Buy bananas",
"picture": "http://....",
"show_confirm_delete_dialog": "false"
},
"todo-list": {
"current_scroll_position": "365",
"filter": "Filter.TODAY"
}
}
}
์ค์ ๊ตฌํ์ ์ฑ ์ํคํ ์ฒ์ ํฌ๊ฒ ์์กดํฉ๋๋ค.
scoped_model
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ชจ๋ธ์ ์ ์ฅํ๊ธฐ์ ์ถฉ๋ถํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ๋ค์ ๋ง๋๋ ๊ฒ์ Redux ์ํ๋ฅผ ๋ค์ ๋ง๋๋ ๊ฒ๊ณผ ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฆ
๋๋ค.๋ด๊ฐ ๋น์ ์๊ฒ ์ค ์ ์๋ ์ต๊ณ ์ ํ:
colleagues
์ด์ผ๊ธฐํ๋ฉด ๋ช ๋
๋์ encodeRestorableState
๋ฅผ ํตํด ์ํ ๋ณต์์ ๊ตฌํํ์ง ์์๋ค๊ณ ๋งํ ๊ฒ์
๋๋ค. ์๋๋ก์ด๋ 1M+ vs iOS 974ํ์ค์นผ
"ํ๋์ ์ ์งํ์ง ์์" ์ค์ ์ ์ผญ๋๋ค.
์๋์, ์ด๊ฒ์ ํ๋ก์ธ์ค ์ข ๋ฃ์ ๋ํด ์ ์ ํ๊ฒ ํ ์คํธํ์ง ์์ต๋๋ค. ํด๋น ์ค์ ์ ๋ช ์์ ์ผ๋ก ํ์ฑํํ์ง ์๋ ํ ์ ๋ ๋ฐ์ํ์ง ์์ต๋๋ค. ๐
์ฌ๋ฌ ํ๋ฉด ๋๋ ๋ํ ์์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ค์ ์ฑ ์ํ json์ผ๋ก ๋๋ ์ ์์ต๋๋ค.
{ "currentRoute": "/todo-detail/241", "routes": { "todo-detail/241": { "edited": "true", "title": "Buy bananas", "picture": "http://....", "show_confirm_delete_dialog": "false" }, "todo-list": { "current_scroll_position": "365", "filter": "Filter.TODAY" } } }
์ด๋ฐ, ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ์๋ํ๊ธฐ ์ํด "ํ์ ์ํ๋ ์ ํ ์ํ ๊ธฐ๊ณ์ ์ํ๋ก์ ์์ฉ ํ๋ก๊ทธ๋จ ์ํ์ ์ผ๋ถ"์ ๋๋ฌํ๊ณ ์์ง๋ง ๋ชจ์์ด ๋ง์์ ๋ญ๋๋ค ๐
์ค, ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ์๋ํ๊ธฐ ์ํด "ํ์ ์ํ๋ ์ ํ ์ํ ๊ธฐ๊ณ์ ์ํ๋ก์ ์์ฉ ํ๋ก๊ทธ๋จ ์ํ์ ์ผ๋ถ์ ๋๋ค"์ ๋๋ฌํ๊ณ ์์ต๋๋ค.
๐ ์์ํ์ง ๋ง์ธ์.
๋๋จธ์ง ์ฑ ์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค/์๋ฒ์ ์ ์ฅํด์ผ ํฉ๋๋ค. onSaveInstanceState์ ์ ์ฅํ ๊ฐ์น๊ฐ ์๋ ์ ์ผํ ์์ ์ํ๋ ํ์ ์คํ๊ณผ ์ผ๋ถ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋๋ค. ์ด๊ฒ์ ๋ํ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ์ด ์ค๋ ๋์์ ์๊ตฌํ๋ ๊ฒ์ ๋๋ค.
๋๋จธ์ง ์ฑ ์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค/์๋ฒ์ ์ ์ฅํด์ผ ํฉ๋๋ค. onSaveInstanceState์ ์ ์ฅํ ๊ฐ์น๊ฐ ์๋ ์ ์ผํ ์์ ์ํ๋ ํ์ ์คํ๊ณผ ์ผ๋ถ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋๋ค. ์ด๊ฒ์ ๋ํ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ์ด ์ค๋ ๋์์ ์๊ตฌํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ ํต์ฌ์ ๋๋ค! (๋ํ "Android ์๋น์ค" ์ง์)
@gitspeak , ์ฐ๋ฆฌ๊ฐ ์ด ๋ฌธ์ ์ ๊ด๋ จ์ด ์๋ ๋ง์ง๋ง ๊ตํ์ ๋๋ค. ๋๋ ๋ ๋ค ์จ๊ธธ ๊ฒ์ด๋ค. ํ ๋ก ์ ๊ณ์ํ๋ ค๋ฉด ๋ด github ํธ๋ค @ gmail.com์ ์ฌ์ฉํ์ฌ ์ ์๊ฒ PM์ ๋ณด๋ด์ฃผ์ญ์์ค. ์ด ๋ฌธ์ ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์คํด๊ฐ ๋ถ๋ช ํ ์์ต๋๋ค.
Flutter์ Android ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์์ ํ๋ ๊ฐ๋ฐ์ ์ค ํ ๋ช ์ผ๋ก์, ์ํ ์ ์ฅ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ์ ๋ํ ํ๋ฅญํ ๊ฐ์๋ฅผ ์ ๊ณตํ @passsy ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋ํ ์ด ์ค๋ ๋์ ๊ฐ๋ฐ์๊ฐ ๋ค๋ฃจ๊ณ ์๋ ํน์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ดํดํ๋ ๋ฐ ๊ด์ฌ์ด ์๋ค๊ณ ๋ง๋ถ์ด๊ณ ์ถ์ต๋๋ค. ์ํ ์ ์ฅ์ ๋ค์ํ ๋ชฉํ๋ฅผ ํฌ๊ดํ๋ ๊ฐ๋ ์ ๋๋ค. ํ ์ฑ์์๋ ์ํ๋ฅผ ํธ์ถํ์ง๋ง ๋ค๋ฅธ ์ฑ์์๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ํ ์ฑ์ ์ ๋์ ์ผ๋ก ์ ์ฅ๋ ์ํ๋ฅผ ๋ณด์ฅํด์ผ ํ๋ ๋ฐ๋ฉด, ๋ค๋ฅธ ์ฑ์ ๋จ์ํ ์ผ๋ถ ์ํ๋ฅผ ์ ์ฅํ๊ธฐ๋ฅผ ์ํ์ง๋ง ๊ทธ๊ฒ ์์ด๋ ์ค๋จ๋์ง ์์ต๋๋ค. ์ผ๋ถ ์ฑ์ ์์ ํ Flutter๋ก ๋น๋๋๊ณ , ๋ค๋ฅธ ์ฑ์ ๊ธฐ์กด Android/iOS UI์ Flutter ๊ฐ์ ์ ๋ณด๋ฅผ ๋๊ธฐํํด์ผ ํฉ๋๋ค.
์ํ ์ ์ฅ๊ณผ ๊ด๋ จํ์ฌ ์ฑ์ด ์ง์ํด์ผ ํ๋ ํน์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ค๋ช ํ๊ณ ์ถ์ ์ฌ๋์ด ์์ผ๋ฉด ์ธ์ ๋ ์ง [email protected] ์ผ๋ก ์ด๋ฉ์ผ์ ๋ณด๋ด์ฃผ์ธ์. ๋๋ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์์งํ๊ณ ์์ต๋๋ค.
@passsy ๊ฑด์ค์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํ๊ธฐ ์ํ ์ง์งํ ์๋๋ก ์๋ ๋ด ์๊ฒฌ์ ๊ณ ๋ คํ์ญ์์ค.
๋ณต๊ตฌ ์๋ฃจ์ A: ์์ ์ ์ ์ฅ๋ ์ธ์คํด์ค ์ํ ํ์ผ
onSavedInstanceState๋ฅผ ๋ฃ๊ณ ์ด ์ด๋ฒคํธ์ ๋ํด Flutter ์ฑ์ ์๋ฆด ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฑ ์ํ๋ฅผ ์ ์ฅํ๊ณ ํ์ผ์ ์๋๋ค. ์ฑ์ด ํ๋ก์ธ์ค ์ข ๋ฃ์์ ๋ณต๊ตฌ๋๋ฉด(Android ์ธก์์ storedInstanceState๋ฅผ ํตํด ์ด๋ฅผ ๊ฐ์งํ ์ ์์) ํ์ผ ์์คํ ์์ ํ์ผ์ ๋ก๋ํ๊ณ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ํ๋ฅผ ๋ณต๊ตฌํฉ๋๋ค. (ํํธ: ํ๋ซํผ ์ฑ๋์ ์ฌ์ฉํ์ธ์. ์๊ฐ๋ณด๋ค ์ฝ์ต๋๋ค.)
์ฌ์ฉ์๊ฐ ์ฑ์ ์ข ๋ฃํ์ ๋ ์ํ๋ฅผ ๋ณต๊ตฌํ๊ฑฐ๋ ๋๋ฌด ์ค๋๋ ๊ฒฝ์ฐ ์ ์ฅ๋ ์ํ๋ฅผ ํด์ ํ ์๋ ์์ต๋๋ค!
๋ช ๊ฐ์ง ๋ฌธ์ :
1) ์ด ์ ๊ทผ ๋ฐฉ์์๋ ๊ณ ์ ํ ๊ฒฝ์ ์กฐ๊ฑด์ด ์์ต๋๋ค. "์ํ ์ง์" ์ค๋ ๋๋ ์๋ช
์ฃผ๊ธฐ ์ด๋ฒคํธ๋ฅผ ํธ์ถํ๋ Android ์ฑ ๊ธฐ๋ณธ ์ค๋ ๋๋ณด๋ค ํจ์ฌ ์ค๋ ์ง์๋ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ํ์ผ์ด ์์ฑ๋๋ ๋์ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋ ์ ์์ต๋๋ค. "์ํ ์ ์ฅ" ์ค๋ ๋์ ์๋ฃ ์ ํธ์ ๋ํ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋์์ ์ฐจ๋จํ์ฌ ๋ ์ค๋ ๋๋ฅผ ์กฐ์ ํ๋ ค๊ณ ์๋ํ ์ ์์ง๋ง ์ถ๊ฐ ๋๊ธฐํ ๋ณต์ก์ฑ์ ๋์
ํ๋ ๊ฒ ์ธ์๋ ์ถฉ๋ถํ ์ง์ฐ์ด ANR์ ์ ๋ฐํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ํ์ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. (https://developer.android.com/topic/performance/vitals/anr)
ํ์ผ์ "์ํ ์ ์ฅ"์ด ๋๋ฌด ๋นจ๋ผ์ ์ด๋ฐ ์ผ์ด ์ผ์ด๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ์ฃผ์ฅํ ์ ์์ง๋ง ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ค์ด๋ก๋, ํ๋ ์ด ์คํ ์ด ์
๋ฐ์ดํธ, ๋ฏธ๋์ด ํ๋ ์ด์ด ๋ฑ๊ณผ ๊ฐ์ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์คํ๋๋ ๋์ ์ค๋ ๋ ์์ฝ ๋ฐ ์คํ ๋ฆฌ์ง ๋๊ธฐ ์๊ฐ์ ์ค์ ์ง์ฐ์ ๊ณ ๋ คํ์ญ์์คโฆ ์ด์ ๋ํด ํ ๋ก ํ๋ ๊ฒ์ ์๋์ง๋ง ๋ด ๊ฐ์ธ์ ์ธ ๊ฒฝํ(๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๊ณต์ )์ ๋ถ๋ช
ํ Android ์ฅ์น๊ฐ Windows PC๋ฅผ ๊ฐ์ผ์ํค๋ ๋์ผํ "๋
๊ฐ"์ ๋ฉด์ญ์ด ๋์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. ๋ํ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์๋๊ฐ ๋๋ ค์ง๋๋ค. ๋๋ ์ต๊ทผ์ Nexus 7์ ๊นจ๋์ด ์ง์ ๊ณ Wi-Fi๋ฅผ ํตํด ๋ชจ๋ ์ฑ์ ๋ค์ด๋ก๋ํ๊ณ ์ค์นํ๋ ๋ฐ ๋ช ์๊ฐ์ด ๊ฑธ๋ ธ์ ๋ฟ๋ง ์๋๋ผ ๊ธฐ๊ธฐ ์๋ต์ฑ์ ์ด์ ๋ ์ํผ๋ฅผ ์ฐพ๋ ๋ฐ๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๋ฐ ์ธ๋ด์ฌ์ด ์๋์ง ์์ฌ๋๋ ์์ ํ ๋๋ด์
๋๋ค.
2) "๋๋ฌด ๋์๋ค"์ ๋ํ ์ ๋ขฐํ ๋งํ ์ ์๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์์ ๊ด๋ฆฌ์์์ ์ฑ์ ๋ฒ๋ฆฌ๋ฉด ๋ชจ๋ ์ํ๊ฐ ์ฆ์ ์ฌ๋ผ์ง ๊ฒ์ผ๋ก ์์ํ๋ ๋ฐ๋ฉด, ๋ค๋ฅธ ์ฑ์ผ๋ก ์ ํํ๋ฉด ์ ํ๊ฐ ์ผ์ ธ ์๋ ํ ์ํ๊ฐ ๋ฌด๊ธฐํ์ผ๋ก ์ ์ง๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์์ ์ Android๋ ์ด ๋ ์ํ๋ฅผ ๊ตฌ๋ณํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์์ต๋๋ค.
3) ๋ชจ๋ UI ์ปจํธ๋กค์ด ์ฌ์ฉ์๊ฐ ํน์ ์ํ์ ๋ํ ์ปจํธ๋กค์ ๊ตฌ์ฑํ ์ ์๋๋ก ํ๋ API๋ฅผ ํตํด ์ํ๋ฅผ ๋ ธ์ถํ๋ ๊ฒ์ ์๋๋๋ค. ์ด๋ฌํ API๋ ์์ฌํ ์ฌ์ง ์์ด ์ ์ด ๊ฐ๋ฐ์๋ฅผ ๋์ ํ์ฌ ์ถ๊ฐ ๊ฐ๋ฐ ๋ ธ๋ ฅ์ ์ํฉ๋๋ค. Android์์ ์ ๋๋ก ์๋ํ๋ UI ์ปจํธ๋กค์ onSave/Restore InstanceState ์๋ฆผ์ ๋ด๋ถ์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ ์ด๋ค ์ํ๊ฐ ๋ณด์กด๋๋์ง ์ ์ดํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ก๋ถํฐ "์ํ ๋ณด์กด" ๋ฌธ์ ๋ฅผ ์ถ์ํํด์ผ ํฉ๋๋ค. ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ธฐ์ตํ๋ค๋ฉด AutoComplete ์ปจํธ๋กค์ ์ฟผ๋ฆฌ ์ฉ์ด๋ฅผ ์ ์งํ์ง๋ง ๊ฒฐ๊ณผ ๋ชฉ๋ก์ ์ ์งํ์ง ์์ต๋๋ค.
๋ณต๊ตฌ ์๋ฃจ์ B: ์ํ๋ฅผ ์ง์์ ์ผ๋ก ์ ์ฅ
ํ์ด๋จธ๋ฅผ ์คํํ๊ณ ํ๋ซํผ ์ธก์ ์ฑ ์ํ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ง์์ ์ผ๋ก ์ ์ฅํ ์ ์์ต๋๋ค. 3์ด๋ง๋ค ํฉ์๋ค. ๊ทธ๋ฐ ๋ค์ Android๊ฐ onSavedInstanceState๋ฅผ ํธ์ถํ๋ฉด ์ด์ ์ ์ ์ฅ๋ ์ํ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. (์, ์ง๋ 3์ด ๋์ ๋ฐ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ์์ ์ ์์ต๋๋ค.)
"์๋ฃจ์ A"๋ฅผ ๋๋ฌ์ผ ๋์ผํ ๋ฌธ์ ์ธ์๋ ๋ฐ์ดํฐ ๋ณต์ ์์ ์บ์ ์ด ์ ์๋ ์๋ก์ด ์ํ์ด ์ถ๊ฐ๋ฉ๋๋ค.
๋ณต๊ตฌ ์๋ฃจ์ C: ์ฃผ์ ์ง์ ์์ ์ํ ์ ์ฅ
์๋ฃจ์ B์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฅ๋ ์ํ๋ ํ๋ซํผ ์ธก์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ช ์ด๋ง๋ค ์ํ๋ฅผ ์ ์ฅํ๋ ๋์ ์ฌ์ฉ์๊ฐ ์ผ๋ถ ์์ ์ ์ํํ ํ ์ํ๋ฅผ ์ ์ฅํ๋๋ก ์๋์ผ๋ก ์์ฒญํฉ๋๋ค. (์๋์ ์ด๊ณ TextField์ ํ ์คํธ๋ฅผ ์ ๋ ฅํ๊ณ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค).
"์๋ฃจ์ A"์ ๊ด๋ จ๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์์ ฏ ํธ๋ฆฌ๋ ์๋์ผ๋ก ์ ์ฅ๋์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ข์ ์ผ์ ๋๋ค! UI์ ์ํ๋ ์ต์ข ์ ์ผ๋ก ๋ถ๋ฆฌ๋๋ฉฐ ๋ทฐ ์ํ๋ฅผ ๋ณต์ํ๊ฑฐ๋ ํ๋ ๋ฐ ์กฐ๊ฐ์ ์ธ์คํด์คํํ ๋ ๋ฐ์ฌ ๋ง๋ฒ์ด ์์ต๋๋ค.
๋์ํ์ง ์๋๋ค. ์ํ๊ฐ ์ญ์ ๋ ์ ์๋ ๊ฒฝ์ฐ ์์ ฏ ํธ๋ฆฌ
์ ์ ํ ์ ๊ธ์ ์ฌ์ฉํ ๋ "Solution A"๊ฐ ์๋ฒฝํ๊ฒ ๊ทธ๋ด๋ฏํด ๋ณด์ด๋ฉฐ ์์ ๋์ด ํฉ๋นํ ๊ฒฝ์ฐ ANR์ด ํธ๋ฆฌ๊ฑฐ๋์ง ์์์ผ ํฉ๋๋ค. ๋ํ ํ๋ซํผ์ ์๋ฆผ ๋ฉ์ปค๋์ฆ์ ์์ฉํจ์ผ๋ก์จ ๋ชจ๋ ๋จ์ผ ํค ์ ๋ ฅ์ ๋ํด ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์๋ ๋ถํ์ํ ์ง๋ ฌํ ์์ ์ ํญ์ ํผํฉ๋๋ค.
์ด ๋์์ ์๋ํํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ๊ดํด์๋ Dart ๋ฐํ์์ ๋ฆฌํ๋ ์
๋ฉ์ปค๋์ฆ์ด ์๊ณ Flutter์ ๋ฉ๋ชจ๋ฆฌ์ ์ํ๋ฅผ ์ ์ฅํ๋ ๊ตฌ์กฐํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด ๋ถ๋ช
ํด ๋ณด์
๋๋ค. ํ์ฌ ๋ด๊ฐ ์๊ฐํ ์ ์๋ ๊ฐ์ฅ ๊ฐ๋จํ ์ ๊ทผ ๋ฐฉ์์ ๋จ์ผ ๋์ ๊ฐ์ฒด์ ์ํ๋ฅผ ์ ์งํ๋๋ก ์ ํํ๋ ๊ฒ์
๋๋ค(React์ this.props
๋ฐ this.state
์ ๊ฐ์).
@altorrado
์ ์ ํ ์ ๊ธ์ ์ฌ์ฉํ ๋ "Solution A"๊ฐ ์๋ฒฝํ๊ฒ ๊ทธ๋ด๋ฏํด ๋ณด์ด๋ฉฐ ์์ ๋์ด ํฉ๋นํ ๊ฒฝ์ฐ ANR์ด ํธ๋ฆฌ๊ฑฐ๋์ง ์์์ผ ํฉ๋๋ค.
๋๋ ๋์ํ๋ค. when ... ๊ฐ๋ฐ์๊ฐ ์ ๊ธ์ ์ฒ๋ฆฌํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ Android ๋ชจ๋ธ์ด ํจ์ฌ ๋ ๊ฐ๋จํ๊ณ ๊ฐ๋ ฅํ ๊ฒฝ์ฐ ๋์คํฌ์ ์ผ์์ ์ธ ์ํ๋ฅผ ์ ์งํ์ง ์๊ณ ๊ด๋ จ์ด ์๋ ๊ฒฝ์ฐ์๋ง ์ํ๋ฅผ ์ ์งํฉ๋๋ค(ํ๋ฌํฐ) Android ์๋ช ์ฃผ๊ธฐ ์ด๋ฒคํธ ๋ฐ onSaveInstance ๊ธฐ๋ฅ์ ์ฐ๊ฒฐํ์ง ์๊ณ ๋ ํ ์ ์์ต๋๋ค. ์ฐ์ , ๋ฌด์์ ์ข์๊ฐ์?
๋ํ ํ๋ซํผ์ ์๋ฆผ ๋ฉ์ปค๋์ฆ์ ์์ฉํจ์ผ๋ก์จ ๋ชจ๋ ๋จ์ผ ํค ์ ๋ ฅ์ ๋ํด ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์๋ ๋ถํ์ํ ์ง๋ ฌํ ์์ ์ ํญ์ ํผํฉ๋๋ค.
๋ชจ๋ ํค ์ ๋ ฅ์ ์ ์งํด์ผ ํ๋ ์๊ตฌ ์ฌํญ์ ์์ง๋ง ์ ํ๋ ์ํ๋ก ๊ตฌ์ฑ๋ ์ค๋ ์ท
๋ฐ์ดํฐ๋ ๋ฒ๋ค์ ByteArray๋ก ์ ์ฅํ์ฌ ํผํด์ผ ํฉ๋๋ค.
๋ฉ์ธ ์ค๋ ๋์ I/O๋ก ์ธํ ANR ๋๋ ์ง์ฐ์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
2018๋
12์ 19์ผ ์์์ผ ์คํ 6:08 Alejandro Torrado [email protected]
์ผ๋ค:
"Solution A"๋ ์ ์ ํ ๊ฒ์ ์ฌ์ฉํ ๋ ๋์๊ฒ ์๋ฒฝํ๊ฒ ๊ทธ๋ด๋ฏํด ๋ณด์ ๋๋ค.
์ ๊ทธ๊ณ ์์ ๋์ด ํฉ๋นํ ๊ฒฝ์ฐ ANR์ด ํธ๋ฆฌ๊ฑฐ๋์ง ์์์ผ ํฉ๋๋ค.
๋ํ ํ๋ซํผ์ ์๋ฆผ ๋ฉ์ปค๋์ฆ์ ์์ฉํจ์ผ๋ก์จ
๋ถํ์ํ ์ง๋ ฌํ ์์ ์ ํญ์ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ต๋๋ค.
๋ชจ๋ ๋จ์ผ ํค ์ ๋ ฅ์ ๋ํด.์ด ๋์์ ์๋ํํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ๋ํด
Dart ๋ฐํ์์ ๋ฆฌํ๋ ์ ๋ฉ์ปค๋์ฆ์ด ์๊ณ
Flutter์ ๋ฉ๋ชจ๋ฆฌ์ ์ํ๋ฅผ ์ ์ฅํ๋ ๊ตฌ์กฐํ๋ ๋ฐฉ๋ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก๋ . ํ์ฌ ๋ด๊ฐ ์๊ฐํ ์ ์๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์
์ด๊ฒ์ ๋จ์ผ ๋์ ๊ฐ์ฒด์์ ์ํ๋ฅผ ์ ์งํ๋๋ก ์ ํํ๋ ๊ฒ์ ๋๋ค(์:
this.props ๋ฐ this.state on React).โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธ
https://github.com/flutter/flutter/issues/6827#issuecomment-448671264 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AGpvBUQk17YOsjLMHTWcdJHL9rR71u6lks5u6nKGgaJpZM4KwSuX
.
์ง์ง ์์์๋ ๋น์ ์ด ๋งํ๋ ์ด ByteArray๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ๋๋ค :slightly_smiling_face:
์ง์ง ์์์๋ ์ด๊ฒ์ ๋ณต์ํ ์ ์๋ ๊ฒ์ด๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค.
ByteArray ์ ๋๋ก.
2018๋ 12์ 19์ผ ์์์ผ ์คํ 6์ 41๋ถ Gabor Varadi [email protected]์ด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์ต๋๋ค.
์ง์ง ์์์๋ ๋น์ ์ด ๋งํ๋ ์ด ByteArray๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ๋๋ค ๐
โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธ
https://github.com/flutter/flutter/issues/6827#issuecomment-448682229 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AGpvBep8AW2xkKECt6uyTjqRGwri9Pmoks5u6npKgaJpZM4KwSuX
.
์๋์. ์ผ๋จ ๋ฐ์ดํธ ๋ฐฐ์ด์ด ์์ผ๋ฉด ๋งค์ฐ ์ฝ์ต๋๋ค. ๋ก๋ํ๋ ๋์ ๋ก๋ ํ์๊ธฐ๋ฅผ ํ์ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค(๋ก๋ํด์ผ ํ๋ค๊ณ ์ฑ๋์ ์๋ ค ์ฃผ์๋ค๊ณ ๊ฐ์ ).
์ง์ง ๋ฌธ์ ๋ ๋ด๊ฐ ๋ณต์ ๋ถ๋ถ์ด๋ผ๊ณ ๋ถ๋ฅด๋ Flutter ํตํฉ์
๋๋ค.
ํ์์ ์๋์ผ๋ก ์ ์ฅ๋์ด์ผ ํ๋ฉฐ ์ฌ์ฉ์ ์
๋ ฅ๋ on๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก
๋ค์ดํฐ๋ธ ์๋๋ก์ด๋ ์ฑ.
์ด ๋ฌธ์ ๋ก ์ธํด Flutter ์ฑ์ Android์์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ๋ฐ๋ฅด๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
RAM ์๋ ฅ์ด ์๊ณ ์ฌ์ฉ์๊ฐ ์ ํํ ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ์ง ์์ต๋๋ค.
๋์์ค๊ธฐ ์ ์ ์ด๋ฌํ ์กฐ๊ฑด์ ์ฑ์ ํ์ธํ์ธ์.
2018๋ 12์ 20์ผ ๋ชฉ์์ผ ์ค์ 2์ 42๋ถ Gabor Varadi [email protected]์ด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์ต๋๋ค.
์๋์. ์ผ๋จ ๋ฐ์ดํธ ๋ฐฐ์ด์ด ์์ผ๋ฉด ๋งค์ฐ ์ฝ์ต๋๋ค. ๋ก๋ฉ๋ง ๋ณด์ฌ์ฃผ์ธ์
๋ก๋ํ๋ ๋์ ํ์๊ธฐ(์์ ์๊ฒ
๋ก๋ํด์ผ ํ๋ ์ฑ๋).โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธ
https://github.com/flutter/flutter/issues/6827#issuecomment-448827537 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AGpvBR4rmSxelodAjZvcQ6kOwPd7yxKPks5u6ushgaJpZM4KwSuX
.
์ฐ๋ฆฌ ์ค ๋ง์ ์ฌ๋๋ค์ด https://github.com/mehmetf/flutter/issues/1 ์์ ์ด์ ๋ํด ์กฐ๊ธ ๋ ๋ ผ์ํ์ต๋๋ค
์์ ํ๋ ค๋ฉด(https://github.com/flutter/flutter/issues/6827#issuecomment-447488177): Google Ads๋ 'ํ๋ ๊ธ์ง'๊ฐ ์ผ์ ธ ์๋ ์ํ์์ ํ ์คํธ๋์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ฑ ํ๋ก์ธ์ค๊ฐ ์ฃฝ์ง ์์ผ๋ฏ๋ก (https://github.com/flutter/flutter/issues/6827#issuecomment-447955562)์์ ์ค๋ช ํฉ๋๋ค. @gitspeak ์ @Zhuinden ์ด ์ง์ ํ๋ฏ์ด ์ด๊ฒ์ ์ค์ ๋ก ๊ทธ๋ ๊ฒ ์๋ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ๋ณดํธํ๊ณ ์๋ ์๋๋ฆฌ์ค๋ฅผ ํ ์คํธํ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋๋ค.
์ ํ๋ฆฌ์ผ์ด์
์ด ๋ฐฐ๊ฒฝํ๋ ๋๋ง๋ค ์ ์ฅ์ด ํ์ฑํ๋ ๊ณ์ธต ๊ตฌ์กฐ์ ๋ชจ๋ ๋ณด๊ธฐ์ ๋ํด UI ์ค๋ ๋์์ View.onSaveInstanceState
๊ฐ ํธ์ถ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์์ ๊ด์ ์์ ์ข์ ์๋ฃจ์
์ FlutterView
๋ฅผ ๊ตฌํํ๋ ๊ฒ์
๋๋ค. UI ์ค๋ ๋์์ ๊ฒฝ์ ์กฐ๊ฑด(์ฐจ๋จํ ์ ์๊ฑฐ๋ ์ฐจ๋จํด์๋ ์ ๋จ)์ ๋ฐฉ์งํ๋ ค๋ฉด ๋๊ธฐ์ ๋ฐฉ๋ฒ์ด ์์ผ๋ฏ๋ก ์ด ๋ฉ์๋๊ฐ Flutter ์ ํ๋ฆฌ์ผ์ด์
์ ๋๋ฌํ์ง ์์์ผ ํฉ๋๋ค.
onSaveInstanceState๊ฐ ์ ์ฅํ๋ ๊ฒ์ ๋ฌด์์ด๋ 1MB๋ณด๋ค ํด ์ ์์ผ๋ฏ๋ก ์ ์ฒด ๊ฒฉ๋ฆฌ ์ํ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ
๋ทฐ๊ฐ ๋์ค์ ๋ณต์๋๋ฉด FlutterView๋ ๊ฒฉ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์ด์ ์ ์ ์ฅ๋ ๋ฐ์ดํฐ ๋ถ๋ถ์ด ์๋ ๊ฒฝ์ฐ ์์ถ์ ํ๋๋ค.
์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์ผ ๋ ์ํ๋ Flutter ์ธก์์ ๋ณ๊ฒฝ์ ์ค์งํด์ผ ํฉ๋๋ค. ํญ์ ์ฝ๋ ์ผ์ด์ค๊ฐ ์์ผ๋ฏ๋ก Flutter ์ฑ์ ๋ํ ๋ชจ๋ฒ ์ฌ๋ก ๋ชฉ๋ก์ ์์ฑํ๋ ๊ฒ์ด ์ด ์๋ฃจ์ ๊ณผ ํจ๊ป ์ ๊ณต๋๋ ๊ฒ์ด ์ข์ต๋๋ค( ์๋ช ์ฃผ๊ธฐ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์๋ฐ ๋ชจ๋ ๊ณ ๋ ค).
Flutter๊ฐ ์ ๊ฐํ ํด๋ํฐ์์ ์คํ๋ ๊ฒ์ผ๋ก ์์๋๋ ์ธ๋์ ๊ฐ์ ์ ํฅ ์์ฅ์ ๊ฒฝ์ฐ ์ด๊ฒ์ด ํจ์ฌ ๋ ์๊ธํ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. Android Go ๋ ๋ํ ํจ์ฌ ๋ ๊ณต๊ฒฉ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋ต์ ๊ฐ์ง๊ณ ์๋ค๋ ์๋ฌธ์ด ์์ต๋๋ค.
- ๊ทธ๋ค์ _application_์ด ์์๋ ๋(ํ๋์ด ์๋) ์ฃผ์ ๊ฒฉ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์ ์งํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์ฑ๋ ๋ ์ด ๊ฒฉ๋ฆฌ๋ฅผ Flutter ๋ณด๊ธฐ์ ์ ๋ฌํฉ๋๋ค.
์ด ์ฝ๋์ ์๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น?
๊ทธ๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋(ํ๋์ด ์๋) ์ฃผ์ ๊ฒฉ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์ ์งํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์ฑ๋ ๋ ์ด ๊ฒฉ๋ฆฌ๋ฅผ Flutter ๋ณด๊ธฐ์ ์ ๋ฌํฉ๋๋ค.
์ด ์ฝ๋์ ์๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น?
๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ ์ ํ์ ์์ ๋ฅผ ์ ๊ณตํ ์ ์์ง๋ง ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ด ๋ฐ์ํฉ๋๋ค.
Application.onCreate
์์ FlutterMain
๋ํ ์ด๊ธฐํ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ( startInitialization
๋ฐ ensureInitializationComplete
). flutter/engine repo์์ ์ด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.runFromBundle
์๋ฅผ ์ฐพ์ผ์ญ์์ค).FlutterNativeViewProvider
)๋ฅผ ๋ฐํํ ์ ์๋๋ก ์ด ์ ํ๋ฆฌ์ผ์ด์
์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๋ค. <strong i="26">@Override</strong>
public FlutterNativeView createFlutterNativeView() {
FlutterNativeViewProvider provider = (FlutterNativeViewProvider) getApplication();
return provider.getFlutterNativeView();
}
<strong i="27">@Override</strong>
public boolean retainFlutterNativeView() {
return true;
}
์ด ๋ผ์ธ์ ๋ฐ๋ผ ๋ญ๊ฐ๊ฐ ๋น์ ์ ์ป์ ๊ฒ์
๋๋ค. Flutter ์ ํ๋ฆฌ์ผ์ด์
์ Activity(๋ฐ๋ผ์ ์ฐฝ)๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ์ ์ ์คํ์ ์์ํฉ๋๋ค. ๋ฐ๋ผ์ Activity์์ ์ค๋น๋์๋ค๋ ์ ํธ๋ฅผ ๋ฐ์ ๋๊น์ง ์ฃผ ํจ์์์ runApp()
๋ฅผ ํธ์ถํด์๋ ์ ๋ฉ๋๋ค. PlatformChannels ๋ฐ ํ ๊ณณ์์ createFlutterNativeView()์ ์์ ์ ํธ๋ฅผ ํตํด ์ด๋ฅผ ์ํํ ์ ์์ต๋๋ค.
์์์ ์ธ๊ธํ๋ฏ์ด ์ด ํจํด์ ์ด ํน์ ๋ฌธ์ ๋ฅผ ์ค์ ๋ก ํด๊ฒฐํ์ง ๋ชปํ๊ณ ๋งค์ฐ ์ง์ ๋ถํ๊ธฐ ๋๋ฌธ์ ์ด ํจํด์ ์ฉ์ธํ์ง ์์ต๋๋ค.
์ด๋ฌํ API ์ค ๋ง์ ๋ถ๋ถ์ด ๋ณ๊ฒฝ๋ ์์ ์ ๋๋ค. add2app ์ฌ์ฉ ์ฌ๋ก๊ฐ ๊ณ์ ์งํํ๊ณ ์๊ธฐ ๋๋ฌธ์ Android ๋ฐ iOS ์๋ฒ ๋ฉ API๋ ์์ง ์์ ์ ์ด์ง ์์ต๋๋ค. ํ์์ ๊ฐ์ด flutter-dev@์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐํํ ๊ฒ์ ๋๋ค.
@passsy , @gitspeak
๋ณต๊ตฌ ์๋ฃจ์ A: ์์ ์ ์ ์ฅ๋ ์ธ์คํด์ค ์ํ ํ์ผ
์ ํจํ ์ํ ํ์ผ์ด ์๋์ง ํ์ธํ๋ ค๋ฉด .tmp ํ์ผ์ ์ด ๋ค์ ์ฐ๊ธฐ๊ฐ ์๋ฃ๋๋ฉด ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์์ต๋๋ค. ์ด์ ์ํ ํ์ผ๋ ์ ์งํ๋ฉด ํญ์ ์ ํจํ ์ํ๊ฐ ๋ฉ๋๋ค. ๋ํ ์ํ๋ฅผ ์ ์ฅํ๋ ๋์ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ ๊ฒฝ์ฐ.
@jsroest
๋น์ ์ ํญ์ ์ ํจํ ์ํ๋ก ๋๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ๋ฐ๋์ ์ฌ๋ฐ๋ฅธ ์ํ๋ ์๋๋๋ค. ์ด๋ ์ผ์ข ์ ์์ ์ ๋๋ค.
์์ํ๋ ๋นํ๋ฐ์ฑ ๋ฉ๋ชจ๋ฆฌ์ ์ํ๋ฅผ ์ ์งํด์ผ ํ๋ ์๊ตฌ ์ฌํญ๋ ์์ต๋๋ค.
@gitspeak
๋น์ ์ ํญ์ ์ ํจํ ์ํ๋ก ๋๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ๋ฐ๋์ ์ฌ๋ฐ๋ฅธ ์ํ๋ ์๋๋๋ค. ์ด๋ ์ผ์ข ์ ์์ ์ ๋๋ค.
์์ํ๋ ๋นํ๋ฐ์ฑ ๋ฉ๋ชจ๋ฆฌ์ ์ํ๋ฅผ ์ ์งํด์ผ ํ๋ ์๊ตฌ ์ฌํญ๋ ์์ต๋๋ค.
๋ง์ ์ํฉ์์ ์ผ๊ด๋ ์ํ๋ฅผ ๊ฐ๋ ๊ฒ์ด '๋๋ถ๋ถ์ ์ต์ ๊ฐ'์ ๊ฐ๋ ๊ฒ๋ณด๋ค ๋ ์ค์ํฉ๋๋ค. ํธ๋์ญ์ ๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ทธ ์์ ๋๋ค. ์ ์๊ฐ์๋ ์ํ๋ฅผ ์ ์ฅํ๊ธฐ์ ์ข์ ์ฅ์์ด๊ธฐ๋ ํฉ๋๋ค.
๋นํ๋ฐ์ฑ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์งํ๋ฉด ๋ช ๊ฐ์ง ์ฅ์ ์ด ์์ต๋๋ค. ํ๋ก์ธ์ค๋ '์ ํ ๋๊น', ๋ฐฐํฐ๋ฆฌ ๋ณ๊ฒฝ, ํ๋์จ์ด ์ค๋ฅ, OS ์ ๋ฐ์ดํธ, ์ผ๋ฐ์ ์ธ ์ฌ๋ถํ ๋ฑ์์๋ ์ข ๋ฃ๋๋ฏ๋ก ๋นํ๋ฐ์ฑ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ ๋ ์ํ๊ฐ ์ ์ง๋ฉ๋๋ค.
@jsroest ๊ทํ์ ์ฃผ์ฅ์ ์ ํจํ์ง๋ง ์ฌ๊ธฐ์ ์ธ๊ธ๋ "์ํ"๊ฐ ์ผ์์ ์ธ UI ์ํ (์: ์คํฌ๋กค ์์น, ํ์ฑ ์ ํ, ์์ ํ ์คํธ ์ ๋ ฅ ๋ฑ)์ด๊ธฐ ๋๋ฌธ์ IMHO๋ ์ด ํน์ ๋ฌธ์ ์ ์ ์ฉ๋์ง ์์ต๋๋ค. ์ด๋ฌํ ์ ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ํ๋ ๊ฒ์ ์ฌ์ฉ์๊ฐ "ํ๋ฉด"์ ๋ช ์์ ์ผ๋ก ๋ฒ๋ฆฌ์ง ์์์ง๋ง ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ์ฑ์ผ๋ก ์ ํํ ๋์ ๊ฐ์ด ์ฌ์ฉ์ ์ ๋ ฅ์ด ์ฌ์ ํ ์์ค๋ ์ ์๋ ์ํฉ์์๋ง ํ์ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ์์คํ ์ ์ ์ด์ ์ ์ ํํ ์คํ์ ์ผ๋ก ๋ง์ง๋ง์ผ๋ก ํ์๋ ์น ํ์ด์ง๋ฅผ ์คํฌ๋กคํ ๊ฒ์ด๋ผ๋ ์ฌ์ฉ์ ๊ธฐ๋๊ฐ ์๋ ๊ฒ์ฒ๋ผ ์ ์ ์ ์ผ์์ ์ธ ์ํ ๋ฅผ ๋ณต๊ตฌํ ์ฌ์ฉ์์ ๊ธฐ๋๋ ์์ต๋๋ค. ์์ ์ "์ผ์์ ์ํ"๋ก ๊ฐ์ฃผ๋๋ ๋ฐ์ดํฐ์ ํน์ฑ์ด ์ค์ํ๋ฉฐ ์ฌ๊ธฐ์์ ๋ ผ์(ํนํ Android onSaveInsatnceState ๊ธฐ๋ฅ)๋ ํด๋น ์ ํ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๊ดํ ๊ฒ์ ๋๋ค.
@gitspeak
์ ๋ ๊ธฐ์
์ ์ํ ํ๋ก๊ทธ๋จ์ ์์ฑํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฃผ๋ฌธ ํผ์ปค๊ฐ ์ฐฝ๊ณ ์์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ด๋ ์์ ์์ ์๊ฐ ๊ณต๊ธ์
์ฒด๋ก๋ถํฐ ์ฃผ๋ฌธํ ํญ๋ชฉ์ ์ค์บํ๋ ์๋งค์
์ ๋ค๋ฅธ ์์
๋๋ค. ๋ด ๊ณ ๊ฐ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ค๋จ๋ ์์น์์ ์์๋๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ผ์์ ์ธ ์ํ๋ฟ๋ง ์๋๋ผ ํ์ ์คํ๋ ํฌํจ๋ฉ๋๋ค. ์ฌ๊ธฐ์์ ์ค๋ช
ํ๋ OnSaveInstanceState ๊ธฐ๋ฅ์ ์ด๊ฒ์ด ์๋ฒฝํ์ง ์์ ์ด์ ๋ฅผ ์ค๋ช
ํด ์ฃผ์๊ฒ ์ต๋๊น? ์๋น์ ์์ฅ์์ ์ฌ์ฉ์์ ๊ธฐ๋๋ ๋ค๋ฅผ ์ ์์ง๋ง IMHO๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ๋ ๋์ผํ ๋
ผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@jsroest
๋ด ๊ณ ๊ฐ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ค๋จ๋ ์์น์์ ์์๋๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค.
์ฃ์กํฉ๋๋ค. ๊ทธ๋ฐ ๊ณ ๊ฐ์ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ด ๋์์ค ์ ์์ต๋๋ค.
@jsroest ํ๋ฅญํ ์ง๋ฌธ์ด์ง๋ง ์ด ๋ฌธ์ ์ ๋ฒ์์ ์ํ์ง ์์ต๋๋ค. Flutter๋ ํ๋ซํผ ์์ฒด๊ฐ ํ ์ ์๋ ์ผ์ ์ํด ์ ํ๋๋ฉฐ @gitspeak์์ ์ธ๊ธ onSaveInstanceState
๋ ๋ฐ์ดํฐ ์๋ช
์ฃผ๊ธฐ๊ฐ ์ํ๋ ๊ฒ๊ณผ ๋ค๋ฅธ ์์ UI ์ํ๋ฅผ ์ ์ฅํ๋ ๊ฒ์
๋๋ค. ๋ก์ปฌ ์ ์ฅ์ ๋๋ ์๊ฒฉ ์ ์ฅ์(์ ๊ฑฐ ๋ฐ ์ฅ์น์์ ์ํ๋ฅผ ์ ์งํ๋ ค๋ ๊ฒฝ์ฐ)๋ ์ํ๋ ๊ฒ์ ์ ๊ณตํ์ง๋ง ์ด ๋ฌธ์ ์ ๋ฒ์๋ฅผ ๋ค์ ๋ฒ์ด๋ ์ฃผ์ ์ฌํญ์ด ์์ต๋๋ค.
์ถ๊ฐ ๊ถ์ฅ ์ฌํญ:
https://developer.android.com/topic/libraries/architecture/saving-states [์๋ฅผ ๋ค์ด ์ด ๊ธฐ์ฌ๊ฐ ๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ฅผ onSaveInstanceState์์ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ฐธ๊ณ ]
https://developer.android.com/guide/topics/data/data-storage
https://firebase.google.com/docs/firestore/
@jsroest ๊ณ ๊ฐ์ด ์ฑ ์ด ๊ฐ์ ์ค์ง๋๊ฑฐ๋ ์์ ์ด ์ง์์ง๊ฑฐ๋ OS๊ฐ ๋ค์ ์์๋ ๊ฒฝ์ฐ์๋ ์ฑ์ด ์๋ ์์น๋ก ๋์์ค๊ธฐ๋ฅผ ๊ธฐ๋ํ๋
onSaveInstanceState๋ ์ฃผ์ด์ง ์์ ์ ๋ํ ์์ ์ํ๋ฅผ ์ ์ฅํ์ง๋ง ์์ ์ง์ฐ๊ธฐ ๋๋ ๊ฐ์ ์ค์ง ๋๋ OS ์ฌ๋ถํ ์ ์ญ์ ๋์์ต๋๋ค.
@mehmetf ๋ด ์๊ฐ์ ์ด ๋ฌธ์ ๋ ์ค์ ๋ก grokํ๊ธฐ๊ฐ ์๋นํ ์ด๋ ค์ธ ์ ์๋ @LouisCAD์ ์ถ๋ณต์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ๋ซ๊ณ ์ด์ ํ ๋ก ์ ๋ํ ์ญ ์ฐธ์กฐ์ ํจ๊ป ๊ฐ์ฅ ์ต๊ทผ์ ์์ฝ(์๋ง๋ ๋ฌธ์ ์ค๋ช ๊ณผ ๋ฒ์๋ฅผ ๊ฐ์กฐํ๊ธฐ ์ํด ๋ค์ ์กฐ์ ๋จ)์ผ๋ก ์์ํ๋ ์ ๋ฌธ์ ๋ฅผ ์ฌ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋์ํ์ง๋ง @matthew-carroll์ ๋งก๊ธฐ๊ฒ ์ต๋๋ค. ๊ทธ๋ ์๋ง๋ ์ด ๋ฌธ์ ๋ฅผ ์์ ํ ๊ฒ์ ๋๋ค.
ํผ๋๋ฐฑ์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋๋ ๋ฌด์ธ๊ฐ๋ฅผ ๊ฐ์ํ๊ณ ์ถ์ง ์์ง๋ง ๋ด๊ฐ ์ฐพ๊ณ ์๋ ๊ฒ์ ์ค๋ช ํ๊ธฐ์ ์ถฉ๋ถํ ๋ช ํํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ด ์ค๋ ๋์์ ์ฌ๊ธฐ์์ ์ฌ์ฉ๋ ๋ชจ๋ ์ฉ์ด์ ๋๋ฑํ์ง ์์ต๋๋ค. Flutter์์ ๋ณด๊ณ ์ถ์ ๊ฒ๊ณผ @LouisCAD ๋ฐ @passsy ๊ฐ ์ค๋ช ํ๋ ๊ฒ ์ฌ์ด์๋ ๋ง์ ์ ์ฌ์ ์ด ์์ต๋๋ค.
๋ด ํ๋ก๊ทธ๋จ์ ์ผ๋ฐ์ ์ผ๋ก ๋ค์ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
'๋ณ์' ๋ฐ์ดํฐ ๊ตฌ์กฐ์๋ ์ง๋ ฌํ ๊ฐ๋ฅํ ์์ฑ์ด ์๋ ๊ฐ๋จํ ํด๋์ค๋ง ์์ต๋๋ค. ์ด '๋ณ์' ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ค์ํ ๋ถ๋ถ์ ์คํฌ๋ฆฐ ์คํ์
๋๋ค. (๊ฐ๋จํ ๋์ด
Android ํ๋ซํผ์์ OnSaveInstanceState๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ง๋ ฌํ๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์๋ค๊ณ ์์ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ซํผ(iOS, future: win, mac, web)์์๋ ๋น์ทํ ๊ฒ์ @passy๊ฐ ์ ์ํ ๊ฒ์ฒ๋ผ ๋ค๋ฅธ ํต์ฌ ํฌ์ธํธ๋ ์ด๋ฅผ ์ ๋ฐํ ์ ์์ผ๋ฉฐ ์ถฉ๋ถํ ์ข์ ์ ์์ต๋๋ค.
ํ๋ก๊ทธ๋จ์ด ์์๋๋ฉด ์ง๋ ฌํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ์ ์๋์ง, ํ๋ก๊ทธ๋จ์ ํ์ฌ ๋ฒ์ ์ด ์ง๋ ฌํ๋ ๋ฒ์ ๊ณผ ๋์ผํ์ง ํ์ธํฉ๋๋ค. ์ด๊ฒ์ ๋ฒ์ ๋ฒํธ๋ฅผ ๋น๊ตํ์ฌ ์ํํ ์ ์์ต๋๋ค. ํธํ๋์ง ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ก๋ํ๊ณ ์ถ์ง ์์ต๋๋ค.
์ด ๋ชจ๋ ๊ฒ์ด ํฉ์ฐ๋๋ฉด ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์ญ์ง๋ ฌํ๋๊ณ ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ๋ก๊ทธ๋จ์ ์คํ์ ๋งจ ์์ ์๋ ํ๋ฉด์ ๋ก๋ํฉ๋๋ค. ํ๋ฉด ์์ฒด๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ์ผ์์ ์ธ ์ํ๋ฅผ ๋ก๋ํฉ๋๋ค. ์ด์ ํ๋ก์ธ์ค ์ฌ๋ง์์ ์ด์๋จ๋ ํ๋ก๊ทธ๋จ์ด ์์ต๋๋ค. (๋๋ ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์์ต๋๊น? ์ด๊ฒ์ Windows ๋ชจ๋ฐ์ผ, Xamarin ์์ ๋ฐ asp.net์ ๊ณผ๊ฑฐ ํ๋ก์ ํธ์์ ํ์คํ ์๋ํฉ๋๋ค. Flutter์์๋ ์๋ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.)
SXXX๋ ์ซ์๊ฐ ์๋ ํ๋ฉด์ ๋ํ๋ด๋ ์ํ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋๋ค. ์ซ์๋ ์ด๋ ํ๋ฉด์ด ์ด๋ ์ ๋ ํจ๊ป ์ํด ์๋์ง ํ๋ก๊ทธ๋๋จธ์๊ฒ ์๊ธฐ์ํค๋ ๋ฐ๋ง ์ฌ์ฉ๋ฉ๋๋ค.
S100 Main menu
S200 Order pick
S210 Select order
S220 Confirm pick location
S230 Pick nr of pieces
S240 Report shortage
S250 Scan dropoff location
S300 Cycle count
S210 XXXXXX
S220 XXXXXX
S230 XXXXXX
S300 Reprint labels
S310 XXXXXX
์ํ ๋ณ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ
Class variables {
Class AmbientVariables {
โฆ.
}
Class ScreenStack{
List<string> ScreenStack;
}
Class Orderpick {
int selected_order;
string comfirmed_location;
string nr_picked;
โฆ.
}
Class CycleCount {
โฆ.
}
Class ReprintLabels {
โฆ.
}
}
๋ด๊ฐ ํ๋ฌํฐ์์ ๋ณด๊ณ ์ถ์ ๋ชจ๋ ๊ฒ์ ์๋ง๋ ํ์ ์คํ(navigationstack)์ผ๋ก ์๋ ค์ง ์คํฌ๋ฆฐ ์คํ์ ์ฌ์ฐฝ์กฐ๋ฅผ ์ ์ธํ๊ณ ๋ ์ด๋ฏธ ๊ฑฐ๊ธฐ์ ์์ ๊ฒ์ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ์์ ์ด ๊ฐ์ฒด ํธ๋ฆฌ๋ฅผ ์ฌ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ค์ ๋ง๋ค์ด์ผ ํ๋์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ํ ๋๋ง์ ํ์ ์คํ์ ๋ง๋ค๊ณ ์ด๋ฅผ ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก flutter๋ก ๊ตฌํํ ์๋ ์์ต๋๋ค. ์ด์ ํ๋ก์ ํธ์์ ํ๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ก ํ์ดํ/๋ฒํผ์ด ๊ฐ์ฅ ๋ถ๋ช ํ MaterialApp ๋ฐ Scaffold ํด๋์ค์์ ๋ง์ ๊ธฐ๋ณธ ์ ๊ณต ๊ธฐ๋ฅ์ ์๊ฒ ๋ฉ๋๋ค.
์ด๊ฒ์ด ๋ชจ๋ ์ผ์์ ์ธ ์ํ๋ฅผ ์๋์ผ๋ก ์ ์ฅํ์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ํํ ํ ์คํธ, ๋ชฉ๋ก์ ์์น, ํน์ ์ ๋๋ฉ์ด์ ์ ์์น. ๊ทธ๋ฌ๋ ํ๋ก๊ทธ๋๋จธ๋ ํ๋ฉด๋ณ๋ก ์ ์ฅํด์ผ ํ ํญ๋ชฉ์ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ๋ชจ๋ ์์ฉ๊ตฌ ์ฝ๋๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ @LouisCAD ๊ฐ ๋ฐฉ์งํ๋ ค๊ณ ํ๋ ๊ฒ์ ๋๋ค.
์ ๋ฌธ์ ๋ฅผ ๋ง๋ค์ด์ผ ํ๋์ ์๋๋ฉด ์ด ์ค๋ ๋์ ๋ง๋๊ฐ์?
ํผ๋๋ฐฑ์ ๋ค์ ํ ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ ๋ง ๊ฐ์ฌํฉ๋๋ค.
@jsroest ์์ธํ ์ค๋ช ๊ฐ์ฌํฉ๋๋ค. ์ด๊ฒ์ flutter ํ๊ทธ์ ํจ๊ป StackOverflow์ ์ฌ๋ ค์ฃผ์ธ์. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฒฝ๋ก๋ฅผ ๊ตฌ์ฑํ๊ณ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ง์ง๋ง์ผ๋ก ๋ฐฉ๋ฌธํ ๊ฒฝ๋ก๋ฅผ ์๊ตฌ ์ ์ฅ์์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ถ์ฅ ์ฌํญ์ ์์ฒญํ๊ณ ์์ต๋๋ค.
์ด ํน์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด ๋ฌธ์ ๋ ํด๊ฒฐ๋๋ค๊ณ ์๊ฐํ ์ ์์ง๋ง ์ฌ์ค์ด ์๋๋๋ค. ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด ๋ด github ํธ๋ค @ gmail.com์์ ์ ์๊ฒ PM์ ๋ณด๋ด์ฃผ์ธ์.
์ด ๋ฌธ์ ์ ์ง์ ์ด ์์ต๋๊น?
@vanlooverenkoen ์ด๋ก ์ ์ผ๋ก ๋ด๋น๊ฒ์ดํฐ์ ๊ฒฝ๋ก ๋ชฉ๋ก๊ณผ ํค ๊ณ์ธต์ ํ์ผ(๋ฐ ์ํ ์ ์ฅ ์์ ฏ์ ์ํ)์ ์ ์งํ๊ณ Android ๊ธฐ๋ณธ ์ธก์์ savedInstanceState == null
์ป์ ๋ ์ด๋ฅผ ์ง์ฐ๋ฉด ์ ์ฌ์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์ง์ ๊ฐ๋ฅํ๊ณ ๋ณต์ ๊ฐ๋ฅํ์ง๋ง ์ฝ์ง ์์ต๋๋ค.
@Zhuinden ์ค์ ๋ก ๊ฒฝ๋ก์ ํค๋ฅผ ์ ์ฅํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ณต์กํฉ๋๋ค. ํ๋ฉด ๊ฐ์ ํต์ ์ ์ฝ๋ฐฑ์ ์ฌ์ฉํ๊ฑฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค. ์ด๋ป๊ฒ ๋ ์ด๋ฌํ ์ํ๋ ๋ณต์ํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฌ๋ฐ๋ฅธ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ ๋๋ก ์๋ํ์ง ์๋ ๊ฒ์ ๊ฐ๊ฒ ๋ฉ๋๋ค. ๋ค์ดํฐ๋ธ Android(์ธํ ํธ ํฌํจ)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ๋ฐ์ดํฐ ๋ฒ๋ค์ ์ฌ์ฉํ์ฌ ํต์ ํ์์ ์ฌ์ฉํ์ฌ ์ฝ๋ฐฑ ๋ณต์ ๋ฑ์ ํด๊ฒฐํ ์ ์์ง๋ง, ์ด๋ Flutter์ ์ฌ์ฉ ํธ์์ฑ์ ๋ง์ด ๋จ์ด๋จ๋ฆฝ๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ์ค์ง์ ์ธ ํด๊ฒฐ์ฑ ์ด ์๋ ํ Flutter๋ ๋ง์ ์ฑ, ์ฃผ๋ก ํฌ๊ณ ๋ณต์กํ ์์ ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ฑ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๊ฐ Flutter ํ์์ ๊ณต๊ฐ์ ์ผ๋ก ํด๊ฒฐ๋์ง ์๋ ์ด์ ๊ฐ ๊ถ๊ธํฉ๋๋ค. ๋ถ๋ช ํ ์๊ณ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋ง๋ Flutter ์ํคํ ์ฒ์ ์ฌ๊ฐํ ๊ฒฐํจ์ ๋๋ฌ๋ด๊ณ ๊ฒฝ์์ง์๊ฒ ๊น์ ์ธ์์ ์ฃผ๋ ํ๋ คํ ํ๋ ์ ํ ์ด์ ์ ๋์ด ์์คํ ์ด ์ค์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ข์ ์ต์ ์ด ์๋๋ผ๋ ๊ฒ์ ๋ณด์ฌ์ค ๊ฒ์ ๋๋ค.
@jsroest @mehmetf @claudiofelber , ์ด StackOverflow ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ด ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๊น? https://stackoverflow.com/questions/54015775/what-is-the-best-way-to-pass-data-or-arguments-between-flutter-app-screens/54015932
๋๋ ์ฒ์๋ถํฐ ์ด๊ฒ์ ๋ฐ๋ผ์์ง๋ง ๋ฌธ๋งฅ์ ์์ด๋ฒ๋ ค์ ๋ง์ ๋ฉ์์ง๋ฅผ ๋ค์ ์ฝ์ด์ผ ํ์ต๋๋ค.
Flutter ํ์ด ํ์๊ฐ ์ ๊ณ ๊ณํ์ด ๋ ๋ช ํํ๊ณ ์๋กญ๊ณ ์ ์ ํ ๋ฌธ์ ๊ฐ ์์ด์ผ ํ๋ค๊ณ ๋ฏฟ๋๋ค๋ฉด ๋๋ ๊ทธ๊ฒ์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด ๋ฌธ์ ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค.
ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ ๋ ์ฑ ์ํ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด Android ๋ฐ iOS ๋ฉ์ปค๋์ฆ์ ํ์ฉํ๊ธฐ ์ํด native_state ํ๋ฌ๊ทธ์ธ ์ ๋ง๋ค์์ต๋๋ค.
Navigator
๋ ์ด๋ฏธ initialRoute
์์ฑ์ ํตํด ์ฑ ๊ฒฝ๋ก๋ฅผ ๋ณต์ํ ์ ์์ต๋๋ค. _๋ง์ฝ ๋น์ ์ด ๋ด๊ฐ ๋ฌธ์ํํ๊ณ ์์ ๋ฅผ ์ถ๊ฐํ ๋ช ๊ฐ์ง ํน์ ๊ท์น์ ๋ฐ๋ฅด๋ ๊ฒฝ์ฐ, ์๋ง๋ ํญ์ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒ์
๋๋ค. (์ ๊ณต๋ SavedStateRouteObserver
๋๋ ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ) ๊ฒฝ๋ก ๋ณต์๊ณผ ํจ๊ป ํ๋ฌ๊ทธ์ธ.
Tao๋ ์ด๊ฒ์ด ์ง๋ ๊ฐ์ ์ค๋ฌธ์กฐ์ฌ์์ 4๋ฒ์งธ๋ก ๊ฐ์ฅ ๋ง์ด ์์ฒญ๋ ๋ฌธ์ ๋ผ๊ณ ๋์๊ฒ ์ง์ ํ์ต๋๋ค. ๋๋ ์ฌ๊ธฐ์ ํํ๋ ์ฌ์ฉ์์ ์๊ตฌ๊ฐ ํผํฉ๋์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค(100๊ฐ๊ฐ ๋๋ ๋๊ธ์์!). ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ์ด๋ ์์ ์ ์์์ ์กฐ์น๋ฅผ ์ทจํ ์ ์๋ ๋ณ๋์ ํญ๋ชฉ์ผ๋ก ๊ทธ๋ค์ ์ ํ๊ฒ ํด์ผ ํ ๊ฒ์ ๋๋ค.
@eseidelGoogle ๊ทํ์ ํ๊ฐ์ ๋์ํ์ง ์์ต๋๋ค. IMHO, "ํํ๋ ์ฌ์ฉ์ ์๊ตฌ์ ํผํฉ"์ด ์๋๋ผ ๋์ผํ ํต์ฌ ๋ฌธ์ ๋ก ์ธํ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ๋ฅผ ๋๋ฌ๋ด๋ Android ํ๋ซํผ ์ง์์ด ๋ถ์กฑํฉ๋๋ค.
Android ์ ํ๋ฆฌ์ผ์ด์ ์๋ ๋ ๊ฐ์ง ์ค์ฌ ํ ๋ง๊ฐ ์์ต๋๋ค.
1) ํ๋ก์ธ์ค ์ํ ๋จธ์ (Lifecycle ์ด๋ฒคํธ๋ผ๊ณ ๋ ํจ).
2) UI ํดํท.
Flutter๋ (2)๋ฅผ ์ํํ์ง๋ง (1)์ ์ํํ์ง ์์ต๋๋ค. ์ด ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ํด๊ฒฐํด์ผ ํฉ๋๋ค.
3 ๋ ...
๋น ๋ฅธ ์ ๋ฐ์ดํธ: ํ์ฌ ์ด ๋ฌธ์ ์ ๋ํ ์๋ฃจ์ ์ ์ฐพ๊ธฐ ์ํด ์ ๊ทน์ ์ผ๋ก ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
@goderbauer ์ด๊ฒ์ด ๋จ์ง Android ๋ฌธ์ ๊ฐ ์๋๋ผ๋ ์ ์ ๋ถ๋ช ํ ํ๊ธฐ ์ํด iOS ์ฑ์ ๋ฏธ์น๋ ์ํฅ์ ์ ์ง๋ง iOS์๋ ๋์ผํ ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค. ๋๋ ๋ณผ ์ ์๋ os ๋ฉ์ปค๋์ฆ์ ํตํด ์ํ๋ฅผ ์ ์ฅํ ์ ์๋ ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค์์ต๋๋ค. https://github.com/littlerobots/flutter-native-state
@hvisser ํ์ ์ํ ์ ์ฅ์ ์ด๋ป๊ฒ ๊ถ์ฅํฉ๋๊น? Flutter์ Navigator์๋ getRoutes
๋ฉ์๋๊ฐ ์์ต๋๋ค.
@hvisser ์, ๋ ํ๋ซํผ ๋ชจ๋์์ ์ด๊ฒ์ ๋ณด๊ณ ์์ต๋๋ค(๋ค๋ฅธ ํ๋ซํผ์๋ ์ฐ๊ฒฐํ ์ ์์ ๋งํผ ์ ์ฐํด์ผ ํจ). ์ด๊ฒ์ด Android ๊ด๋ จ ๋ฌธ์ ๊ฐ ์๋์ ๋ถ๋ช ํ ํ๊ธฐ ์ํด ํ๋ซํผ-์๋๋ก์ด๋ ๋ ์ด๋ธ์ ์ ๊ฑฐํ์ต๋๋ค.
@hvisser ํ์ ์ํ ์ ์ฅ์ ์ด๋ป๊ฒ ๊ถ์ฅํฉ๋๊น? Flutter์ Navigator์๋
getRoutes
๋ฉ์๋๊ฐ ์์ต๋๋ค.
@Zhuinden ๋ค๋น๊ฒ์ดํฐ๋ ์ด๋ฏธ ์ง์ํฉ๋๋ค (์ ์๋ ค์ง์ง๋ ์์์ง๋ง). ๊ธฐ๋ณธ ์ํ ํ๋ก์ ํธ์์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์๊ฐ ์์ง๋ง TL;DR
/screen1/screen2
๋ /screen1
๋ค์์ /
๋ฐ๋ฆ
๋๋ค.initialRoutes
์์ฑ์ ์ค์ ํ๋ฉด ๊ฒฝ๋ก๊ฐ ํ์ ์คํ์ผ๋ก ํธ์๋๊ณ ๊ฒฝ๋ก๊ฐ ๊ทธ๋ฐ ์์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.GlobalKey
์ ๋ํ navigatorKey
์จ MaterialApp
ํ์ง๋ง ๋ด ๊ฒฝ์ฐ์ ํด๋น ๋ ์์๋ ํน์ .๋ฐ๋ผ์ initialRoutes
๋ฅผ /screen1/screen2
์ค์ ํ๊ณ ๊ฒฝ๋ก๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ํ๋ค๋ฉด ํ์ ๋ณต์๋ ์๋ํฉ๋๋ค.
๊ธฐ๋ณธ youtube ๋ฐ ํ๋ฌํฐ ์ฑ์ ์ผ๊ณ ๋ ๋ ๋นํ๊ธฐ ๋ชจ๋๋ฅผ ์ผ๊ณ ๋ ๋ 2๊ฐ์ SIM ์นด๋๊ฐ ์๋ ๊ตฌํ ์ฅ์น์์ ์ผ์ด์ค๊ฐ ํ๋ ๋ ๋ค์ ์์๋ฉ๋๋ค. #49057
๋ด ๋ฌธ์ ์ ๋น๋์ค๊ฐ ์ฒจ๋ถ๋์ด ์์ต๋๋ค.
ํ๋ฌํฐ ๋๋ฒ๊ทธ ๋ชจ๋๋ฅผ ๋นํ์ฑํํ์ญ์์ค. ๋๋ฒ๊ทธ ๋ชจ๋๊ฐ ํ์ฑํ๋๋ฉด ์ฑ์ด ํญ์ ๋ค์ ์์๋ฉ๋๋ค.
debugShowCheckedModeBanner: ๊ฑฐ์ง,
์ ๋ 2018๋
6์/7์๋ถํฐ Flutter๋ก ์์
ํด ์์ผ๋ฉฐ 2-3๊ฐ์ ํ์ ์ด๊ฒ์ด ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ๊ทธ๊ฒ ๊ทธ๋ ๊ฒ ํฐ ์ด์๊ฐ ๋ ์ค์ ๋ชฐ๋์ด์. ๋๋ ์์
ํ๋ ์ด์ด ์ฑ์ ๋ง๋ค๊ณ ์์๋๋ฐ ๋ค๋ก ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์์
์ด ๊ณ์ ์ฌ์๋๋ ๋์ flutter๊ฐ ๋ชจ๋ ์ํ๋ฅผ ํ๊ดดํ๊ณค ํ์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ๋ ์ด system_shortcuts ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์์ต๋๋ค.
ํ๋ก์ ํธ์ ํ๋ฌ๊ทธ์ธ์ pubspec.yaml ์
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.2
system_shortcuts:
์ ๋ ํญ์ ์ ์๊ฒ ์ ๋ง๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด ์์ง๋ง ์ด ์ฃผ์์์ ์๋์ ์ธ๊ธ๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ง๋ง ๊ทธ๋ค์ง ์ํฅ์ ๋ฏธ์น์ง๋ ์์ต๋๋ค.
๋ฌด์์ด๋ ์ ์ฑ ๊ฐ๊น์ด (์ฆ, ์ฌ์ฉ์ ์ ์์ฉ ํ๋ก๊ทธ๋จ)๊ณผ ๊ฐ์ ์ํ ํด๋์ค์ WidgetsBindingObserver ๋ฏน์ค ์ธ์ ์ถ๊ฐ ํ ๊ฒ์ด๋ผ๋ ์ ์ ์๊ณ ์๋ค ๋น์ ๊ณผ ๋ค์ ๋ฒํผ์ ๋๋ฌ์์๋ ์์ ฏ
class _MusicPlayerState extends State<MusicPlayer>
with WidgetsBindingObserver{
...
}
์ด ์์ ์ ์ํํ ํ didPopRoute ๋ฉ์๋ ๋ฅผ
<strong i="21">@override</strong>
Future<bool> didPopRoute() async {
await SystemShortcuts.home();
return true;
}
_์ด๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ์_ :
์ฑ์ด ์คํ ์ค์
๋๋ค. >> ์ฌ์ฉ์๊ฐ ๋ค๋ก ๋ฒํผ์ ๋๋ ์ต๋๋ค. >> ์ง๋ง ๋ค๋ก ๋ฒํผ์ ๋๋ฅด์ง ์์์ต๋๋ค. >> ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ด๋ํ๊ณ ์ํ๊ฐ ํ๊ดด๋์ง ์์ ANY OF IT
_ ํธ์ง _
_์ด ์ฑ์ ๊ณต๊ธ์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋์์ง๋ง ์ต๊ทผ ์ฑ์์ ์ฑ์ ๋ซ์๋ค๊ฐ ๋ค์ ์ฐ ํ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ฝ๋๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ์ถ๊ฐํ ์ฝ๋์ผ ๋ฟ์
๋๋ค._
๋ค๋ฅธ ์ฑ์์ ์ฑ์ผ๋ก ์๋ค๋ฉด ํ ์์ ฏ์์ ๋์๊ฐ ๋๋ง๋ค ํญ์ ์ด์ ์ฑ์ด ์๋ ํ ํ๋ฉด์ผ๋ก ์ด๋ํฉ๋๋ค.
์์ :-
์ฌ์ฉ์๋ ์ด์ ๊ทธ๋ค์ ๋ค์ ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ทธ๋ค์ >> ๊ทธ๋ค์ ํต์ง์์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ด์ >> ์ป์ ๊ทธ๋ค์ ํด๋ ์ ํ์ ํ ํ๋ฉด์ผ๋ก ๋์๊ฐํ์ง ๊ฒ์ด๋ค >> WhatsApp์ (๋๋ ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ)์ WhatsApp(๊ธฐ๋ณธ ์๋๋ฆฌ์ค์ฌ์ผ ํจ)
_์ด ๋ฌธ์ ๋ ์ง๊ธ๊น์ง ํฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํค์ง ์์์ผ๋ฉฐ ๋ค๋ฅธ ์ฑ์์ ๊ทํ์ ์ฑ์ผ๋ก ์ค๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌผ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ ์ฌ์ฉ์์ ๊ฐ๋ฐ์๋ผ๋ฉด ๋ชจ๋ ๊ด์ฐฎ์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋ช ๋ฒ ์กฐ์ฉํ ์ผ์ด๋ ์ ์๋ค๋ ๊ฒ์ ๋ฌด์ํ์ง ์์ง๋ง ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํ๋ฉฐ ํ๋ฌํฐ ์ฝ์ด ํ์ ์ค์ ๋์์ ์ป์ ๋๊น์ง ๋จ์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์
๋๋ค._
์ด ๋ฌธ์ ๊ฐ ๊ฑฐ์ 3๋ ๋ฐ์ด ์ง๋ฌ์ง๋ง ์ฌ์ ํ ๊ทธ๋ ๊ฒ ์์ํ ๊ฒ์ ์์ต๋๋ค.
ํ์ฌ ์ค์ ๋ ์ด์ ํ๋ก ๋ณผ ๋ 2020๋ 5์๊น์ง ์์ ํ ์์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค... Google I/O์ ๋ง์ถฐ?
์์ hvisser๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง ์ด์ ์ฌ๋๋ค์ ๊ทธ๊ฒ์ ์๋์ํค๋ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์ด์ ๋ํ ์๋ฃจ์ ์ ์ ๊ณตํ๋ ๋ฐ ์ง์ ์ ๋ณด์ด๊ณ ์์ต๋๋ค. ์ด ์์ ์ด ์๋ฃ๋๋ฉด ์ฑ์ด ์ธ์คํด์ค ์ํ๋ฅผ ๋ณต์ํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํ ์ด๊ธฐ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ๋ https://github.com/flutter/samples/pull/433 PR์ ํ์ธ
๋ถํํ๋ ๋ชจ๋ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ์๊ฐ์ด ์กฐ๊ธ ๋ ๊ฑธ๋ฆด ๊ฒ์ ๋๋ค.
Flutter์์ ์ํ ๋ณต์์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ธ๋ถ ์ ๋ณด๊ฐ ํฌํจ๋ ๋์์ธ ๋ฌธ์๋ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์์ต๋๋ค. http://flutter.dev/go/state-restoration-design
์์ ๋์์ธ์ ์์ฝ๋ ์ผ๋ฐ ์ํ ๋ณต์ ํ๋ ์์ํฌ์ ๋ํ PR์ด ๊ฒ์๋์์ต๋๋ค: https://github.com/flutter/flutter/pull/60375. ์์ง ํ ์คํธ ๋ฒ์๋ฅผ ๋ ์ถ๊ฐํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
์ผ๋ฐ ์ํ ๋ณต์ ํ๋ ์์ํฌ(https://github.com/flutter/flutter/pull/60375)๊ฐ ์ ์ถ๋์์ต๋๋ค. ํ์ฌ ์์ ฏ์ ํตํฉํ๋ ์์ ์ ํ๊ณ ์์ต๋๋ค. ์คํฌ๋กค ๊ฐ๋ฅ, ํ ์คํธ ํ๋ ๋ฐ ๋ค๋น๊ฒ์ดํฐ๋ก ์์ํฉ๋๋ค.
sqlite ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด๋ถ์ ๋ณต์ํ๋ ค๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ฌ ์ด๋ฅผ ์ง์ ๊ตฌํํ ์ ์์ต๋๋ค. ์๋ฒ๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํ๋ ๊ธฐ์ ์ ๋๋ค.
ํด๋์ ํ์์ ๋ฐฐํฐ๋ฆฌ๊ฐ ์๋ชจ๋๊ฑฐ๋ ์ปค๋ ํจ๋์ด ๋ฐ์ํ๋๋ผ๋ ์ฑ์ ๋ณต์ํ ์ ์๋ค๋ ์ด์ ์ด ์์ต๋๋ค. SQLite ํธ์ถ ์ฃผ์์ OO ๋ํผ๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ข์ต๋๋ค. Dart์๋ ๋ถํํ๋ ์๋์ผ๋ก ์ํํ๋ SQLite.Net๊ณผ ๊ฐ์ ๊ฒ์ด ์์ต๋๋ค.
ํธ์ง: ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋๋ฌด ์ ํ๋์ด ์๊ณ sqlite๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋์คํฌ ๊ฐ์ ๋ฌผ๊ฑด์ ๊ตํํ๋ ์ข์ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ฐ์ผ ๊ฐ๋ฐ ์ด๊ธฐ์ ํ๋ ์์ ์ด๊ธฐ๋ ํฉ๋๋ค.
์ผ๋ฐ ์ํ ๋ณต์ ํ๋ ์์ํฌ(๋ฐ Android ์๋ฒ ๋ฉ)๊ฐ ์ถ์๋์์ผ๋ฏ๋ก ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํฉ๋๋ค. ๋๋จธ์ง ์์ ์ ๋ณ๋์ ๋ฌธ์ ์์ ์ถ์ ๋ฉ๋๋ค.
์ ํ์ด์!!!!! ๊ณ ๋ง์์ ํ๋ฌํฐ!!!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋น ๋ฅธ ์ ๋ฐ์ดํธ: ํ์ฌ ์ด ๋ฌธ์ ์ ๋ํ ์๋ฃจ์ ์ ์ฐพ๊ธฐ ์ํด ์ ๊ทน์ ์ผ๋ก ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.