๐ Today I Learned 15ํ์ฐจ - Flutter ์์ ํตํ ๐น
๐ Flutter ์์ ํตํ ์ฑ
๐ฏ ํ์ต ๋ชฉํ
์๊ณ ๋ผ API๋ฅผ ์ฌ์ฉํด์ ๊ฐ๋จํ๊ฒ 1:1 ์์ ํตํ ์ฑ์ ๊ตฌํํ๊ฒ ์ต๋๋ค.
๐ ํ์ต ์์
โญ ์ฌ์ ์ง์
- ์นด๋ฉ๋ผ ํ๋ฌ๊ทธ์ธ
- WebRTC
- ์๋ฎฌ๋ ์ดํฐ์์ ์นด๋ฉ๋ผ ์ฌ์ฉ
- ๋ด๋น๊ฒ์ด์
๐ ๏ธ ์ฌ์ ์ค๋น
- ์๊ณ ๋ผ API
- ์ด๋ฏธ์ง์ ํฐํธ ์ถ๊ฐ
- pubspec yaml ์ค์
- ๋ค์ดํฐ๋ธ ์ค์
- ํ๋ฌํฐ์์ ๊ถํ ๊ด๋ฆฌ
- ํ๋ก์ ํธ ์ด๊ธฐํ
๐ป ๊ตฌํ
- ํ ์คํฌ๋ฆฐ ์์ ฏ
- ์คํฌ๋ฆฐ ์์ ฏ
๐ ํ๋ก์ ํธ ๊ตฌ์ํ๊ธฐ
์์ ํตํ๋ฅผ ํ๋ ค๋ฉด ๋์์๊ณผ ์์ฑ์ ์๋ก ์ ๋ฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์นด๋ฉ๋ผ ๊ถํ๊ณผ ๋ง์ดํฌ ๊ถํ์ด ํ์ํฉ๋๋ค.
permission_handler
ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํด์ ์๋๋ก์ด๋์ iOS ๊ถํ์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ ์์๋ณผ ์์
๐ ์ฃผ์ ๋ด์ฉ
๐ท ์นด๋ฉ๋ผ ํ๋ฌ๊ทธ์ธ
ResolutionPreset ์ ๋ณด
ResolutionPreset ๊ฐ | ํด์๋ |
---|---|
ResolutionPreset.low |
์๋๋ก์ด๋์ ์น 240p, ์์ดํฐ 352x288 |
ResolutionPreset.medium |
์๋๋ก์ด๋์ ์น 480p, ์์ดํฐ 640x480 |
ResolutionPreset.high |
์๋๋ก์ด๋์ ์น 720p, ์์ดํฐ 1280x720 |
ResolutionPreset.veryHigh |
์๋๋ก์ด๋์ ์น 1080p, ์์ดํฐ 1920x1080 |
ResolutionPreset.ultraHigh |
์๋๋ก์ด๋์ ์น 2160p, ์์ดํฐ 3840x2160 |
ResolutionPreset.max |
์ต๋ ํด์๋ |
๐ WebRTC
์์ ํตํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ค๋ฉด ์์๊ณผ ์์ฑ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์ ์กํ๊ธฐ, ํด๋ผ์ด์ธํธ ๊ฐ์ ์ฐ๊ฒฐํ๊ธฐ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํฉ๋๋ค.
์น ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํต์ ํ๋ WebRTC๋ผ๋ API๊ฐ ์์ต๋๋ค.
- ์์ฑ ํตํ, ์์ํตํ, P2P ํ์ผ ๊ณต์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฏ๋ก WebRTC๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ ์์ ํตํ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค.
๐ก ์๊ทธ๋๋ง ์๋ฒ: WebRTC๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ ํด๋ผ์ด์ธํธ ๋ง๊ณ ๋ ์ค๊ณ์ฉ ์๋ฒ๊ฐ ํ์ํฉ๋๋ค. ์ด ์๋ฒ๋ฅผ ์ง์ ๊ตฌํํ ์๋ ์์ง๋ง, ์ฑ ๊ฐ๋ฐ์ ์ง์คํ๊ณ ์ ์๊ณ ๋ผ ์๋น์ค๋ฅผ ์ด์ฉํ๊ฒ ์ต๋๋ค.
ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ์ ์ ๋ณด ํ๋ฆ ์ ์ฐจ
.png)
WebRTC ๋์ ์๋ฆฌ
- WebRTC๋ฅผ ์ฌ์ฉํ ํด๋ผ์ด์ธํธ๋ค์ ์๋ก์๊ฒ ์ฐ๊ฒฐํ ์ ์๋ ๊ณต๊ฐ IP ๋ฑ์ ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ์ก
- ์๋ฒ๋ก๋ถํฐ ์๋์ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ๋ฐ์์ด
- ์๋ฒ์์ ๋ฐ์์จ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ด ์์ ๋ฐ ์์ฑ์ ๊ณต์ ํ๊ณ ์๋์ ์์ ๋ฐ ์์ฑ ์ ๋ณด๋ฅผ ์์
๐งญ ๋ด๋น๊ฒ์ด์
๋ด๋น๊ฒ์ด์ ์ ํ๋ฌํฐ์์ ํ๋ฉด์ ์ด๋ํ ๋ ์ฌ์ฉํ๋ ํด๋์ค์ ๋๋ค.
- ๋ด๋น๊ฒ์ด์ ์ ์คํ(Stack)์ด๋ผ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ์ค๊ณ๋์ด ์์ต๋๋ค.
- ํ๋ฌํฐ์์๋ ๋ด๋น๊ฒ์ด์ ์คํ์ ๊ฐ์ฅ ์์ ์์นํ ์์ ฏ์ ํ๋ฉด์ผ๋ก ๋ณด์ฌ์ค๋๋ค.
Navigator ํด๋์ค์์ ์ ๊ณตํ๋ ํจ์
๋ฉ์๋ | ์ค๋ช |
---|---|
push() |
์๋ก์ด ํ๋ฉด์ ์คํ์ ์ถ๊ฐ |
pushReplacement() |
ํ์ฌ ํ๋ฉด์ ์๋ก์ด ํ๋ฉด์ผ๋ก ๊ต์ฒด |
pushAndRemoveUntil() |
ํน์ ์กฐ๊ฑด๊น์ง ๋ชจ๋ ํ๋ฉด์ ์ ๊ฑฐํ๊ณ ์ ํ๋ฉด ์ถ๊ฐ |
pop() |
ํ์ฌ ํ๋ฉด์ ์คํ์์ ์ ๊ฑฐ |
maybePop() |
๊ฐ๋ฅํ ๊ฒฝ์ฐ์๋ง ํ์ฌ ํ๋ฉด ์ ๊ฑฐ |
popUntil() |
ํน์ ์กฐ๊ฑด๊น์ง ๊ณ์ ํ๋ฉด ์ ๊ฑฐ |
๐ ํ๋ฌํฐ์์ ๊ถํ ๊ด๋ฆฌ
ํน์ ๊ธฐ๋ฅ๋ค, ํนํ ๋ณด์์ ๋ฏผ๊ฐํ ๊ธฐ๋ฅ์ ์ฌ์ฉ์๊ฐ ๊ถํ์ ํ๊ฐํด์ค์ผ ์ฑ์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์๋๋ก์ด๋์ iOS์๋ ํ๊ฐ๋ฅผ ๋ฐ์์ผ ํ๋ ๊ถํ์ด ์๊ณ ํ๊ฐ๋ฅผ ๋ฐ์ง ์์๋ ๋๋ ๊ถํ์ด ์์ต๋๋ค (์: ์ธํฐ๋ท ๊ถํ).
โ ๏ธ ์ฃผ์: ์นด๋ฉ๋ผ์ ๋ง์ดํฌ ๊ถํ์ ๊ฒฝ์ฐ ์ฌ์ฉ์์๊ฒ ์ด์ฉ ํ๊ฐ๋ฅผ ๊ผญ ๋ฐ์์ผ์ง๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ๊ถํ๋ค์ ๋ค์ดํฐ๋ธ ์ค์ ์ ๋ฑ๋ก์ ํ๋๋ผ๋ ํ๋ฌํฐ ํ๋ ์์ํฌ์์ ๊ถํ์ด ํ๊ฐ๋๋์ง ํ์ธํด ์ค์ผ ํฉ๋๋ค.
permission_handler ํ๋ฌ๊ทธ์ธ ์ฌ์ฉ
permission_handler
ํ๋ฌ๊ทธ์ธ์์ Permission
ํด๋์ค์ ์กด์ฌํ๋ ๊ถํ์ ์ ํํ ํ request()
ํจ์๋ฅผ ์คํํ๋ฉด ๊ถํ์ ์์ฒญํ ์ ์์ต๋๋ค.
final permission = await Permission.camera.request();
if (permission == PermissionStatus.granted) {
// ๊ถํ ํ๊ฐ ์๋ฃ
} else {
// ๊ถํ ์์
}
PermissionStatus ํด๋์ค
๊ฐ | ์ค๋ช |
---|---|
denied |
๊ถํ์ด ๊ฑฐ๋ถ๋จ |
granted |
๊ถํ์ด ํ๊ฐ๋จ |
restricted |
๊ถํ์ด ์ ํ๋จ (iOS์ parental controls ๋ฑ) |
limited |
์ ํ์ ์ผ๋ก ๊ถํ์ด ํ๊ฐ๋จ (iOS 14+) |
permanentlyDenied |
๊ถํ์ด ์๊ตฌ์ ์ผ๋ก ๊ฑฐ๋ถ๋จ (์ค์ ์์๋ง ๋ณ๊ฒฝ ๊ฐ๋ฅ) |
์ฌ๋ฌ ๊ถํ ๋์์ ์์ฒญํ๊ธฐ
๊ถํ์ ์ํฉ์ ๋ง๊ฒ ํ๋์ฉ ์์ฒญํ๋ ๊ฒฝ์ฐ๋ ์์ง๋ง, ํ์ํ ๊ถํ์ ํ ๋ฒ์ ์ฐ์์ ์ผ๋ก ์์ฒญํ ๋๋ ์์ต๋๋ค.
์์ฒญํ๊ณ ์ถ์ ๊ถํ์ ์์๋๋ก List
์ ๋ฃ์ด์ request()
ํจ์๋ฅผ ์คํํด ์ฃผ๋ฉด ์ฌ๋ฌ ๊ถํ์ ๋จ๋ฒ์ ์์ฒญํ ์ ์์ต๋๋ค.
final resp = await [Permission.camera, Permission.microphone].request();
final cameraPermission = resp[Permission.camera];
final micPermission = resp[Permission.microphone];
๐ ๋ง๋ฌด๋ฆฌ
โ ์ค๋ ๋ฐฐ์ด ๊ฒ
- ์นด๋ฉ๋ผ ํ๋ฌ๊ทธ์ธ: ResolutionPreset์ ํตํ ํด์๋ ์ค์
- WebRTC: ์ค์๊ฐ ํต์ ํ๋กํ ์ฝ๊ณผ ์๊ทธ๋๋ง ์๋ฒ์ ์ญํ
- ๋ด๋น๊ฒ์ด์ : ์คํ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ ํ๋ฉด ์ ํ ๊ด๋ฆฌ
- ๊ถํ ๊ด๋ฆฌ: permission_handler๋ฅผ ํตํ ์นด๋ฉ๋ผ/๋ง์ดํฌ ๊ถํ ์์ฒญ
- PermissionStatus: ๊ถํ ์ํ ์ข ๋ฅ์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
๐ ๋ค์ ๊ณํ
- ์๊ณ ๋ผ API ์ค์ ๋ฐ ์ฐ๋
- ํ ์คํฌ๋ฆฐ๊ณผ ํตํ ์คํฌ๋ฆฐ ๊ตฌํ
- ์ค์ ์์ ํตํ ๊ธฐ๋ฅ ํ ์คํธ
๋๊ธ๋จ๊ธฐ๊ธฐ