Flutter: OS์— ์˜ํ•ด ์•ฑ์ด ์ข…๋ฃŒ๋  ๋•Œ ์ธ์Šคํ„ด์Šค ์ƒํƒœ๊ฐ€ ์ €์žฅ๋˜์ง€ ์•Š์Œ

์— ๋งŒ๋“  2016๋…„ 11์›” 12์ผ  ยท  139์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: flutter/flutter

์ธ์Šคํ„ด์Šค ์ƒํƒœ๋ž€ ๋ฌด์—‡์ด๋ฉฐ ์กด์žฌํ•˜๋Š” ์ด์œ 

Android์—์„œ๋Š” ์‹œ์Šคํ…œ์—์„œ ์–ธ์ œ๋“ ์ง€ Activity๋ฅผ ์ข…๋ฃŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ™œ๋™์ด ํฌ๊ทธ๋ผ์šด๋“œ์— ์žˆ์ง€ ์•Š์„ ๋•Œ ๋˜๋Š” ๋กœ์ผ€์ผ ๋ณ€๊ฒฝ๊ณผ ๊ฐ™์ด ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๊ตฌ์„ฑ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด Android์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
Android๊ฐ€ Activity๋ฅผ ์ข…๋ฃŒํ–ˆ์„ ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‹œ์Šคํ…œ์€ Activity๊ฐ€ ์ผ์‹œ ์ค‘์ง€๋  ๋•Œ onSaveInstanceState(โ€ฆ) ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์•ฑ์€ Bundle ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. , ๊ทธ๋ฆฌ๊ณ  ํ™œ๋™์ด ์‹œ์Šคํ…œ์— ์˜ํ•ด ์ข…๋ฃŒ๋œ ๊ฒฝ์šฐ ์ž‘์—…์ด ์žฌ๊ฐœ๋  ๋•Œ onCreate(โ€ฆ) ๋ฐ onRestoreInstanceState(โ€ฆ) ๋ชจ๋‘์— ์ €์žฅ๋œ ๋ฒˆ๋“ค์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌํ„ฐ์— ๊ด€ํ•œ ๋ฌธ์ œ

๋‚ด๊ฐ€ ์‹œ๋„ํ•œ Flutter ์•ฑ(Flutter ๊ฐค๋Ÿฌ๋ฆฌ ๋ฐ FAB ํƒญ ์นด์šดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ)์—์„œ Android๊ฐ€ Flutter ์•ฑ์˜ Activity๋ฅผ ์ข…๋ฃŒํ•˜๋„๋ก ์ถฉ๋ถ„ํ•œ ์•ฑ์„ ์—ด๋ฉด Flutter ํ™œ๋™์œผ๋กœ ๋Œ์•„์˜ฌ ๋•Œ ๋ชจ๋“  ์ƒํƒœ๊ฐ€ ์†์‹ค๋ฉ๋‹ˆ๋‹ค( ์ตœ๊ทผ ์ž‘์—…์—์„œ ์ž‘์—…์„ ์ œ๊ฑฐํ•˜์ง€ ์•Š์Œ).

๋ฒˆ์‹ ๋‹จ๊ณ„

  1. Flutter ๊ฐค๋Ÿฌ๋ฆฌ ์„ค์น˜
  2. ์žฅ์น˜์˜ ์„ค์ •์„ ์—ด๊ณ  ๊ฐœ๋ฐœ์ž ์˜ต์…˜์—์„œ "ํ™œ๋™์„ ์œ ์ง€ํ•˜์ง€ ์•Š์Œ"์„ ์ผœ์‹ญ์‹œ์˜ค. (์Šคํฌ๋ฆฐ์ƒท ์ฐธ์กฐ)
    dev_option
    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ํฌ๊ทธ๋ผ์šด๋“œ์— ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Android๊ฐ€ ํ™œ๋™์„ ์ข…๋ฃŒํ•  ๋•Œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. Flutter Gallery ์•ฑ์„ ์—ด๊ณ  ๋ฉ”์ธ ํ™”๋ฉด์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ธฐ๊ธฐ์˜ ํ™ˆ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋Ÿฐ์ฒ˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  5. ๊ฐœ์š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ  Flutter ๊ฐค๋Ÿฌ๋ฆฌ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ๋‚ด์šฉ: ์•ฑ์€ UI๊ฐ€ ์†๋Œ€์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์ค‘๋‹จํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
๊ฒฐ๊ณผ: ํ™œ๋™์ด ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘๋˜์–ด ๋ชจ๋“  UI ์ƒํƒœ๊ฐ€ ์†์‹ค๋˜๊ณ  ์‹ฌ์ง€์–ด ์ •๋ง ๊ธด ํ˜•์‹๋„ ์†์‹ค๋ฉ๋‹ˆ๋‹ค.

P2 annoyance crowd routes framework new feature

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋น ๋ฅธ ์—…๋ฐ์ดํŠธ: ํ˜„์žฌ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์ ๊ทน์ ์œผ๋กœ ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  139 ๋Œ“๊ธ€

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์—์„œ๋Š” ์—ฌ๋Ÿฌ ์ƒํƒœ ์ €์žฅ/๋ณต์› ๋…ผ๋ฆฌ๋ฅผ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ๊ฐœ๋ฐœ์ž์˜ storedInstanceState์ด์ง€๋งŒ ์š”์†Œ ๋ชฉ๋ก๊ณผ ๊ฐ™์€ ํฐ ๊ฐœ์ฒด๋ฅผ ๋‚ด๋ถ€์— ์ €์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ํฐ ๊ฐœ์ฒด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • ๋Œ€๋ถ€๋ถ„์˜ ์œ„์ ฏ์€ ์ž์ฒด ์ƒํƒœ๋„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํ™œ๋™/์กฐ๊ฐ ์Šคํƒ

๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์ €๋ถ„ํ•˜๊ณ  ๋ฒ„๊ทธ๊ฐ€ ๋งŽ์€ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝํ—˜์ƒ ์ƒํƒœ ์ €์žฅ ๋ฐ ๋ณต์›์ด ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ์ •๋ง ๋“œ๋ญ…๋‹ˆ๋‹ค.

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์— ์˜ํ•ด ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์›Œํฌํ”Œ๋กœ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

  • ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ ๋‚ด๋ถ€์˜ ํŠน์ • ํ™”๋ฉด์œผ๋กœ ์ด๋™
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์•ฑ์œผ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ‘์ž๊ธฐ ํ˜„๋ช…ํ•œ OS๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ณด์กดํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „ ์•ฑ์„ ์ข…๋ฃŒํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๋Š” ์ด์ „ ์•ฑ์œผ๋กœ ๋Œ์•„๊ฐ€์ง€๋งŒ ํ™ˆ ํ™”๋ฉด์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋…€๊ฐ€ ์•ฑ์„ ์ „ํ™˜ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์„ ๋•Œ ์—ด๋ ค ์žˆ๋˜ ํ™”๋ฉด์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด Flutter์—์„œ ํ™”๋ฉด ๊ธฐ๋ก์„ ๋ณด์กดํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ถ”์‹  ๋ฌผ๋ก  ์•ฑ์— ํ™”๋ฉด์ด ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@Zhuinden ์–ด์จŒ๋“  ํ•„์š”ํ•œ ๋งŽ์€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

a) ์ฑ„ํŒ… ์˜ˆ:
์ „์†ก๋˜์ง€ ์•Š์€ ํ…์ŠคํŠธ ํ•„๋“œ์— ์ž‘์„ฑ๋œ ์ด์ „ ๋‚ด์šฉ์„ ํ•ญ์ƒ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•˜์‹ญ์‹œ์˜ค.

b) ๊ธด ํ˜•์‹์˜ ์˜ˆ:

  1. ํ•ญ์ƒ ๋‚ด์šฉ์„ ์ €์žฅํ•˜์‹ญ์‹œ์˜ค
  2. ์‚ฌ์šฉ์ž๊ฐ€ ์–‘์‹ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„์˜ค๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ €์žฅ๋˜์—ˆ์ง€๋งŒ ์ œ์ถœ๋˜์ง€ ์•Š์€ ์ดˆ์•ˆ ๋ฒ„์ „์ด ์žˆ์Œ์„ ์•Œ๋ฆฌ๊ณ  ๋ณต์›ํ•  ๊ฒƒ์ธ์ง€ ๋ฌป์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์–‘์‹์„ ์ˆ˜๋™์œผ๋กœ ์ข…๋ฃŒํ•œ ๊ฒฝ์šฐ(์‚ฌ์šฉ์ž๊ฐ€ ์ดˆ์•ˆ์„ ์ €์žฅํ•  ๊ฒƒ์ธ์ง€ ๋ฌป๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Œ) ๋˜๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์•ฑ์ด ์ข…๋ฃŒ๋œ ๊ฒฝ์šฐ์—๋Š” ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

"์ƒˆ๋กœ์šด ์ƒˆ ํ™”๋ฉด"๊ณผ "ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ํ›„ ์ƒˆ ํ™”๋ฉด"์— ๋Œ€ํ•œ ํŠน์ • ์ง€์‹์ด ์œ ์šฉํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์•ฑ ์ฝ˜ํ…์ธ ๋ฅผ ํ•ญ์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ง€์›ํ•˜๋„๋ก ๋””์ž์ธํ•  ๋•Œ๋Š” ๊ทธ๋ ‡๊ฒŒ ์ผ๋ฐ˜์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@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 ์•ฑ์€ Flutter๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์–ผ๋ฆฌ ์–ด๋‹ตํ„ฐ ์ค‘ ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰์„ ์œ„ํ•ด ํŠน์ดํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ (ํ™œ๋™์ด ์•„๋‹ˆ๋ผ) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ ์ฃผ์š” ๊ฒฉ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ƒ์„ฑ๋  ๋•Œ ์ด ๊ฒฉ๋ฆฌ๋ฅผ Flutter ๋ณด๊ธฐ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • "์ƒํƒœ ์œ ์ง€"๋กœ ๊ด€์ฐฐํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฐฉ๋ฒ•๋ก ์˜ ๋ถ€์ž‘์šฉ์ž…๋‹ˆ๋‹ค. Google Ads์—์„œ ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ์ข…๋ฃŒํ•ด๋„ Flutter์˜ "UI"๋Š” ์ฃฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์— ์—ฐ๊ฒฐ๋œ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณด๊ด€๋ฉ๋‹ˆ๋‹ค. ํ™œ๋™์ด ๋‹ค์‹œ ์‹œ์ž‘๋˜๋ฉด ๋™์ผํ•œ ๊ฒฉ๋ฆฌ๋ฅผ ๋กœ๋“œํ•˜๊ณ  ๋น„์˜ฌ๋ผ UI๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ด ๋ฐฉ๋ฒ•์€ ๋ฌธ์ œ๋ฅผ ์ „ํ˜€ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ „์ฒด ์ƒํƒœ๊ฐ€ ์—ฌ์ „ํžˆ ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ์„ค์ • > ์•ฑ์—์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค‘์ง€ํ•˜์—ฌ 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๊ฐ€ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋„๋ก ์š”์ฒญํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ณต๊ตฌ ์†”๋ฃจ์…˜ A: ์ž์‹ ์˜ ์ €์žฅ๋œ ์ธ์Šคํ„ด์Šค ์ƒํƒœ ํŒŒ์ผ

onSavedInstanceState ๋“ฃ๊ณ  ์ด ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด Flutter ์•ฑ์— ์•Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์•ฑ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  file ์”๋‹ˆ๋‹ค. ์•ฑ์ด ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ์—์„œ ๋ณต๊ตฌ๋˜๋ฉด(Android ์ธก์—์„œ savedInstanceState ๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Œ) ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ณ  ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ์ƒํƒœ๋ฅผ ๋ณต๊ตฌํ•ฉ๋‹ˆ๋‹ค. (ํžŒํŠธ: ํ”Œ๋žซํผ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์Šต๋‹ˆ๋‹ค.)

์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์ข…๋ฃŒํ–ˆ์„ ๋•Œ ์ƒํƒœ๋ฅผ ๋ณต๊ตฌํ•˜๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ์˜ค๋ž˜๋œ ๊ฒฝ์šฐ ์ €์žฅ๋œ ์ƒํƒœ๋ฅผ ํ•ด์ œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค!

๋ณต๊ตฌ ์†”๋ฃจ์…˜ B: ์ƒํƒœ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ €์žฅ

ํƒ€์ด๋จธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ”Œ๋žซํผ ์ธก์˜ ์•ฑ ์ƒํƒœ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ง€์†์ ์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 3์ดˆ๋งˆ๋‹ค ํ•ฉ์‹œ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Android๊ฐ€ onSavedInstanceState ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ด์ „์— ์ €์žฅํ•œ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ, ์ง€๋‚œ 3์ดˆ ๋™์•ˆ ๋ฐœ์ƒํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์žƒ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

๋ณต๊ตฌ ์†”๋ฃจ์…˜ C: ์ฃผ์š” ์ง€์ ์—์„œ ์ƒํƒœ ์ €์žฅ

์†”๋ฃจ์…˜ 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"
        }
    }
}

์‹ค์ œ ๊ตฌํ˜„์€ ์•ฑ ์•„ํ‚คํ…์ฒ˜์— ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

  • Redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์—ญ ์•ฑ ์ƒํƒœ๋ฅผ ์ฆ‰์„์—์„œ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • scoped_model ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋ธ์„ ์ €์žฅํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ Redux ์ƒํƒœ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋‹น์‹ ์—๊ฒŒ ์ค„ ์ˆ˜ ์žˆ๋Š” ์ตœ๊ณ ์˜ ํŒ:

  • UI์™€ ๋ชจ๋ธ์„ ์—„๊ฒฉํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜์„ธ์š”.
  • ๊ฐ ํ™”๋ฉด์„ ๋ณด๊ณ  ์ƒํƒœ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๋ฐ ์ •๋ง๋กœ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ž๋ฌธํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์‹ค์ œ๋กœ ๋งŽ์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
  • iOS 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์—์„œ ์ด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด FlutterNativeView ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  Application ์ธ์Šคํ„ด์Šค๋ฅผ ์ปจํ…์ŠคํŠธ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ธฐ๋ณธ ๋ณด๊ธฐ์—์„œ ๋ฒˆ๋“ค์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค( runFromBundle ์˜ˆ๋ฅผ ์ฐพ์œผ์‹ญ์‹œ์˜ค).
  • ์ด ๋„ค์ดํ‹ฐ๋ธŒ ๋ทฐ(์˜ˆ FlutterNativeViewProvider )๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

ํ™œ๋™

  • FlutterFragmentActivity๋ฅผ ํ™•์žฅํ•˜๊ณ  ๋‹ค์Œ ๋‘ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  <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()์— ์žˆ์„ ์‹ ํ˜ธ๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉด์ฑ… ์กฐํ•ญ

  1. ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด ํŒจํ„ด์€ ์ด ํŠน์ • ๋ฌธ์ œ๋ฅผ ์‹ค์ œ๋กœ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋งค์šฐ ์ง€์ €๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ํŒจํ„ด์„ ์šฉ์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  2. ์ด๋Ÿฌํ•œ 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 ๊ฐ€ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ ์‚ฌ์ด์—๋Š” ๋งŽ์€ ์œ ์‚ฌ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ”„๋กœ๊ทธ๋žจ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ–ˆ์„ ๋•Œ ์•ˆ์ •์ ์ธ ์ƒํƒœ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘ธ์‹œํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฑ์—”๋“œ์ž…๋‹ˆ๋‹ค.
  • ์•ˆ์ • ์ƒํƒœ๋ฅผ ์œ„ํ•œ ๋กœ์ปฌ sqlite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ์˜ค๋ž˜ ์ง€์†๋˜๋„๋ก ๋น„ํœ˜๋ฐœ์„ฑ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณผ๋„ ์ƒํƒœ์— ๋Œ€ํ•œ '๋ณ€์ˆ˜'๋ผ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ.

'๋ณ€์ˆ˜' ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—๋Š” ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ์†์„ฑ์ด ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ํด๋ž˜์Šค๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด '๋ณ€์ˆ˜' ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ์Šคํฌ๋ฆฐ ์Šคํƒ์ž…๋‹ˆ๋‹ค. (๊ฐ„๋‹จํžˆ ๋‚˜์—ด). ๋งจ ์œ„์— ์žˆ๋Š” ํ™”๋ฉด์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•œ ํ™”๋ฉด์ž…๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ '๋’ค๋กœ'๋ฅผ ๋ˆ„๋ฅผ ๋•Œ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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 ์†์„ฑ์„ ์„ค์ •ํ•˜๋ฉด ๊ฒฝ๋กœ๊ฐ€ ํƒ์ƒ‰ ์Šคํƒ์œผ๋กœ ํ‘ธ์‹œ๋˜๊ณ  ๊ฒฝ๋กœ๊ฐ€ ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ๋‚œ ๋‹น์‹ ์ด ๋˜ํ•œ ํ•„์š” _think_ 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

์ž‘์—… ์ƒ˜ํ”Œ -

_ ํŽธ์ง‘ _
_์ด ์•ฑ์€ ๊ณต๊ธ‰์ž ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ์ง€๋งŒ ์ตœ๊ทผ ์•ฑ์—์„œ ์•ฑ์„ ๋‹ซ์•˜๋‹ค๊ฐ€ ๋‹ค์‹œ ์—ฐ ํ›„ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์— ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค._

ezgif com-video-to-gif

ezgif com-video-to-gif (1)

๋ฌธ์ œ -

๋‹ค๋ฅธ ์•ฑ์—์„œ ์•ฑ์œผ๋กœ ์™”๋‹ค๋ฉด ํ™ˆ ์œ„์ ฏ์—์„œ ๋Œ์•„๊ฐˆ ๋•Œ๋งˆ๋‹ค ํ•ญ์ƒ ์ด์ „ ์•ฑ์ด ์•„๋‹Œ ํ™ˆ ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ์‹œ :-
์‚ฌ์šฉ์ž๋Š” ์ด์ œ ๊ทธ๋“ค์€ ๋‹ค์‹œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ทธ๋“ค์€ >> ๊ทธ๋“ค์€ ํ†ต์ง€์—์„œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์—ด์„ >> ์–ป์„ ๊ทธ๋“ค์€ ํœด๋Œ€ ์ „ํ™”์˜ ํ™ˆ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐ€ํ•˜์ง€ ๊ฒƒ์ด๋‹ค >> 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 ์ž„๋ฒ ๋”ฉ)๊ฐ€ ์ถœ์‹œ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ์ž‘์—…์€ ๋ณ„๋„์˜ ๋ฌธ์ œ์—์„œ ์ถ”์ ๋ฉ๋‹ˆ๋‹ค.

์ž˜ ํ–ˆ์–ด์š”!!!!! ๊ณ ๋งˆ์›Œ์š” ํ”Œ๋Ÿฌํ„ฐ!!!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰