๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ

    Flutter/ popUntil ์„ ํ• ๋•Œ ๊ฒ€์€ํ™”๋ฉด์ด ๋œฌ๋‹ค๋ฉด?

    ์ด๋ฒˆ๊ธ€์€ ๊ต‰์žฅํžˆ ์งง๊ณ  ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒ๋ฉด ์ œ๊ฐ€ ํ•œ ๋ฉ์ฒญํ•œ ์‹ค์ˆ˜๋ฅผ ์ ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. popUntil์„ ํ• ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ routeSettings ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ModalRoute.withName()์„ ์•”๋งŒ ๋„ฃ์–ด๋„ ๊ฒ€์€ํ™”๋ฉด์ด ๋œน๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ์ƒ๊ฐํ•˜๋ฉด ํ•ด๋‹น ์ด๋ฆ„์ด ํ•ฉ๊ฒฉ๋ช…๋‹จ์— ์—†๋Š”๋ฐ ์žˆ๋‹ค๊ณ  ๋ฐ•๋ฐ• ์šฐ๊ธฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์‹œ์ฝ”๋“œ๋ฅผ ๋ณด์‹œ๋ฉด ์ดํ•ด๊ฐ€ ์‰ฌ์šฐ์‹ค ๊ฒƒ ์ž…๋‹ˆ๋‹ค. // popUntil์ด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ class MyRouter { static Route generateRoute(RouteSettings settings) { switch (settings.name) { case "SPLASH_SCREEN": return MaterialPageRoute( ..

    Flutter Provider + '?' ํŒจํ„ด  (feat. ChangeNotifier, Mobx, BLoC, etc..)

    Flutter Provider + '?' ํŒจํ„ด (feat. ChangeNotifier, Mobx, BLoC, etc..)

    Flutter๋ฅผ ํ•˜๋ฉด ํ•ญ์ƒ ๋˜์ง€๊ฒŒ ๋˜๋Š” ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒํƒœ๊ด€๋ฆฌ ํŒจํ„ด์„ ๊ตฌ์ถ•ํ• ์ง€์— ๋Œ€ํ•œ ๋‹ต์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜๊ฐ€ ๊ทธ์— ๋Œ€ํ•œ ๋Œ€๋‹ต์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๊ตฌ๊ธ€์€ ๋งค I/O ๋•Œ๋งˆ๋‹ค ์ƒํƒœ๊ด€๋ฆฌ ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ์†Œ๊ฐœํ•ด์™”์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ฐ ๋…„๋„๋ณ„ ์†Œ๊ฐœ๋œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. 2018 2018 Google I/O (ScopedModel, BLoC) 2019 2019 Google I/O (Provider+ChangeNotifier) 2019 I/O. Provider+ChangeNotifier๊ฐ€ ์˜ˆ์‹œ๋กœ ์†Œ๊ฐœ๋์Šต๋‹ˆ๋‹ค. ์–ธ๋œป ๋ณด๋ฉด ์ด ์ž์ฒด๋กœ ProviderํŒจํ„ด์˜ ์™„์„ฑ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ„๊ณผํ•˜๊ณ  ์žˆ๋Š”๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค. Provider๋Š” ํŒจํ„ด์ด ์•„๋‹ˆ๋ผ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. Provider+ChangeNotifier๊ฐ€ ํŒจํ„ด์ด์ง€ Provider๋Š” I..

    Android / NestedScrollView ๋‚ด์˜ RecyclerView ์ž๋™ ์Šคํฌ๋กค ๋ฌธ์ œ (์Šคํฌ๋กค ๋ฐ€๋ฆผ ํ˜„์ƒ)

    NestedScrollView๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์ฃผ๋กœ ๋‚ด๋ถ€์— RecyclerView๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ focus๊ฐ€ RecyclerView๋กœ ๊ฐ€์„œ ์ƒ๋‹จ์— ๋‚ด์šฉ์ด ๋” ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  RecyclerView๊ฐ€ ์žˆ๋Š” ์œ„์น˜๋กœ Scroll์ด ๋˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ํ˜„์ƒ์ด ๋‚˜ํƒ€๋‚˜๋Š” ์ด์œ ๋Š” ScrollView๊ฐ€ ์žˆ์„๋•Œ ์ž์‹์— RecyclerView์™€ ๊ฐ™์ด Scroll์ด ๊ฐ€๋Šฅํ•œ ๋ทฐ๊ฐ€ ์žˆ์œผ๋ฉด, ํ•ด๋‹น ์ž์‹ ๋ทฐ์—๊ฒŒ focus๊ฐ€ ๋บ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž์‹๋ทฐ์—๊ฒŒ focus๊ฐ€ ๊ฐ€์ง€ ์•Š๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ๋จผ์ € ๋“œ๋Š” ์ƒ๊ฐ์€ android:focusable(Focus ๊ฐ€๋Šฅ ์—ฌ๋ถ€), android:focusableInTouchMode (์‚ฌ์šฉ์ž ํ„ฐ์น˜์— ์ธํ•œ Focus ๊ฐ€..

    Flutter / 4ํƒ„ : Flutter์˜ ์ƒํƒœ๊ด€๋ฆฌ

    Flutter / 4ํƒ„ : Flutter์˜ ์ƒํƒœ๊ด€๋ฆฌ

    ํด๋ผ์ด์–ธํŠธ ๊ฐœ๋ฐœ์„ ํ•œ ๋‹จ์–ด๋กœ ํ‘œํ˜„ํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค “์ƒํƒœ ๊ด€๋ฆฌ”. ์˜ค๋Š˜์€ Flutter๊ฐ€ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๋‚ด์šฉ์€ Flutter์˜ UI ์ž‘๋™๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ ์ž˜๋ชจ๋ฅด์‹œ๋ฉด ์ดํ•ด๊ฐ€ ์–ด๋ ค์šฐ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ž˜ ๋ชจ๋ฅด์‹ ๋‹ค๋ฉด ๋จผ์ € Flutter UI ์ž‘๋™๋ฐฉ์‹์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด์ฃผ์„ธ์š” Flutter / 3ํƒ„ : Flutter์˜ UI์— ๊ด€ํ•˜์—ฌ Flutter / 3ํƒ„ : Flutter์˜ UI์— ๊ด€ํ•˜์—ฌ ์ด๋ฒˆ์—๋Š” Flutter์˜ UI์— ๊ด€ํ•˜์—ฌ ๊ณต๋ถ€๋ฅผ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ Flutter๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด์‹œ๋Š” ๋ถ„๋“ค์€ ์•„๋ž˜์˜ ๊ธ€์„ ๋จผ์ € ์ฝ๊ณ  ์™€์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. https://medium.com/@joooosan011/flutter-2%ED%83%84-flutter-%ED%8.. joooosa..