๐ Today I Learned 9ํ์ฐจ - [ํ๋ฃจํฐ] ์ ์ ์ก์ ๋ง๋ค๊ธฐ ๐ผ๏ธ
๐ผ๏ธ ์ ์ ์ก์ ๋ง๋ค๊ธฐ
๐ฏ ํ์ต ๋ชฉํ
์ด๋ฒ ํ์ต์์๋ ์ ์ ์ก์ ์ฑ์ ๋ง๋ค์ด๋ณด๋ฉฐ ๋ค์ ๋ด์ฉ์ ์ตํ๋ณด๊ฒ ์ต๋๋ค:
- ์ด๋ฏธ์ง ๋กค๋ง ํ์: 5๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ์๋์ผ๋ก ์ํํ๋ฉฐ ํ์
- ์ฌ์ฉ์ ์ํธ์์ฉ: ์ข์ฐ ์ค์์ดํ๋ก ์๋ ์ด๋ฏธ์ง ๋ณ๊ฒฝ ๊ฐ๋ฅ
- ํ์ด๋จธ ๊ธฐ๋ฅ: ํน์ ์ฃผ๊ธฐ๋ง๋ค ์๋์ผ๋ก ํจ์ ์คํ
- ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ: StatefulWidget์ ์๋ช ์ฃผ๊ธฐ ํ์ฉ
๐ ํ์ต ์์
graph LR
A[๐ ์ฌ์ ์ง์] --> B[โ๏ธ ์ฌ์ ์ค๋น]
B --> C[๐จ ๋ ์ด์์ ๊ตฌ์]
C --> D[๐ป ๊ตฌํํ๊ธฐ]
D --> E[๐งช ํ
์คํธํ๊ธฐ]
๐ ๏ธ ํต์ฌ ๊ธฐ์ ์คํ
๊ธฐ์ | ์ญํ | ์ค์๋ |
---|---|---|
PageView | ํ์ด์ง ์ค์์ดํ ๋ฐ ์ด๋ฏธ์ง ์ ํ | โญโญโญ |
Timer | ์๋ ์ด๋ฏธ์ง ๋กค๋ง ๊ธฐ๋ฅ | โญโญโญ |
StatefulWidget | ์ํ ๊ด๋ฆฌ ๋ฐ ์๋ช ์ฃผ๊ธฐ | โญโญโญ |
๐ ์ฌ์ ์ง์
๐ ์์ ฏ์ ์๋ช ์ฃผ๊ธฐ
์์ ฏ์ ์๋ช ์ฃผ๊ธฐ(Lifecycle)๋ ์์ ฏ์ด ํ๋ฉด์ ๊ทธ๋ ค์ง๋ ์๊ฐ๋ถํฐ ์ญ์ ๋๋ ์๊ฐ๊น์ง์ ์ ์ฒด ๊ณผ์ ์ ์๋ฏธํฉ๋๋ค.
๐ก ์ค์: ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ดํดํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง์ ์ฑ๋ฅ ์ต์ ํ์ ํฐ ๋์์ด ๋ฉ๋๋ค!
โก StatelessWidget
StatelessWidget์ ์๋ช ์ฃผ๊ธฐ:
- ์์ฑ์ ์คํ: StatelessWidget ์ธ์คํด์ค ์์ฑ
- build() ์คํ: UI ๊ตฌ์ฑ ์์ ๋ฐํ
- ๋ ๋๋ง: build()๊ฐ ๋ฐํํ Widget์ด ํ๋ฉด์ ํ์
class MyStatelessWidget extends StatelessWidget {
// 1. ์์ฑ์ ์คํ
const MyStatelessWidget({Key? key}) : super(key: key);
// 2. build ํจ์ ์คํ
@override
Widget build(BuildContext context) {
return Text('Hello World!'); // 3. ํ๋ฉด์ ๋ ๋๋ง
}
}
โ ๏ธ ์ฃผ์: StatelessWidget์ ๋ถ๋ณ(Immutable) ํน์ฑ์ ๊ฐ์ง๋๋ค. ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ธ์คํด์ค๋ฅผ ์๋ก ์์ฑํด์ผ ํฉ๋๋ค.
๐ StatefulWidget
StatefulWidget์ ๋ด๋ถ ์ํ๋ฅผ ๊ฐ์ง ์ ์๋ ์์ ฏ์ ๋๋ค. ์ธ๋ถ ๋งค๊ฐ๋ณ์ ๋ณ๊ฒฝ ์์ ๋์์ StatelessWidget๊ณผ ์ ์ฌํ์ง๋ง, ๋ด๋ถ์์ build() ํจ์๋ฅผ ์ฌ์คํํ ์ ์๋ค๋ ์ ์ด ๋ค๋ฆ ๋๋ค.
StatefulWidget์๋ 3๊ฐ์ง ํต์ฌ ์๋ช ์ฃผ๊ธฐ๊ฐ ์์ต๋๋ค:
์ ํ | ๋ฐ์ ์์ | ์ฃผ์ ๋ฉ์๋ |
---|---|---|
๐ ๊ธฐ๋ณธ ์๋ช ์ฃผ๊ธฐ | ์์ ฏ ์ต์ด ์์ฑ ์ | initState() โ build() |
๐ ๋งค๊ฐ๋ณ์ ๋ณ๊ฒฝ | ๋ถ๋ชจ์์ ์ ๋งค๊ฐ๋ณ์ ์ ๋ฌ | didUpdateWidget() โ build() |
โก ์ํ ๋ณ๊ฒฝ | setState() ํธ์ถ ์ |
setState() โ build() |
์ํ ๋ณ๊ฒฝ์ด ์๋ ์๋ช ์ฃผ๊ธฐ

์ ๋ค์ด์ด๊ทธ๋จ์ StatefulWidget์ ๊ธฐ๋ณธ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ณด์ฌ์ค๋๋ค:
- ์์ฑ์ ์คํ: StatefulWidget์ด ์์ฑ๋ฉ๋๋ค
- createState(): State ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค
- initState(): ์์ ฏ์ด ์ฒ์ ์์ฑ๋ ๋ ํ ๋ฒ๋ง ํธ์ถ๋ฉ๋๋ค
- didChangeDependencies(): State๊ฐ ์์กดํ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ํธ์ถ๋ฉ๋๋ค
- dirty โ build() โ clean: UI ๋ ๋๋ง ์ฌ์ดํด์ ๋๋ค
- didUpdateWidget() / setState(): ์ํ ๋ณ๊ฒฝ ์ build()๋ฅผ ์ฌํธ์ถํฉ๋๋ค
- deactivate() / dispose(): ์์ ฏ์ด ์ ๊ฑฐ๋ ๋ ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํฉ๋๋ค
StatefulWidget ์์ฑ์์ ๋งค๊ฐ๋ณ์๊ฐ ๋ณ๊ฒฝ๋์ ๋ ์๋ช ์ฃผ๊ธฐ

์ ๋ค์ด์ด๊ทธ๋จ์ ๋ถ๋ชจ ์์ ฏ์์ ๋งค๊ฐ๋ณ์๊ฐ ๋ณ๊ฒฝ๋์์ ๋์ ์๋ช ์ฃผ๊ธฐ์ ๋๋ค:
- ์๋ก์ด ์์ฑ์: ๋ถ๋ชจ๊ฐ ์๋ก์ด ๋งค๊ฐ๋ณ์๋ก ์์ ฏ์ ์ฌ์์ฑํฉ๋๋ค
- didUpdateWidget(): ๊ธฐ์กด ์์ ฏ๊ณผ ์ ์์ ฏ์ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ์ฌํญ์ ์ฒ๋ฆฌํฉ๋๋ค
- dirty โ build() โ clean: ๋ณ๊ฒฝ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ํ์ฌ UI๋ฅผ ๋ค์ ๋ ๋๋งํฉ๋๋ค
State ์์ฒด์ ์ผ๋ก build()๋ฅผ ์ฌ์คํํ ๋ ์๋ช ์ฃผ๊ธฐ
setState() ํจ์๋ฅผ ์คํํด์ build() ํจ์๋ฅผ ์์ฒด์ ์ผ๋ก ์ฌ์คํํ ์ ์์ต๋๋ค.

์ ๋ค์ด์ด๊ทธ๋จ์ setState() ํจ์๋ฅผ ํธ์ถํ์ ๋์ ์๋ช ์ฃผ๊ธฐ์ ๋๋ค:
- setState() ํธ์ถ: ์ํ ๋ณ๊ฒฝ์ ํ๋ ์์ํฌ์ ์๋ฆฌ๊ณ build() ์ฌ์คํ์ ์์ฒญํฉ๋๋ค
- dirty โ build() โ clean: ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ๋ฐ์ํ์ฌ UI๋ฅผ ๋ค์ ๋ ๋๋งํฉ๋๋ค
์ด๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ UI ์ ๋ฐ์ดํธ ํจํด์ผ๋ก, ์ฌ์ฉ์ ์ํธ์์ฉ์ด๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ์ฌ์ฉ๋ฉ๋๋ค.
Timer
Timer๋ ํน์ ์๊ฐ์ด ์ง๋ ํ์ ์ผํ์ฑ ๋๋ ์ง์์ ์ผ๋ก ํจ์๋ฅผ ์คํํ๋ค.
Timer( // ํ๋ฒ ์คํ
Duration(seconds: 3), // ์ฃผ๊ธฐ
(Timer timer) {}, // ์ฝ๋ฐฑ ํจ์
)
Timer.periodic( // ์ฃผ๊ธฐ์ ์ผ๋ก ์คํ
Duration(seconds: 3), // ์ฃผ๊ธฐ
(Timer timer) {}, // ์ฝ๋ฐฑ ํจ์
)
๊ตฌํํ๊ธฐ
PageView ๊ตฌํํ๊ธฐ
PageView๋ ์ฌ๋ฌ ๊ฐ์ ์์ ฏ์ ๋จ๋ ํ์ด์ง๋ก ์์ฑํ๊ณ ๊ฐ๋ก ๋๋ ์ธ๋ก ์ค์์ดํ๋ก ํ์ด์ง๋ฅผ ๋๊ธธ ์ ์๊ฒ ํ๋ ์์ ฏ์ด๋ค.
BoxFit ์์ฑ | ์ค๋ช |
---|---|
BoxFit.contain | ๊ฐ๋ก์ธ๋ก ๋น์จ์ ์ ์งํ๋ฉด์ ์ด๋ฏธ์ง๊ฐ ๋ฐ์ค ์์ ์์ ํ ๋ค์ด๊ฐ๋๋ก ์กฐ์ |
BoxFit.cover | ๊ฐ๋ก์ธ๋ก ๋น์จ์ ์ ์งํ๋ฉด์ ๋ฐ์ค๋ฅผ ์์ ํ ์ฑ์ฐ๋๋ก ์กฐ์ (์ด๋ฏธ์ง ์ผ๋ถ ์๋ฆด ์ ์์) |
BoxFit.fill | ๊ฐ๋ก์ธ๋ก ๋น์จ์ ๋ฌด์ํ๊ณ ๋ฐ์ค๋ฅผ ์์ ํ ์ฑ์ฐ๋๋ก ๋์ด๊ฑฐ๋ ์ค์ |
BoxFit.fitHeight | ๋์ด์ ๋ง์ถฐ ์ด๋ฏธ์ง๋ฅผ ์กฐ์ ํ๊ณ , ๋๋น๋ ๋น์จ์ ๋ง์ถฐ ์กฐ์ |
BoxFit.fitWidth | ๋๋น์ ๋ง์ถฐ ์ด๋ฏธ์ง๋ฅผ ์กฐ์ ํ๊ณ , ๋์ด๋ ๋น์จ์ ๋ง์ถฐ ์กฐ์ |
BoxFit.none | ์ด๋ฏธ์ง ์๋ณธ ํฌ๊ธฐ๋ฅผ ์ ์งํ๊ณ ๋ฐ์ค ์ค์์ ๋ฐฐ์น |
BoxFit.scaleDown | contain๊ณผ none ์ค ๋ ์์ ํฌ๊ธฐ๋ก ์กฐ์ |
์ํ๋ฐ ์์ ๋ณ๊ฒฝํ๊ธฐ
์ํ๋ฐ๋ ์ฑ์ ์คํ ์ค ํธ๋ํฐ ๋ฐฐํฐ๋ฆฌ, ์๊ฐ, ์์ดํ์ด ์ฐ๊ฒฐ ์ํ ๋ฑ์ ๋ณด์ฌ์ฃผ๋ ์์ญ์ด๋ค.
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light);
SystemChrome
ํด๋์ค๋ ์์คํ
UI์ ๊ทธ๋ํฝ ์ค์ ์ ๋ณ๊ฒฝํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
SystemChrome ํจ์
ํจ์ | ์ค๋ช |
---|---|
setEnabledSystemUIMode() | ์์คํ UI ๋ชจ๋๋ฅผ ์ค์ (์ ์ฒดํ๋ฉด, ์ํ๋ฐ/๋ค๋น๊ฒ์ด์ ๋ฐ ํ์ ๋ฑ) |
setPreferredOrientations() | ํ๋ฉด ํ์ ๋ฐฉํฅ์ ์ ํ (์ธ๋ก๋ชจ๋, ๊ฐ๋ก๋ชจ๋ ๋ฑ) |
setSystemUIChangeCallback() | ์์คํ UI ๋ณ๊ฒฝ ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฑ๋ก |
setSystemUIOverlayStyle() | ์ํ๋ฐ์ ๋ค๋น๊ฒ์ด์ ๋ฐ์ ์คํ์ผ์ ์ค์ |
โฐ ์๋ ๋กค๋ง ํ์ด๋จธ ์ถ๊ฐ
์๋ ๋กค๋ง ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ค๋ฉด StatefulWidget
์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์๊น์?
โ ๏ธ ์ฃผ์: StatelessWidget์์
build()
ํจ์ ๋ด๋ถ์ Timer๋ฅผ ๋ฑ๋กํ๋ฉด, ์์ ฏ์ด ๋ฆฌ๋น๋๋ ๋๋ง๋ค ์๋ก์ด Timer๊ฐ ๊ณ์ ์์ฑ๋์ด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํฉ๋๋ค! ๐จ
StatefulWidget์ ์ฌ์ฉํ๋ฉด initState()
์์ ๋ฑ ํ ๋ฒ๋ง Timer๋ฅผ ์์ฑํ ์ ์์ต๋๋ค:
class PhotoFrameState extends State<PhotoFrame> {
PageController _pageController = PageController();
Timer? _timer;
@override
void initState() {
super.initState();
// โจ ์๋ ๋กค๋ง ํ์ด๋จธ ์ค์ (3์ด๋ง๋ค)
_timer = Timer.periodic(Duration(seconds: 3), (timer) {
// ํ์ฌ ํ์ด์ง ๊ฐ์ ธ์ค๊ธฐ
double? currentPage = _pageController.page;
int nextPage = currentPage == null ? 1 : (currentPage.round() + 1) % 5;
// ๋ค์ ํ์ด์ง๋ก ์ด๋
_pageController.animateToPage(
nextPage,
duration: Duration(milliseconds: 500),
curve: Curves.easeInOut,
);
});
}
@override
void dispose() {
_timer?.cancel(); // ๐งน ๋ฆฌ์์ค ์ ๋ฆฌ
_pageController.dispose();
super.dispose();
}
}
PageController๋ฅผ ์ฌ์ฉํด์ PageView์ ํ์ฌ ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค:
๐ PageController ์ฌ์ฉ๋ฒ
๋ฉ์๋ | ๊ธฐ๋ฅ | ๋ฐํ๊ฐ |
---|---|---|
.page |
ํ์ฌ ํ์ด์ง ๋ฒํธ | double? (์ค์์ดํ ์ค์๋ ์์์ ) |
.animateToPage() |
์ ๋๋ฉ์ด์ ๊ณผ ํจ๊ป ์ด๋ | Future<void> |
.nextPage() |
๋ค์ ํ์ด์ง๋ก ์ด๋ | Future<void> |
๐ก ๊ฟํ:
pageController.page
๊ฐnull
์ผ ์ ์์ผ๋ฏ๋ก ํญ์ null ์ฒดํฌ๋ฅผ ํด์ฃผ์ธ์!
๐ ๋ง๋ฌด๋ฆฌ
โจ ์ค๋ ๋ฐฐ์ด ๊ฒ
์ด๋ฒ ์ ์ ์ก์ ํ๋ก์ ํธ๋ฅผ ํตํด ๋ค์๊ณผ ๊ฐ์ ์์คํ ๊ธฐ์ ๋ค์ ๋ง์คํฐํ์ต๋๋ค:
๊ธฐ์ | ํ์ต ๋ด์ฉ | ์ค์ ์์ฉ |
---|---|---|
๐ PageView | ์ค์์ดํ ๊ธฐ๋ฅ, PageController ์ฌ์ฉ๋ฒ | ์ฌ์ง ์ฑ, ์จ๋ณด๋ฉ ํ๋ฉด |
โฐ Timer | ์๋ ์คํ, ์ฃผ๊ธฐ์ ์์ , ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ | ๋ฐฐ๋ ๋กค๋ง, ์๋, ์ค์๊ฐ ์ ๋ฐ์ดํธ |
๐ StatefulWidget | 3๊ฐ์ง ์๋ช ์ฃผ๊ธฐ ํจํด, ์ํ ๊ด๋ฆฌ | ๋ชจ๋ ๋์ UI, ์ธํฐ๋ํฐ๋ธ ์ฑ |
๐จ SystemChrome | ์ํ๋ฐ ์คํ์ผ๋ง, ํ๋ฉด ๋ฐฉํฅ | ์ ์ฒดํ๋ฉด ์ฑ, ๊ฒ์, ๋ฏธ๋์ด ์ฑ |
๐ผ๏ธ BoxFit | ์ด๋ฏธ์ง ์กฐ์ ๋ฐฉ์ 7๊ฐ์ง | ๊ฐค๋ฌ๋ฆฌ, ํ๋กํ, ์ํ ์ด๋ฏธ์ง |
๐ ๋ค์ ๊ณํ
์ค๋ ํ์ตํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ ๋ฉ์ง ํ๋ก์ ํธ๋ฅผ ์๋ํด๋ณผ ์ ์์ต๋๋ค:
- ๐จ ๊ณ ๊ธ ์ฌ์ง ์๋ํฐ: ํํฐ, ํ์ , ์๋ฅด๊ธฐ ๊ธฐ๋ฅ
- ๐ต ์์ ํ๋ ์ด์ด: ์๋ ์ฌ์, ํ๋ ์ด๋ฆฌ์คํธ
- ๐ฑ ์์ ๋ฏธ๋์ด ์ฑ: ์ธํผ๋ํธ ์คํฌ๋กค, ์ด๋ฏธ์ง ์ ๋ก๋
- ๐ฎ ๋ฏธ๋ ๊ฒ์: ์ ๋๋ฉ์ด์ , ๋ฒํผ ์ธํฐ๋์
๐ช ์ฑ์ฅ ํ: ์ค๋ ๋ฐฐ์ด StatefulWidget ์๋ช ์ฃผ๊ธฐ๋ Flutter ๊ฐ๋ฐ์ ํต๋๊ฐ ๋๋ ์ค์ํ ๊ฐ๋ ์ ๋๋ค. ๊ณ์ ์ฐ์ตํด์ ๋ง์คํฐํ์ธ์!
๋๊ธ๋จ๊ธฐ๊ธฐ