๊ฐ์
์ต๊ทผ์ ํ๋ฌํฐ Stack ๊ด๋ จ๋ ์ค๋ฅ๋ฅผ ์ฌํ๊ฒ ๊ฒช์๋ค.
์๋ฌด๋๋ ๊ทธ๋์ Stack์ ๋ํ ์ดํด๋๊ฐ ๋ฎ์์ ๊ทธ๋ฐ์ง ๋น ๋ฅด๊ฒ ๋ฌธ์ ํด๊ฒฐ์ ํ๋๋ฐ ์ด๋ ค์์ ๊ฒช์ ๊ฒ ๊ฐ๋ค.
๊ทธ๋์ Stack์ ๊ธฐ๋ณธ ์๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ์ฐพ์๋ณด๊ฒ ๋์๊ณ , ๋ด ๋๋ฆ๋๋ก ๊ฐ๋
๊ณผ ์์๋ฅผ ์ ๋ฆฌํ๊ฒ ๋์๋ค.
# Flutter Stack ์์ ฏ์ ํฌ๊ธฐ ๊ฒฐ์ ๋ฐฉ์ ์ดํดํ๊ธฐ
Flutter์์ Stack์ ์ฌ๋ฌ ์์ ฏ์ ๊ฒน์ณ์ ๋ฐฐ์นํ ์ ์๊ฒ ํด์ฃผ๋ ๋ ์ด์์ ์์ ฏ์ด๋ค. Stack์ด ์ด๋ป๊ฒ ์์ ์ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๋์ง ์์ธํ ์์๋ณด์.
Stack์ ๊ธฐ๋ณธ ์๋ฆฌ
Stack์ ํฌ๊ธฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก non-positioned ์์๋ค์ ์ํด ๊ฒฐ์ ๋๋ค. ์ด๋ non-positioned ์์๋ค์ด ์๋ค๋ฉด, Positioned๊ฐ ์ ์ฉ๋ ์์๋ค์ Stack์ ํฌ๊ธฐ ๊ฒฐ์ ์ ์ํฅ์ ์ฃผ์ง ์๊ณ Stack ์์์์ ์์น๋ฅผ ์ง์ ํ๊ฒ ๋๋ค.
1. ๊ธฐ๋ณธ์ ์ธ ์์ (Positioned & non-positioned)
Stack(
children: [
Container(
width: 100,
height: 100,
color: Colors.blue,
),
Positioned(
top: 10,
left: 10,
child: Container(
width: 50,
height: 50,
color: Colors.red,
),
),
],
)
์ด ๊ฒฝ์ฐ Stack์ ํฌ๊ธฐ๋ ํ๋์ Container(100x100)์ ์ํด ๊ฒฐ์ ๋๋ค. ๋นจ๊ฐ์ Container๋ Positioned๋ก ๊ฐ์ธ์ ธ ์์ด์ ํฌ๊ธฐ ๊ฒฐ์ ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
2. non-positioned ์์๋ง ์๋ ๊ฒฝ์ฐ
Stack(
children: [
Container(
width: 100,
height: 100,
color: Colors.blue,
),
Container(
width: 150,
height: 80,
color: Colors.green,
),
Container(
width: 200,
height: 50,
color: Colors.red,
),
],
)
์ด ๊ฒฝ์ฐ Stack์ non-positioned ์์๋ค ์ค ๊ฐ์ฅ ํฐ ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ๋๋ค.
- ๋๋น: 200 (๋นจ๊ฐ์ Container)
- ๋์ด: 100 (ํ๋์ Container)
3. Positioned ์์๋ง ์๋ ๊ฒฝ์ฐ
Stack(
children: [
Positioned(
top: 0,
left: 0,
width: 100,
height: 100,
child: Container(color: Colors.blue),
),
],
)
์ด ๊ฒฝ์ฐ์๋ Stack์ด ๊ธฐ์ค์ผ๋ก ์ผ์ non-positioned ์์ ฏ์ด ์์ผ๋ฏ๋ก Stack์ ํฌ๊ธฐ๋ ๋ถ๋ชจ ์์ ฏ์ ํฌ๊ธฐ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค. ๋ง์ฝ ๋ถ๋ชจ ์์ ฏ๋ Listview ๊ฐ์ ์์ ฏ์ผ๋ก ๋์ด์๋ค๋ฉด hasSize ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
4. fit ์์ฑ ํ์ฉํ๊ธฐ
Stack์ fit ์์ฑ์ ์ฌ์ฉํ๋ฉด non-positioned ์์๋ค์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์๋ค.
Stack(
fit: StackFit.expand, // ์์์ Stack ํฌ๊ธฐ์ ๋ง์ถฐ ํ์ฅ
children: [
Container(color: Colors.blue),
Positioned(
top: 10,
left: 10,
child: Container(
width: 50,
height: 50,
color: Colors.red,
),
),
],
)
fit ์์ฑ์ ์ข ๋ฅ:
- loose: ๊ธฐ๋ณธ๊ฐ, ์์์ด ์ํ๋ ํฌ๊ธฐ๋๋ก
- expand: ๊ฐ๋ฅํ ์ต๋ ํฌ๊ธฐ๋ก ํ์ฅ
- passthrough: ๋ถ๋ชจ์ ์ ์ฝ์กฐ๊ฑด์ ๊ทธ๋๋ก ์ ๋ฌ
5. ์ค์ ํ์ฉ ์์: ์ค๋ฒ๋ ์ด ํจ๊ณผ
์ด๋ฏธ์ง ์์ ๊ทธ๋ผ๋ฐ์ด์ ์ค๋ฒ๋ ์ด๋ฅผ ๋ฃ๋ ๊ฒฝ์ฐ
Stack(
children: [
Image.asset(
'assets/background.jpg',
width: double.infinity,
height: 200,
fit: BoxFit.cover,
),
Positioned.fill(
child: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
Colors.transparent,
Colors.black.withOpacity(0.7),
],
),
),
),
),
Positioned(
bottom: 16,
left: 16,
child: Text(
'์ ๋ชฉ',
style: TextStyle(
color: Colors.white,
fontSize: 24,
),
),
),
],
)
6. ๋ฒํผ ํจ๊ณผ ๊ตฌํํ๊ธฐ
ํฐ์น ํจ๊ณผ๊ฐ ์๋ ์นด๋ ๋ฒํผ์ ๋ง๋๋ ๊ฒฝ์ฐ
Stack(
children: [
Container(
padding: EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.1),
blurRadius: 8,
),
],
),
child: Text('์นด๋ ๋ด์ฉ'),
),
Positioned.fill(
child: Material(
color: Colors.transparent,
child: InkWell(
borderRadius: BorderRadius.circular(8),
onTap: () => print('ํญ!'),
),
),
),
],
)
์ฃผ์ํ ์
1. ํฌ๊ธฐ ์ ์ฝ ์๋ Stack ์ฌ์ฉ ์ฃผ์
- Stack์ ListView๋ Column ์์์ ์ฌ์ฉํ ๋๋ ๋ช ์์ ์ธ ํฌ๊ธฐ๋ ์ ์ฝ์ด ํ์ํ ์ ์๋ค
- non-positioned ์์์ด ์์ผ๋ฉด Stack์ด ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ ์ ์๋ค
2. Positioned.fill ํ์ฉ
- ์์์ Stack ์ ์ฒด ์์ญ์ ์ฑ์ฐ๊ณ ์ถ์ ๋๋ Positioned.fill ์ฌ์ฉ
- ์ค๋ฒ๋ ์ด๋ ํฐ์น ํจ๊ณผ ๊ตฌํํ ๋ ์ ์ฉํ๋ค
3. z-index
- ์์๋ค์ ์ ์ธ๋ ์์๋๋ก ์์ธ๋ค
- ๋์ค์ ์ ์ธ๋ ์์์ด ์์ ํ์๋๋ค
4. Positioned ์์ ฏ ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
- top/bottom ๋๋ left/right๋ฅผ ๋์์ ์ฌ์ฉํ๋ฉด ์์ ฏ์ ํฌ๊ธฐ๊ฐ ๊ฐ์ ๋ก Stack์ ํฌ๊ธฐ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค (์ด ๊ฒฝ์ฐ์ Positioned ์๋์ Center์์ ฏ์ผ๋ก ํ ๋ฒ ๋ ๊ฐ์ธ์ฃผ๋ฉด ๋๋ค.)
- width/height๋ฅผ ์ง์ ์ง์ ํ ๋๋ top/bottom ๋๋ left/right๋ฅผ ๋์์ ์ฌ์ฉํ๋ฉด ์ ๋๋ค
5. ์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ
- Stack ๋ด๋ถ์ ๋ชจ๋ ์์๋ค์ ํญ์ ๋ ๋๋ง ๋๋ค
- ๋ณด์ด์ง ์๋ ๋ถ๋ถ๋ ๋ ๋๋ง ๋๋ฏ๋ก, ๋ณต์กํ ์์ ฏ์ ๋ง์ด ์์ผ๋ฉด ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์๋ค
6. ์ค๋ฒํ๋ก์ฐ ์ฃผ์
- Positioned ์์ ฏ์ ์์น๋ ํฌ๊ธฐ๋ก ์ธํด Stack์ ๊ฒฝ๊ณ๋ฅผ ๋ฒ์ด๋ ์ ์๋ค
- ํ์ํ ๊ฒฝ์ฐ ClipRect ๋ฑ์ ์ฌ์ฉํ์ฌ ์ค๋ฒํ๋ก์ฐ๋ฅผ ์ ์ดํด์ผ ํ๋ค
7. ์ ๊ทผ์ฑ ๊ณ ๋ ค
- ๊ฒน์ณ์ง ์์ ฏ๋ค์ ์์๊ฐ ์คํฌ๋ฆฐ ๋ฆฌ๋์ ์ฝ๊ธฐ ์์์ ์ํฅ์ ์ค๋ค
- ์ ๊ทผ์ฑ์ ๊ณ ๋ คํ ๋๋ ์์ ฏ์ ๋ฐฐ์น ์์์ ์ฃผ์ํด์ผ ํ๋ค
์ ๋ฆฌ
Stack์ ํฌ๊ธฐ ๊ฒฐ์ ๊ท์น์ ์ดํดํ๋ฉด ๋ณต์กํ UI๋ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค:
- non-positioned ์์๋ค์ด Stack์ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๋ค
- Positioned ์์๋ค์ ๊ฒฐ์ ๋ Stack ํฌ๊ธฐ ๋ด์์ ๋ฐฐ์น๋๋ค
- fit ์์ฑ์ผ๋ก ์์๋ค์ ํฌ๊ธฐ ์กฐ์ ์ด ๊ฐ๋ฅํ๋ค
์ด๋ฌํ ํน์ฑ์ ์ ํ์ฉํ๋ฉด ์ค๋ฒ๋ ์ด, ๋ฑ์ง, ๋ฒํผ ํจ๊ณผ ๋ฑ ๋ค์ํ UI ์์๋ฅผ ๊ตฌํํ ์ ์๋ค.