๐ญ ์ธ๋์ผ์ดํฐ์ ๋ฒํผ ์ฌ์ด ๊ฐ๊ฒฉ์ด ์กฐ์ ๋์ง ์๋ ์ด์
Flutter์ PageView์ SmoothPageIndicator๋ฅผ ์ฌ์ฉํ์ฌ ์จ๋ณด๋ฉ ํ๋ฉด์ ๊ตฌํํ๋ ์ค, ์ธ๋์ผ์ดํฐ์ ๋ฒํผ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ค์ด๋ ค๊ณ ํด๋ ๋ณ๊ฒฝ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- Padding.only(bottom: 2)๋ก ์ค์ ํด๋ ๊ฐ๊ฒฉ์ด ์ค์ด๋ค์ง ์์.
- SafeArea๋ฅผ ๊ฐ์ธ๋ ๋ฐฉ์ ๋ณ๊ฒฝ์๋ ๋ณํ ์์.
- Column ๋ด๋ถ ์ฌ๋ฐฑ์ด ์๋์ผ๋ก ์ถ๊ฐ๋๋ ๊ฒ์ผ๋ก ๋ณด์.
๐ ์์ธ ๋ถ์: Flutter์ Column ๋ฐฐ์น ๋ฐฉ์๊ณผ SafeArea์ ์ํฅ
1. Column์ ๊ธฐ๋ณธ์ ์ธ ๋ฐฐ์น ๋ฐฉ์
Column(
children: [
Expanded(child: PageView(...)), // โ
PageView๊ฐ ํ์ฅ๋จ
_buildPageIndicator(), // โ ์ฌ๋ฐฑ์ด ์๋์ผ๋ก ์ถ๊ฐ๋จ
SafeArea(child: _buildBottomButtons()), // โ SafeArea๊ฐ ์ถ๊ฐ ํจ๋ฉ ์ ์ฉ
],
);
Flutter์ Column์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต๋ํ์ ๊ณต๊ฐ์ ์ฐจ์งํ๋ ค๋ ์ฑ์ง์ด ์๋ค.
์ฆ, mainAxisSize: MainAxisSize.max๊ฐ ๊ธฐ๋ณธ๊ฐ์ด๋ฏ๋ก ๋ด๋ถ ์์ ฏ๋ค ์ฌ์ด์ ๋ถํ์ํ ์ฌ๋ฐฑ์ด ์๋ ์ถ๊ฐ๋ ์ ์๋ค.
2. SafeArea๊ฐ ๋ถํ์ํ ํจ๋ฉ์ ์ถ๊ฐ
SafeArea(
child: Column(
children: [
_buildPageIndicator(),
_buildBottomButtons(),
],
),
);
SafeArea๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ํํธ ํค๋ณด๋, ๋ค๋น๊ฒ์ด์
๋ฐ, ์ํ ๋ฐ ๋ฑ์ ๊ณ ๋ คํ์ฌ ์ถ๊ฐ์ ์ธ padding์ ์ ์ฉํ๋ค.
์ด๋, SafeArea๊ฐ ์ ์ฒด Column์ ๊ฐ์ธ๊ณ ์์ผ๋ฉด ๋ถํ์ํ ์ฌ๋ฐฑ์ด ์๊ธฐ๊ฒ ๋๋ค.
3. PageView์ Expanded ์ฌ์ฉ์ผ๋ก ์ธํด ํ๋จ ์์๊ฐ ๋ฐ๋ ค๋๋ ๋ฌธ์
Column(
children: [
Expanded(child: PageView(...)), // โ
PageView๊ฐ ์ต๋ํ ํ์ฅ๋จ
_buildPageIndicator(), // โ PageView๊ฐ ํ์ฅ๋๋ฉด์ ํ๋จ ์์๊ฐ ๋ฐ๋ ค๋จ
_buildBottomButtons(),
],
);
Expanded(child: PageView(...))๋ฅผ ์ฌ์ฉํ๋ฉด PageView๊ฐ ๊ฐ๋ฅํ ๋ชจ๋ ๊ณต๊ฐ์ ์ฐจ์งํ๋ ค๊ณ ํ๋ฉด์, ํ๋จ ์ธ๋์ผ์ดํฐ์ ๋ฒํผ์ด ์๋์ผ๋ก ๋ฐ๋ ค๋๋ฒ๋ฆผ.
mainAxisSize ๋?
MainAixSize๋ Cloumn/Row ์์ ฏ์์ ๋ฉ์ธ์ถ์ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๋ ์์ฑ์ด๋ค.
Column(
mainAxisSize: MainAxisSize.max, // ๊ธฐ๋ณธ๊ฐ์ด๋ฏ๋ก ์ค์ ํ์ง ์์๋ Max
children: [
Container(height: 300, color: Colors.red),
Container(height: 300, color: Colors.blue),
],
),
๋ถ๋ชจ๊ฐ Scaffold๋ผ๋ฉด, Column์ ์ ์ฒด ํ๋ฉด ๋์ด๋ฅผ ์ฐจ์ง (896px ๊ธฐ์ค).
→ Container ๋ ๊ฐ์ ํฉ์ 600px์ด์ง๋ง, ๋จ์ ๊ณต๊ฐ๋ ์ฐจ์งํ์ฌ ์ด 896px์ด ๋จ.
Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(height: 300, color: Colors.red),
Container(height: 300, color: Colors.blue),
],
),
Column์ ๋์ด๋ 600px๋ก ์ ํ๋จ.
→ Scaffold์ ์ ์ฒด ๋์ด(896px)๊ฐ ์๋๋ผ๋ Column์ ์์ ์์ ฏ๋ค์ ๋์ด(600px)๋งํผ๋ง ์ฐจ์ง.
→ min์ ์ค์ ํ๋ฉด ์ต์ ํฌ๊ธฐ(min)๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์์ ฏ๋ค์ ํฌ๊ธฐ์ ๋ง๊ฒ Column/Row๊ฐ ์ถ์๋จ
โ ํด๊ฒฐ๋ ์ฝ๋
Column(
children: [
Expanded(
child: PageView(
controller: pageController,
onPageChanged: (index) {
context.read<OnboardingCubit>().changePage(index);
},
children: const [
OnboardingPage(title: "ํ๋ จ ๊ด๋ฆฌ๋ฅผ ํ ๋ฒ์", description: "ํ๋ จ ๊ณํ๋ถํฐ ์ค์ผ์ค ๊ด๋ฆฌ๊น์ง"),
OnboardingPage(title: "์ถ๊ฒฐ ๊ด๋ฆฌ๋ ๊ฐํธํ๊ฒ", description: "์ถ์ ํํฉ ๊ด๋ฆฌ๋ถํฐ ํ์ ์ ๋ณด ํ์ธ๊น์ง"),
OnboardingPage(title: "AI๋ก ๋ถ์ํ๋ ํ๋ จ ํํฉ", description: "์ฐธ์ฌ ๋ง์กฑ๋๋ถํฐ ํ๋ จ ํํฉ๊น์ง"),
OnboardingPage(title: "๋ง์ถคํ ํ๋ จ ๋
ธํธ", description: "ํ๋ จ ๋์๋ณ ๊ด๋ฆฌ๋ถํฐ ์ํ์ค ๊ตฌ์ฑ๊น์ง"),
OnboardingPage(title: "Your Play\nYour Story", description: ""),
],
),
),
SafeArea(
child: Column(
mainAxisSize: MainAxisSize.min, // โ
๋ถํ์ํ ์ฌ๋ฐฑ ๋ฐฉ์ง
children: [
_buildPageIndicator(pageController), // โ
์ธ๋์ผ์ดํฐ์ ๋ฒํผ์ ํ๋์ Column์ผ๋ก ๋ฌถ์
_buildBottomButtons(context),
],
),
),
],
);
โ Column์ mainAxisSize: MainAxisSize.min์ ์ค์ ํ์ฌ ๋ถํ์ํ ์ฌ๋ฐฑ์ ์ ๊ฑฐ
- ๊ธฐ๋ณธ์ ์ผ๋ก Column์ mainAxisSize: MainAxisSize.max์ด๋ฉฐ, ์ด๋ก ์ธํด ์๋ ์ฌ๋ฐฑ์ด ์ถ๊ฐ๋ ์ ์์.
โ SafeArea๋ ํ๋จ ๋ฒํผ๋ง ๊ฐ์ธ๋๋ก ์กฐ์
- SafeArea๊ฐ ์ ์ฒด Column์ ๊ฐ์ธ๋ฉด ์ถ๊ฐ์ ์ธ padding์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์.
โ PageView๋ฅผ Expanded ๋์ Flexible๋ก ๊ฐ์ธ ํ๋จ ์์๊ฐ ๋ฐ๋ ค๋๋ ํ์ ๋ฐฉ์ง
- Expanded๋ ๊ฐ๋ฅํ ๋ชจ๋ ๊ณต๊ฐ์ ์ฐจ์งํ๋ ค ํ์ง๋ง, Flexible์ ์ ์ ํ ๊ณต๊ฐ๋ง ์ฐจ์งํ๋๋ก ์ ํ.
โ UI ๋ฐฐ์น ์ด์๊ฐ ๋ฐ์ํ๋ฉด ์๋ ์ฌํญ์ ๋จผ์ ์ฒดํฌํ์!
- Column ๋ด๋ถ์์ ๋ถํ์ํ ์ฌ๋ฐฑ์ด ์ถ๊ฐ๋์ง ์๋์ง ํ์ธ (mainAxisSize: MainAxisSize.min ์ ์ฉ)
- SafeArea๊ฐ ๋ถํ์ํ padding์ ์ถ๊ฐํ๊ณ ์์ง ์์์ง ํ์ธ
- PageView๊ฐ Expanded๋ก ์ธํด ํ๋จ ์์๋ฅผ ๋ฐ์ด๋ด๊ณ ์์ง ์์์ง ํ์ธ
- Padding์ด ์๋ํ ๊ฐ๋ณด๋ค ํฌ๊ฒ ์ ์ฉ๋์ด ์๋์ง ํ์ธ
'Flutter' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DTO ์์ Date ํ์ ๊ฒ์ฆํ๊ธฐ (0) | 2025.02.25 |
---|---|
BaseResponseDto๋ฅผ ํตํด DTO ์ค๋ณต ์ฝ๋ ์ค์ด๊ธฐ (0) | 2025.02.24 |
์ด๋ฒคํธ๋ฅผ ํน์ ์๊ฐ๋ง ๊ธฐ๋ค๋ฆฌ๊ณ ์ด๊ณผ์ ์๋ฌ์ฒ๋ฆฌํ๊ธฐ (0) | 2025.02.12 |
Theme.of(context) ์ฌ์ฉ์ ์ฃผ์ํ ์ (0) | 2025.02.11 |
Freezed ํจํค์ง์์ Equatable ํจํค์ง๋ก ๋ฐ๊พผ ์ด์ (0) | 2025.02.10 |