์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 | 31 |
- ์๋๋ก์ด๋ ์คํ๋์ค
- ํ๋ค์ค๊ณต๋ถ
- Pandas
- ํ๋ค์ค
- ํ์ด์ฌ๊ณต๋ถ
- ์๋ฐ์คํฌ๋ฆฝํธ
- JavaScript
- java
- ์คํธ๋ฆผ๋ฆฟ ๊ธฐ๋ณธ
- ์๋ฐ๊ธฐ์ด
- Flutter
- ์น๋์๋ณด๋ ๊ธฐ์ด
- ์คํธ๋ฆผ๋ฆฟ
- ์๋ฐ์ด๋ณด
- streamlit
- ์น๋์๋ณด๋ ์ ์
- serverless
- ํ์ด์ฌ
- ์๋ฐ๊ณต๋ถ
- MySQL
- ์๋ฐํ๋ก๊ทธ๋๋ฐ
- Streamlit๊ธฐ๋ณธ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- Android
- db
- ์๋ฐ์คํฌ๋ฆฝํธ ๊ณต๋ถ
- RESTful API
- Streamlit๊ธฐ์ด
- ์๋๋ก์ด๋ ์ฑ ๊ฐ๋ฐ
- ์๋ฐ
- Today
- Total
ruriruriya
[Flutter] ์์ ฏ์ ๋ํด์(Widget) ๋ณธ๋ฌธ
ํ๋ฌํฐ์์ ์์ ฏ(Widget)์ด๋?
ํ๋ฌํฐ ์ดํ๋ฆฌ์ผ์ด์
์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ฑํ๋ ๊ธฐ๋ณธ ์์์ด๋ค.
๊ฐ ์์ ฏ์ ํ
์คํธ๋ ๋ฒํผ ๊ฐ์ ๋ฌผ๋ฆฌ์ ์์๋ถํฐ ๋ ์ด์์ ํจ๊ณผ๊น์ง ์ธํฐํ์ด์ค์ ๋ชจ๋ ์ธก๋ฉด์ ๊ตฌํํ๋ ๊ณณ์ ์ฌ์ฉ๋๋ค.
์์ ฏ ๊ณ์ธต ๊ตฌ์กฐ
์์ ฏ์ ๊ตฌ์ฑ(Composition)์ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ํ์ฑํ๋ค.
๊ฐ ์์ ฏ์ ๋ถ๋ชจ ์์ ฏ ๋ด๋ถ์ ์ค์ฒฉ๋๋ฉฐ, ๋ถ๋ชจ๋ก๋ถํฐ Context๋ฅผ ์ ๋ฌ ๋ฐ๋๋ค.
์ด ๊ตฌ์กฐ๋ ๋ฃจํธ ์์ ฏ๊น์ง ์ฐ๊ฒฐ๋๋ค.
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp( // ๋ฃจํธ ์์ ฏ
home: Scaffold(
appBar: AppBar(
title: const Text('My Home Page'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('Hello, World!'),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () {
print('Click!');
},
child: const Text('A button'),
),
],
),
),
),
);
}
}
์์ ฏ ๊ตฌ์ฑ(Widget Composition)
ํ๋ฌํฐ๋ ๋ชจ๋ ๊ฒ์ด ์์ ฏ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค๊ณ ํ ์ ์๋ค.
์์ ๋จ์์ ์์ ฏ์ ์ฌ๋ฌ ๊ฐ ์กฐํฉํด์ UI๋ฅผ ๊ตฌํํ๋ค.
๋ ์ด์์ ์์ ฏ(Padding, Alignment, Row, Column, Grid ๋ฑ)
์ด๋ฐ ์์ ฏ์ ๋์์ธ ์์๊ฐ ์์ด ๋ ์ด์์์ ๋ด๋นํ๋ค. ํํ๋ผ๊ธฐ ๋ณด๋ค ๊ณต๊ฐ์ด๋ผ๊ณ ๋ณด๋ฉด ์ข๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋ค.
์ ํธ๋ฆฌํฐ ์์ ฏ(Container ๋ฑ)
์ด ์์ ฏ์ ๋์์ธ ์ง์ ์ด ๊ฐ๋ฅํ๋ค.
๋ ์ด์์, ํ์ธํ
, ์์น ์ง์ , ํฌ๊ธฐ ์กฐ์ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ๊ฒฐํฉํ ๋ค๋ชฉ์ ์์ ฏ์ด๋ค.
๋์์ธ ์ ์ฉ ๊ฐ๋ฅ ์์ ฏ(ElevateButton, Text, Icon, Image ๋ฑ)
์ด ์์ ฏ๋ค์ ์์ ฏ ๋ด์ ์์ฑ์ผ๋ก css์ฒ๋ผ ์ธ์ธํ ๋์์ธ ์ ์ฉ์ ํ ์ ์๋ค.
-
์๋ ์ด๋ฏธ์ง๋ฅผ ์ค๋ช
ํ์ฌ ์ดํด๋ฅผ ๋์๋ฉด
Center ์์ ฏ ์๋์ Column ์์ ฏ์ด ๋ค์ด๊ฐ๊ณ
Column ์์ ฏ์ ๋ฆฌ์คํธ ํ์์ผ๋ก ์์ ฏ์ ๋ค์ ๋ฃ์ ์ ์๋ค.
๊ทธ๋์ Column ์์ ฏ ์์ Text, SizedBox, Button ์์ ฏ์ ์ธ๋ก๋ก ๋ฐฐ์นํ๋ค.
Center ์์ ฏ ์๋์ ์์ด์ ๊ฐ์ด๋ฐ ์ ๋ ฌ์ด ๋๋ค.
์์ ฏ ์์ฑ(Building Widgets)
ํ๋ฌํฐ์์ UI๋ฅผ ๊ตฌํํ๋ ค๋ฉด ์์ ฏ ๊ฐ์ฒด์ build ๋ฉ์๋๋ฅผ ์ฌ์ ์ํด์ผ ํ๋ค.
๋ชจ๋ ์์ ฏ์ build ๋ฉ์ธ๋๋ฅผ ๊ฐ์ ธ์ผ ํ๊ณ , ์ด ๋ฉ์๋๋ ๋ค๋ฅธ ์์ ฏ์ ๋ฐํํด์ผ ํ๋ค.
build ๋ฉ์๋ ํน์ง
- ์์ ฏ์ด ์์ฑ๋๊ฑฐ๋ ์์กด์ฑ์ด ๋ณ๊ฒฝ๋ ๋ ํธ์ถ๋๋ค.
- ์ด ๋ฉ์๋๋ ์์ ฏ์ ์์ฑํ ๋๋ง ์ฌ์ฉํด์ผ ํ๋ค.
์์ ์ฝ๋
class PaddedText extends StatelessWidget {
const PaddedText({super.key});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: const Text('Hello, World!'),
);
}
}
์์ ฏ ์ํ(Widget State)
ํ๋ฌํฐ์์ ์์ ฏ ์ํ๋ ์ฃผ์ ๋๊ฐ์ง ํด๋์ค๊ฐ ์๋ค.
- StatelessWidget: ๋ณ๊ฒฝ๋์ง ์๋ ์ํ๋ฅผ ๊ฐ์ง ์์ ฏ
- StatefulWidget: ์ฌ์ฉ์ ์ํธ์์ฉ์ด๋ ๋ค๋ฅธ ์์ธ์ ๋ฐ๋ผ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ์์ ฏ
StatefulWidget์ ์ํ๋ฅผ ์ ์ฅํ๊ณ , ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค setState๋ฅผ ํธ์ถํ์ฌ UI๋ฅผ ์ ๋ฐ์ดํธ ํ๋ค.
์๋๋ ๊ฐ๋จํ StatefulWidget ์นด์ดํฐ ์์์ด๋ค.
์ํ๋ State์ ์ ์ฅ๋๊ณ
setState()๋ฅผ ํธ์ถํ๋ฉด, ํ๋ฌํฐ๋ ํด๋น ์์ ฏ์ build ๋ฉ์๋๋ฅผ ๋ค์ ํธ์ถํด UI๋ฅผ ์
๋ฐ์ดํธ ํ๋ค.
class CounterWidget extends StatefulWidget {
@override
State<CounterWidget> createState() => _CounterWidgetState();
}
class _CounterWidgetState extends State<CounterWidget> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Text('$_counter');
}
}
'๐ฑFlutter > Flutter Framework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Flutter] ๊ธฐ๋ณธ ๋ ์ด์์์ ๊ตฌ์ฑํ๋ Scaffold ์์ ฏ (0) | 2025.01.20 |
---|---|
[Flutter] build ๋ฉ์๋ (0) | 2025.01.17 |
[Flutter] ์๋๋ก์ด๋ ์ค์ ํธ๋ํฐ ์ฐ๋ํ์ฌ ์ฌ์ฉํ๊ธฐ (0) | 2024.12.28 |
[Flutter] Xcode ์๋ฎฌ๋ ์ดํฐ ์ค์น - Unable to get list of installed Simulator runtimes. (2) | 2024.12.17 |