์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- REACT
- Streamlit๊ธฐ์ด
- streamlit
- java
- ์๋ฐ์คํฌ๋ฆฝํธ ๊ณต๋ถ
- JavaScript
- ์๋ฐํ๋ก๊ทธ๋๋ฐ
- ์๋ฐ์คํฌ๋ฆฝํธ
- ํ์ด์ฌ๊ณต๋ถ
- Pandas
- serverless
- ์๋ฐ
- ์น๋์๋ณด๋ ๊ธฐ์ด
- Flutter
- ์๋ฐ์ด๋ณด
- ์๋ฐ๊ณต๋ถ
- ํ์ด์ฌ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ํ๋ค์ค
- ํ๋ค์ค๊ณต๋ถ
- ์คํธ๋ฆผ๋ฆฟ
- ์๋๋ก์ด๋ ์ฑ ๊ฐ๋ฐ
- Android
- ์๋๋ก์ด๋ ์คํ๋์ค
- ์๋ฐ๊ธฐ์ด
- MySQL
- ์น๋์๋ณด๋ ์ ์
- ์คํธ๋ฆผ๋ฆฟ ๊ธฐ๋ณธ
- RESTful API
- db
- Today
- Total
ruriruriya
[Flutter] Flutter ๋ ์ด์์ ์ดํดํ๊ธฐ(Layout) ๋ณธ๋ฌธ
[Flutter] Flutter ๋ ์ด์์ ์ดํดํ๊ธฐ(Layout)
๋ฃจ๋ฆฌ์ผใ 2025. 2. 18. 16:11
1. Flutter์์ ๋ ์ด์์์ด๋?
Flutter๋ UI๋ฅผ ๊ตฌ์ฑํ๋ ์์ ฏ(toolkit)์ด๋ฉฐ, ๋๋ถ๋ถ์ ์์ ์ ์์ ฏ์ ์ด์ฉํ์ฌ ๋ ์ด์์์ ๋ง๋๋ ๋ฐ ์ง์ค๋๋ค. ๋ชจ๋ ์์(ํ ์คํธ, ์ด๋ฏธ์ง, ์์ด์ฝ, ๋ฒํผ ๋ฑ)๋ ์์ ฏ์ด๋ฉฐ, ๋ณด์ด์ง ์๋ ์์์ธ ํ(Row), ์ด(Column), ๊ทธ๋ฆฌ๋(Grid) ๋ฑ๋ ์์ ฏ์ด๋ค.
์์ ฏ์ ์กฐํฉํ์ฌ ๋ ๋ณต์กํ UI๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉฐ, ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๋ชจ๋ Flutter ๋ ์ด์์์ด ๊ตฌ์ฑ๋๋ค.
2. ๋ ์ด์์์ ํต์ฌ ๊ฐ๋
2.1. Constraints
Flutter์์ ๋ ์ด์์์ ๋ถ๋ชจ-์์ ๊ด๊ณ๋ก ์ด๋ฃจ์ด์ง๋ฉฐ, ๋ถ๋ชจ ์์ ฏ์ ์์ ์์ ฏ์๊ฒ Constaraints๋ฅผ ์ ๋ฌํ๋ค.
- Constaraints์ ์ต์ ๋ฐ ์ต๋ ๋๋น, ์ต์ ๋ฐ ์ต๋ ๋์ด๋ฅผ ํฌํจํ๋ 4๊ฐ์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
- ์์ ์์ ฏ์ ํด๋น Constaraints ๋ด์์ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๊ณ ๋ถ๋ชจ์๊ฒ ๋ฐํํ๋ค.
- ๋ถ๋ชจ๋ ์์ ์์ ฏ์ ์์น๋ฅผ ์ค์ ํ๋ค.
- ์ด ๊ณผ์ ์ "Constaraints์ ๋ด๋ ค๊ฐ๊ณ ํฌ๊ธฐ๋ ์ฌ๋ผ๊ฐ๋ฉฐ, ๋ถ๋ชจ๊ฐ ์์น๋ฅผ ์ค์ ํ๋ค(Constraints go down. Sizes go up. Parent sets position)."๋ก ์์ฝ๋๋ค.
2.2. Box Types
Flutter์ ๋ชจ๋ ์์ ฏ์ RenderBox๋ฅผ ํตํด ๋ ๋๋ง๋๋ค.
๋ฐ์ค๋ 3๊ฐ์ง ์ ํ์ด ์๋ค.
- ๊ฐ๋ฅํ ํ ํฌ๊ฒ ํ์ฅํ๋ ๋ฐ์ค (์: Center, ListView)
- ์์ ํฌ๊ธฐ์ ๋ง์ถฐ์ง๋ ๋ฐ์ค (์: Transform, Opacity)
- ํน์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ ๋ฐ์ค (์: Image, Text)
Container ์์ ฏ์ ์ค์ ์ ๋ฐ๋ผ ๋์์ด ๋ฌ๋ผ์ง ์ ์๋ค.
3. ๊ธฐ๋ณธ ๋ ์ด์์ ๊ตฌ์ฑ ๋ฐฉ๋ฒ
3.1. ๋จ์ผ ์์ ฏ ๋ฐฐ์นํ๊ธฐ
๋จ์ผ ์์ ฏ์ ๋ฐฐ์นํ๋ ค๋ฉด Center, Padding ๋ฑ์ ์ฌ์ฉํ๋ค.
Widget build(BuildContext context) {
return Center(
child: BorderedImage(),
);
}
3.2 Container ํ์ฉํ๊ธฐ
Container๋ ์ฌ๋ฌ ๊ธฐ๋ฅ(๋ ์ด์์, ํ์ธํ , ํฌ์ง์ ๋, ํฌ๊ธฐ ์กฐ์ )์ ์ ๊ณตํ๋ ์์ ฏ์ผ๋ก, padding๊ณผ margin์ ์ถ๊ฐํ ๋ ์ ์ฉํ๋ค.
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.all(16.0),
child: BorderedImage(),
);
}
3.3. ์ฌ๋ฌ ์์ ฏ์ ์์ง/์ํ์ผ๋ก ๋ฐฐ์นํ๊ธฐ
์ฌ๋ฌ ์์ ฏ์ ์์ง ๋๋ ์ํ์ผ๋ก ๋ฐฐ์นํ๋ ค๋ฉด Column๊ณผ Row ์์ ฏ์ ์ฌ์ฉํ๋ค.
Widget build(BuildContext context) {
return Row(
children: [
BorderedImage(),
BorderedImage(),
BorderedImage(),
],
);
}
Column๊ณผ Row ์กฐํฉํ์ฌ ๋ฐฐ์นํ๊ธฐ
Widget build(BuildContext context) {
return Row(
children: [
Column(
children: [
BorderedImage(),
Text('Dash 1'),
],
),
Column(
children: [
BorderedImage(),
Text('Dash 2'),
],
),
Column(
children: [
BorderedImage(),
Text('Dash 3'),
],
),
],
);
}
4. ์ ๋ ฌ๊ณผ ํฌ๊ธฐ ์กฐ์
4.1. ์์ ฏ ์ ๋ ฌํ๊ธฐ
์์ ฏ ์ ๋ ฌ์ mainAxisAlignment์ crossAxisAlignment๋ฅผ ์ฌ์ฉํ๋ค.
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
BorderedImage(),
BorderedImage(),
BorderedImage(),
],
);
}
4.2. Expanded๋ก ํฌ๊ธฐ ์กฐ์ ํ๊ธฐ
์์ ฏ์ด ํ๋ฉด์ ์ด๊ณผํ ๊ฒฝ์ฐ Expanded๋ฅผ ์ฌ์ฉํ์ฌ ํฌ๊ธฐ๋ฅผ ์๋์ผ๋ก ์กฐ์ ํ ์ ์๋ค.
Widget build(BuildContext context) {
return Row(
children: [
Expanded(child: BorderedImage()),
Expanded(flex: 2, child: BorderedImage()), // 2๋ฐฐ ํฌ๊ธฐ
Expanded(child: BorderedImage()),
],
);
}
5. ์คํฌ๋กค ๊ฐ๋ฅํ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
5.1. ๊ธฐ๋ณธ ListView
ListView๋ ์คํฌ๋กค์ด ๊ฐ๋ฅํ ์ปฌ๋ผํ ๋ ์ด์์์ด๋ค.
Widget build(BuildContext context) {
return ListView(
children: [
BorderedImage(),
BorderedImage(),
BorderedImage(),
],
);
}
5.2. ListView.builder ์ฌ์ฉํ๊ธฐ
์์ดํ ๊ฐ์๊ฐ ๋ง๊ฑฐ๋ ๋์ ์ผ๋ก ์์ฑํด์ผ ํ ๋๋ ListView.builder๋ฅผ ์ฌ์ฉํ๋ค.
final List<ToDo> items = Repository.fetchTodos();
Widget build(BuildContext context) {
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, idx) {
var item = items[idx];
return Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(item.description),
Text(item.isComplete ? 'โ
' : 'โ'),
],
),
);
},
);
}
6. ๋ฐ์ํ ๋ ์ด์์ ๋ง๋ค๊ธฐ
6.1 LayoutBuilder ์ฌ์ฉํ๊ธฐ
LayoutBuilder๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ ์ด์์์ ์ ์ฉํ ์ ์๋ค.
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
if (constraints.maxWidth <= 600) {
return _MobileLayout();
} else {
return _DesktopLayout();
}
},
);
}
Flutter์์ ๋ ์ด์์์ ๊ตฌ์ฑํ๋ ๊ฒ์ ์ ์ฝ(Constraints), ๋ฐ์ค(Box Types), ์ ๋ ฌ(Alignment), ํฌ๊ธฐ ์กฐ์ (Sizing), ์คํฌ๋กค(Scrolling), ๋ฐ์ํ ๋์์ธ(Adaptive Layouts) ๋ฑ์ ํ์ฉํ๋ ๊ณผ์ ์ด๋ค. ๋ค์ํ ์์ ฏ์ ์กฐํฉํ์ฌ ์ํ๋ ๋ ์ด์์์ ๊ตฌํํ ์ ์์ผ๋ฉฐ, Expanded, ListView.builder, LayoutBuilder ๋ฑ์ ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด ๋ณด๋ค ์ ์ฐํ UI๋ฅผ ๋ง๋ค ์ ์๋ค.
'๐ฑFlutter > Flutter Framework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Flutter] ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ Provider ํจํค์ง (0) | 2025.02.25 |
---|---|
[Flutter] ๊ธฐ๋ณธ ์ํ ๊ด๋ฆฌ (State Management) (0) | 2025.02.22 |
[Flutter] ๊ธฐ๋ณธ ๋ ์ด์์์ ๊ตฌ์ฑํ๋ Scaffold ์์ ฏ (0) | 2025.01.20 |
[Flutter] build ๋ฉ์๋ (0) | 2025.01.17 |
[Flutter] ์์ ฏ์ ๋ํด์(Widget) (0) | 2025.01.15 |