๐Ÿฆ Flutter

ยท๐Ÿฆ Flutter
Failed to build iOS appCould not build the precompiled application for the device. Error (Xcode): Target debug_unpack_ios failed: Exception: Failed to codesign /Users/i/Documents/flutter_memo/build/ios/Debug-iphoneos/Flutter.framework/Flutter with identity 0F5970B1325A2857E42BF850B01687CC2E5108A4. Error launching application on Jonghyuck’s iPhone. VSCode ์—์„œ ์•„์ดํฐ ์‹ค๊ธฐ๊ธฐ๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๋Œ๋ ค๋ดค๋Š”๋ฐ ์œ„์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฌธ๊ตฌ์™€ ํ•จ๊ป˜..
ยท๐Ÿฆ Flutter
๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ๋ฐ”๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹คํŒจ๋ฌธ๊ตฌ๋ฅผ ๋„์šฐ๋Š” ๊ฒƒ๋ณด๋‹ค 2๋ฒˆ๋” ์š”์ฒญํ•ด๋ณด๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹คํŒจ๋ฌธ๊ตฌ๋ฅผ ๋„์šฐ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ”๋กœ retry() ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด์„œ์ด๋‹ค. retry(2) ๋ฅผ ํ†ตํ•ด ์ฒซ๋ฒˆ์งธ ์‹œ๋„ + 2๋ฒˆ ๋”์š”์ฒญ ํ–ˆ์Œ์—๋„ ์‹คํŒจํ•œ๋‹ค๋ฉด catch() ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์‹คํŒจ ์ด๋ฒคํŠธ๋ฅผ ์žก์•„๋‚ธ๋‹ค. enum SampleError: Error { case somethingWentWrong}func fetchData() -> AnyPublisher { let shouldFail = Bool.random() if shouldFail { print("Fetching data failed, will retry...") return Fail(error: SampleEr..
ยท๐Ÿฆ Flutter
์ด์ „๊นŒ์ง€ ์ปด๋ฐ”์ธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•˜๋ฉด์„œ ํ•ด์™”๋˜ ์—๋Ÿฌ์ฒ˜๋ฆฌ๋“ค์€ ๋ชจ๋‘ ์—…์ŠคํŠธ๋ฆผ์—์„œ ์—๋Ÿฌ๋ฅผ ๋˜์ ธ์ฃผ๋ฉด ๋‹ค์šด์ŠคํŠธ์ž„์—์„œ .sink ๋ฅผ ํ†ตํ•ด ๋ฐ›๊ธฐ๋งŒ ํ•˜๋Š” ์ˆ˜๋™์ ์ธ ๋ฐฉ๋ฒ•์ด์˜€๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ์—๋Ÿฌ๋ฅผ throwํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ sink๋ฐ›๊ธฐ์ „์— ์“ฐ๊ณ  sink์—์„œ catchํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? ํ˜น์€ OOP๊ฐœ๋…๊ณผ ํ•จ๊ป˜ ์ปด๋ฐ”์ธ์„ ์“ฐ๋ฉด์„œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋ถ€ํ„ฐ ๋‚˜์˜จ Stream์„ ๋ฐ›์„ ๋•Œ ๋ณดํ†ต ์ถ”์ƒํ™”๋œ ์—๋Ÿฌ๋ฅผ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— sink๋กœ ๋ฐ›๊ธฐ์ „์— ๊ตฌ์ฒด ์—๋Ÿฌํƒ€์ž…์œผ๋กœ ๋ฐ”๊ฟ”์•ผํ•œ๋‹ค๋ฉด? .tryMap ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์—๋Ÿฌ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.  enum APIError: Error { case networkError case dataCorrupted case invalidFormat}struct User { let id: Int let na..
ยท๐Ÿฆ Flutter
๋ฐฑํ”„๋ ˆ์…” ๊ด€๋ฆฌ๋Š” ์ฃผ๋กœ ๋ฐฑ์—”๋“œ์—์„œ ํ•˜์ง€๋งŒ Combine ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ™œ์šฉํ•ด์„œ iOS ๋‹จ์—์„œ๋„ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฐฑํ”„๋ ˆ์…”๋ž€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋‚ ๋ผ์˜ค๋Š” ๋ฐ์ดํ„ฐ ์†๋„๋ฅผ, ์ปด๋ฐ”์ธ์œผ๋กœ ํ•œ์ •์ง€์œผ๋ฉด ์—…์ŠคํŠธ๋ฆผ์—์„œ ๋‚ ๋ผ์˜ค๋Š” ๋ฐ์ดํ„ฐ ์†๋„๋ฅผ ๋‹ค์šด์ŠคํŠธ๋ฆผ์˜ ์ฒ˜๋ฆฌ์†๋„๊ฐ€ ๋”ฐ๋ผ๊ฐ€์ง€ ๋ชปํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋กœ ์˜ˆ์‹œ ์ƒํ™ฉ์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉiOS ์•ฑ์—์„œ ์™ธ๋ถ€ API๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•  ๋•Œ, ๋„คํŠธ์›Œํฌ ์ƒํƒœ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์‘๋‹ต ์†๋„์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ๋นจ๋ฆฌ ๋„์ฐฉํ•˜๋ฉด, ์•ฑ์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ธ”๋ก๋˜๊ฑฐ๋‚˜ UI๊ฐ€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋งŽ์€ ์–‘์˜ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์•ฑ(์˜ˆ: ๊ธˆ์œต ์•ฑ์—์„œ์˜ ์ฃผ์‹ ๊ฐ€๊ฒฉ ์—…๋ฐ์ดํŠธ, ์Šคํฌ์ธ  ์•ฑ์—์„œ์˜ ์‹ค์‹œ๊ฐ„ ์ ์ˆ˜ ์—…๋ฐ์ดํŠธ)์—์„œ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์˜ ๋ฐฑ..
ยท๐Ÿฆ Flutter
dataTaskPublisher() ๋Š” URLSession ์— ์†ํ•ด์žˆ๋Š” ์ปด๋ฐ”์ธ ์—ฐ์‚ฐ์ž๋กœ  ๋„คํŠธ์›Œํฌ ์‘๋‹ต์„ Publisher ๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.  dataTaskPublisher(for:) ๋ฉ”์†Œ๋“œ๋Š” URL ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์‹คํ–‰ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Publisher ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ Publisher๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠœํ”Œ ํ˜•ํƒœ์˜ ์ถœ๋ ฅ์„ ๋‚ด๋ณด๋‚ธ๋‹ค -> (data, response)data: ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” Data ๊ฐ์ฒดresponse: ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” URLResponse ๊ฐ์ฒด ์ปด๋ฐ”์ธ์—์„œ Publishers๋Š” ๊ตฌ์กฐ์ฒด๋กœ ์ •์˜๋˜์–ด ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋˜๋ฉฐ, ๊ฐ๊ฐ์˜ ๋ณต์‚ฌ๋ณธ์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ  share() ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ํ–‰๋™์ด ๋ณ€๊ฒฝ๋˜..
ยท๐Ÿฆ Flutter
Sequencing Operators๋Š” ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ณ€ํ˜•ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋“ค ์—ฐ์‚ฐ์ž๋Š” ํผ๋ธ”๋ฆฌ์…”์—์„œ ๋ฐฉ์ถœ๋œ ๋ฐ์ดํ„ฐ ์š”์†Œ๋“ค์˜ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜์—ฌ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‹น์—ฐํžˆ ์งˆ๋ฌธ์ด ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.  ??: Transforming Operators ๋„ ๋ณ€ํ˜•ํ•ด์„œ ์ฒ˜๋ฆฌํ•˜์ž–์•„? ๋‘ ์—ฐ์‚ฐ์ž ์นดํ…Œ๊ณ ๋ฆฌ์˜ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์€  ๊ฐ ์š”์†Œ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ณ€ํ˜•ํ•˜์—ฌ ๋‹ค์šด์ŠคํŠธ๋ฆผ์— ๋‚ด๋ ค๋ณด๋‚ด๋Š๋ƒ ์ŠคํŠธ๋ฆผ์˜ ์ „์ฒด ๊ตฌ์กฐ๋‚˜ ์š”์†Œ์˜ ์ˆœ์„œ์™€ ๊ด€๋ จ๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ›„ ๋‹ค์šด์ŠคํŠธ๋ฆผ์— ๋‚ด๋ ค๋ณด๋‚ด๋Š๋ƒ์ด๋‹ค.  Transforming Operators ๋Š” ๊ฐ’๋งˆ๋‹ค ํ™•์ธํ›„ ๋ณ€ํ˜•์‹œํ‚ค๊ณ , Sequencing Operators ๋Š” ์ŠคํŠธ๋ฆผ์„ ํ™•์ธ ํ›„ ๋ณ€ํ˜•์‹œํ‚จ๋‹ค. ์ฆ‰ ๊ฐœ๋ณ„์ ์ธ ๊ฐ’์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ณ€ํ˜•์‹œํ‚ค๋ƒ ์ŠคํŠธ๋ฆผ์„ ํ•œ..
ยท๐Ÿฆ Flutter
Scheduler ํ”„๋กœํ† ์ฝœ์€  ๋ฌธ์ž๊ทธ๋Œ€๋กœ ํด๋กœ์ €๋ฅผ ์–ธ์ œ, ์–ด๋–ป๊ฒŒ ์‹คํ–‰์‹œํ‚ฌ์ง€ "์Šค์ผ€์ฅด๋ง"ํ•œ๋‹ค. ์ฃผ์˜ํ•  ์ ์€ ์Šค์ผ€์ฅด๋Ÿฌ์™€ ์Šค๋ ˆ๋“œ๋Š” ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ด๋‹ค! Scheduler ์—ฐ์‚ฐ์ž์ค‘ ํ•˜๋‚˜์ธ Subscribe(on:) ์—ฐ์‚ฐ์ž๋ถ€ํ„ฐ ์•Œ์•„๋ณด์ž. subscribe(on:) ์—ฐ์‚ฐ์ž๋Š” ํผ๋ธ”๋ฆฌ์…”๊ฐ€ ์–ด๋Š ์Šค์ผ€์ฅด๋Ÿฌ์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ• ์ง€ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋ฅผํ†ตํ•ด ํผ๋ธ”๋ฆฌ์…”์˜ ๊ตฌ๋…์ด ์ƒ์„ฑ๋˜๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ์Šค๋ ˆ๋“œ ๋˜๋Š” ํ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. Receive(on:) ์—ฐ์‚ฐ์ž๋Š” ํผ๋ธ”๋ฆฌ์…”์˜ ์ถœ๋ ฅ๊ฐ’์„ ํŠน์ • ์Šค์ผ€์ฅด๋Ÿฌ(์˜ˆ: ๋ฉ”์ธ ์Šค๋ ˆ๋“œ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ ๋“ฑ)์—์„œ ์ˆ˜์‹ ํ•˜๋„๋ก ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.. ์ด๋ฅผ ํ†ตํ•ด UI ์—…๋ฐ์ดํŠธ, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋“ฑ์˜ ์ž‘์—…์„ ์ ์ ˆํ•œ ์Šค๋ ˆ๋“œ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. Subscribe(on:) ๊ณผReceive(on:..
ยท๐Ÿฆ Flutter
์ปด๋ฐ”์ธ ํ•™์Šต์ค‘ ์˜ˆ์ œ์ฝ”๋“œ์—์„œ ๊ฝค๋‚˜ ์œ ์šฉํ•œ ํ”„๋กœํ† ์ฝœ์„ ์ ‘ํ•˜๊ฒŒ๋˜์—ˆ๋‹ค. ๋ฐ”๋กœ CustomStringConvertible ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ์ด ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•œ ๊ฐ์ฒด๋Š” description ํ”„๋กœํผํ‹ฐ๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ๊ฐ€์ง€๊ฒŒ๋˜์–ด ์ž์‹ ์ด ์–ด๋–ค๊ฐ์ฒด์ธ์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. ๊ฑฐ๋‘์ ˆ๋ฏธํ•˜๊ณ  ์ƒํ™ฉ๋ณ„ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด์ž 1. ๋””๋ฒ„๊น… ๋ฐ ๋กœ๊น…struct NetworkRequest: CustomStringConvertible { var url: String var method: String var headers: [String: String] var description: String { "Request to \(url) with method \(method) and headers \(headers)" ..
ยท๐Ÿฆ Flutter
Combine์˜ ์ŠคํŠธ๋ฆผ์€ ๊ฒฐ๊ตญ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ์˜ ๋‚˜์—ด์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ์ ์€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค. Timing ์—ฐ์‚ฐ์ž๋Š” ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์ ์— ๋Œ€ํ•ด ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ์‚ฐ์ž์ด๋‹ค. ๋จผ์ € Delay ์—ฐ์‚ฐ์ž๋Š” ๋ง๊ทธ๋Œ€๋กœ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ์ ์„ ๋Šฆ์ถฐ์ฃผ๋Š” ์—ฐ์‚ฐ์ž์ด๋‹ค. ์ด๋•Œ ์ฃผ์˜์‚ฌํ•ญ์€ ๋Šฆ์ถ”๋Š” ์‹œ๊ฐ„์„ ๊ทธ๋ƒฅ Int๊ฐ’์œผ๋กœ ๋ฐ›๋Š” ๊ฒƒ์ด ์•„๋‹Œ Dispatchqueue.SchedulerTimeTypes.Stride๋กœ ๋ฐ›๋Š”๋‹ค. ๋งŒ์•ฝ Int๊ฐ’์œผ๋กœ ์ฃผ๊ณ ์‹ถ๋‹ค๋ฉด for ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋‹ท ์„ธ์ปจ๋“œ ๋“ฑ์œผ๋กœ ๋„ฃ์–ด์ฃผ์–ด์•ผํ•œ๋‹ค. ๋˜ํ•œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋Œ๋ฆด๊ฑด์ง€ ๊ธ€๋กœ๋ฒŒ์—์„œ ๋Œ๋ฆด๊ฑด์ง€๋„ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.  ์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด collect(byTime) ์—ฐ์‚ฐ์ž๋Š” ํŠน์ • ์‹œ๊ฐ„๋™์•ˆ Upstream์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ชจ์•˜๋‹ค๊ฐ€ ๋‹ค์šด์ŠคํŠธ๋ฆผ์— ๋‚ด๋ ค๋ณด๋‚ด์ฃผ๋Š” ..
ยท๐Ÿฆ Flutter
Transforming ๊ณผ Filtering ์— ์ด์–ด์„œ Combine ์—ฐ์‚ฐ์ž๋“ค์—๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ๋จผ์ € Prepending ์—ฐ์‚ฐ์ž์ด๋‹ค.  prepend ์—ฐ์‚ฐ์ž๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ฐ’์„ ์ŠคํŠธ๋ฆผ ์•ž์— ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๊ฐ€์ ธ์˜ฌ ์ŠคํŠธ๋ฆผ ์•ž์— ์ด๋ฒคํŠธ๋ฅผ ๋ถ™์—ฌ์ฃผ๊ณ  ์‹ถ์„ ๋•Œ append์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ž.   Combining ์—ฐ์‚ฐ์ž์ธ append ์—ฐ์‚ฐ์ž๋Š” prepend ์ฒ˜๋Ÿผ ๊ฐ’์ด๋‚˜ ํผ๋ธ”๋ฆฌ์…”์— ๋”ํ•ด์ฃผ๋Š” ์—ฐ์‚ฐ์ž์ง€๋งŒ prepend๋Š” ์•ž์—๋ถ™์—ฌ์ฃผ์—ˆ๋‹ค๋ฉด append๋Š” ๋’ค์— ๋ถ™์—ฌ์ฃผ๋Š” ์—ฐ์‚ฐ์ž์ด๋‹ค.    switchToLatest ์—ฐ์‚ฐ์ž๋Š” ์ค‘์ฒฉ๋œ Publisher๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. Publisher๊ฐ€ ๋˜ ๋‹ค๋ฅธ Publisher๋ฅผ ๋ฐฉ์ถœํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ตœ์‹  Publisher๊ฐ€ ๋ฐฉ์ถœํ•˜๋Š” ๊ฐ’๋งŒ์„ ๊ตฌ๋…ํ•˜๊ณ  ์ด์ „์— ๊ตฌ๋…ํ•˜๋˜ Publisher๋Š”..
suojae
'๐Ÿฆ Flutter' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (4 Page)