๐ Today I Learned 14ํ์ฐจ - Dart ์ปฌ๋ ์ ์ ์ด ํ๋ฆ ๐
๐ Dart ์ปฌ๋ ์ ์ ์ด ํ๋ฆ
๐ค ์ง๋ฌธ
๋ค์๊ณผ ๊ฐ์ ์ฝ๋์์ children ๋ฐฐ์ด์ if ๋ฌธ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ Container๊ฐ ํฌํจ๋๋ ํํ๋ฅผ ๋ณด๊ฒ ๋์์ต๋๋ค:
children: [
VideoPlayer(videoPlayerController!),
if (showControls) Container(color: Colors.black.withOpacity(0.5)),
]
์ด ํํ๋ ์ฒ์ ๋ณด๋ ํํ์ธ๋ฐ, ์ด๋ป๊ฒ ๋ฌธ๋ฒ์ ์ผ๋ก ๊ฐ๋ฅํ ๊ฑธ๊น์? if ๋ฌธ์ {} ์์ ๋์์ ๋๋ ์๋๋๋ฐ ๋ง์ด์ฃ .
๐ก ๋ต๋ณ
๋ค, ์ฒ์ ๋ณด์๋ฉด ๊ต์ฅํ ์ ๊ธฐํ๊ฒ ๋๊ปด์ง ์ ์๋ ๋ฌธ๋ฒ์
๋๋ค. ๊ทธ ์ฝ๋๊ฐ ๋ฌธ๋ฒ์ ์ผ๋ก ๊ฐ๋ฅํ ์ด์ ๋ Dart ์ธ์ด์์ 2.3 ๋ฒ์ ๋ถํฐ ๋์
๋ ์ปฌ๋ ์
์ ์ด ํ๋ฆ(Collection Control Flow) ๊ธฐ๋ฅ ์ค ํ๋์ธ collection if ๋๋ถ์
๋๋ค.
๊ฒฐ๋ก ๋ถํฐ ๋ง์๋๋ฆฌ๋ฉด, if๋ฌธ์ด {}(์ค๊ดํธ) ์์ด ์ฌ์ฉ๋ ๋ ๋ฌธ(Statement)์ด ์๋ ํํ์(Expression)์ฒ๋ผ ๋์ํ์ฌ ๋ฆฌ์คํธ์ ์ผ๋ถ๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๐ ์ฃผ์ ๋ด์ฉ
1๏ธโฃ ๋ฌธ(Statement) vs ํํ์(Expression)
์ด ๋ฌธ๋ฒ์ ์ดํดํ๋ ค๋ฉด ๋จผ์ ๋ ๊ฐ์ง์ ์ฐจ์ด๋ฅผ ์์์ผ ํฉ๋๋ค.
- ๋ฌธ(Statement): ํน์ ์์
์ ์ํํ๋๋ก ํ๋ ๋ช
๋ น์
๋๋ค. ๊ทธ ์์ฒด๊ฐ ๊ฐ์ผ๋ก ํ๊ฐ๋์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ํํ ์๋
if (...) { ... },for (...) { ... }๋ฑ์ด ์ฌ๊ธฐ์ ํด๋นํฉ๋๋ค. - ํํ์(Expression): ํ๊ฐ๋์์ ๋ ํ๋์ ๊ฐ(value)์ ์์ฑํ๋ ์ฝ๋ ์กฐ๊ฐ์
๋๋ค.
1 + 2,isLoggedIn,Container()๋ฑ์ด ๋ชจ๋ ํํ์์ ๋๋ค.
๊ธฐ์กด์ if (...) { ... }๋ ๋ฌธ(Statement)์ด๊ธฐ ๋๋ฌธ์, ๊ฐ์ ๋ฃ์ด์ผ ํ๋ children ๋ฐฐ์ด(List) ์์ ์ง์ ๋ค์ด๊ฐ ์ ์์์ต๋๋ค. ๋ฆฌ์คํธ๋ ๊ฐ๋ค์ ๋ชจ์์ด๊ธฐ ๋๋ฌธ์ด์ฃ .
// โ ์ด๊ฑด ๋ฌธ๋ฒ์ ์ผ๋ก ๋ถ๊ฐ๋ฅํฉ๋๋ค.
// ๋ฆฌ์คํธ ์์๋ '๊ฐ'์ด ์์ผ ํ๋๋ฐ, if "๋ฌธ"์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
children: [
VideoPlayer(videoPlayerController!),
if (showControls) { // ์ค๊ดํธ๊ฐ ์๋ if "๋ฌธ"
Container(color: Colors.black.withOpacity(0.5));
}
]
2๏ธโฃ collection if์ ๋ฑ์ฅ โจ
Dart๋ ์ด๋ฐ ๋ถํธํจ์ ํด์ํ๊ณ ๋ ์ ์ธ์ ์ธ UI ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก collection if๋ฅผ ๋์
ํ์ต๋๋ค. ์ด๋ if๋ฅผ ํํ์์ฒ๋ผ ์ฌ์ฉํ์ฌ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ปฌ๋ ์
(List, Map, Set)์ ์์๋ฅผ ์ถ๊ฐํ ์ ์๊ฒ ํด์ฃผ๋ ํน๋ณํ ๋ฌธ๋ฒ์
๋๋ค.
// โ
์ด๋ ๊ฒ ์ค๊ดํธ ์์ด ์ฌ์ฉํ๋ฉด 'collection if' ๋ฌธ๋ฒ์ด ์ ์ฉ๋ฉ๋๋ค.
children: [
VideoPlayer(videoPlayerController!),
// 'showControls'๊ฐ true์ด๋ฉด, ์ด ์๋ฆฌ์ Container()๋ผ๋ '๊ฐ'์ด ํฌํจ๋๋ค.
// false์ด๋ฉด, ์๋ฌด๊ฒ๋ ์๋ ๊ฒ์ฒ๋ผ ์ทจ๊ธ๋๋ค.
if (showControls) Container(color: Colors.black.withOpacity(0.5)),
]
์ด ์ฝ๋๋ โ๋ง์ฝ showControls๊ฐ true๋ผ๋ฉด ์ด ๋ฆฌ์คํธ์ Container ์์ ฏ์ ํฌํจ์์ผ์คโ ๋ผ๋ ์๋ฏธ๋ก ํด์๋ฉ๋๋ค. ๋๋ถ์ ์ฝ๋๊ฐ ํจ์ฌ ๊ฐ๊ฒฐํ๊ณ ์ง๊ด์ ์ผ๋ก ๋ณํฉ๋๋ค.
3๏ธโฃ ๊ณผ๊ฑฐ์๋ ์ด๋ป๊ฒ ๊ตฌํํ์๊น? ๐ฐ๏ธ
์ด ๋ฌธ๋ฒ์ด ์๋ ์์ ์๋ ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ์ต๋๋ค. ํจ์ฌ ๋ฒ๊ฑฐ๋กญ์ฃ .
๋ฐฉ๋ฒ 1: ์ผํญ ์ฐ์ฐ์ ์ฌ์ฉ
๐ก ์กฐ๊ฑด์ด ๊ฐ๋จํ ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
null์ ๋ฃ์ผ๋ฉด Flutter๊ฐ ๋น ๊ณต๊ฐ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ด์ฉํ์ง๋ง, ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๊ณ ๋ฆฌ์คํธ์ null์ด ํฌํจ๋ ์ ์์ต๋๋ค.
children: [
VideoPlayer(videoPlayerController!),
showControls ? Container(color: Colors.black.withOpacity(0.5)) : SizedBox.shrink(), // false์ผ ๋ ๋น ์์ ฏ์ ๋ฃ์ด์ผ ํจ
]
๋ฐฉ๋ฒ 2: ๋ฆฌ์คํธ๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค๊ณ add ๋ฉ์๋ ์ฌ์ฉ
๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ด์์ง๋ง, ์์ ฏ ํธ๋ฆฌ ์์์ ๋ก์ง์ด ๋ถ๋ฆฌ๋์ด ์ฝ๋๊ฐ ์ฅํฉํด์ง๋๋ค.
List<Widget> _buildChildren() {
final children = <Widget>[
VideoPlayer(videoPlayerController!),
];
if (showControls) {
children.add(Container(color: Colors.black.withOpacity(0.5)));
}
return children;
}
// ... build ๋ฉ์๋ ์์์ ...
Column(
children: _buildChildren(),
)
๐ก ๊ฒฐ๋ก :
collection if๋ ์ด ๋ชจ๋ ๋ฒ๊ฑฐ๋ก์์ ํ ์ค๋ก ํด๊ฒฐํด์ฃผ๋ ๋งค์ฐ ์ ์ฉํ ๊ธฐ๋ฅ์ ๋๋ค.collection for๋spread(...)์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋์ฑ ๊ฐ๋ ฅํ๊ณ ๊น๋ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
๐ ๋ง๋ฌด๋ฆฌ
โ ์ค๋ ๋ฐฐ์ด ๊ฒ
- ์ปฌ๋ ์ ์ ์ด ํ๋ฆ: Dart 2.3๋ถํฐ ๋์ ๋ ๊ฐ๋ ฅํ ๋ฌธ๋ฒ
- collection if: ์กฐ๊ฑด์ ๋ฐ๋ผ ์ปฌ๋ ์ ์ ์์๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐ
- ๋ฌธ vs ํํ์: Statement์ Expression์ ์ฐจ์ด์
- ์ฝ๋ ๊ฐ๊ฒฐ์ฑ: ๊ณผ๊ฑฐ ๋ฐฉ๋ฒ ๋๋น ํจ์ฌ ๊ฐ๊ฒฐํ๊ณ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋ ์์ฑ ๊ฐ๋ฅ
๐ ์ถ๊ฐ ํ์ต ์ฃผ์
collection for: ๋ฐ๋ณต๋ฌธ์ ์ปฌ๋ ์ ๋ด๋ถ์์ ์ฌ์ฉspread operator(...): ์ปฌ๋ ์ ์ ํผ์ณ์ ์์ ์ถ๊ฐcollection if-else: ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ์์ ์ถ๊ฐ
๋๊ธ๋จ๊ธฐ๊ธฐ