[Flutter๐Ÿ“ฑ] LifeCycle

gou5metยท2021๋…„ 9์›” 10์ผ
1

Flutter๊ณต๋ถ€

๋ชฉ๋ก ๋ณด๊ธฐ
4/4
post-thumbnail

LifeCycle?

๋ผ์ดํ”„ ์‚ฌ์ดํด์€ ๊ฐ€์žฅ ๊ธฐ๋ณธ๋˜๋Š” ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๋ชฐ๋ผ๋„ ์•ฑ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ํ…๋ฐ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ์•Œ๋ฉด ๋Œ€์ฒ˜ํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ ํผํฌ๋จผ์Šค ๋ถ€๋ถ„์—์„œ๋„ ํฐ ์˜ํ–ฅ์„ ๋ผ์น˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

Stateful Widget

์ˆœ์„œ

Constructor
|
createState()
|
initState()
|
didChangeDependencies()
|
Build()

์ˆœ์„œ๋กœ ๋ผ์ดํ”„์‚ฌ์ดํด์ด ์ด์–ด์ ธ๊ฐ„๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ ์ข…๋ฃŒ๋  ๋•Œ dispose() ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

setState() : ์œ„์ ฏ์—์„œ state๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ํ˜ธ์ถœ๋˜๊ณ  ๋นŒ๋“œ๋ฅผ ํ•œ๋‹ค.
didUpdateWidget() : ๋ถ€๋ชจ ์œ„์ ฏ์—์„œ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ˜ธ์ถœ๋˜๊ณ  ๋นŒ๋“œ๋ฅผ ํ•œ๋‹ค.


constructor

์ƒ์„ฑ์ž์ด๋‹ค. ๋ฉค๋ฒ„๋ณ€์ˆ˜์— ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ์ž‘์—…์„ ํ•ด์ค€๋‹ค.


createState( )

statefulWidget ์— ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.
๋ณดํ†ต ํ…œํ”Œ๋ฆฟ์œผ๋กœ statefulWidget์„ ์ƒ์„ฑํ•ด์ฃผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งŒ๋“ค์–ด์ง„๋‹ค.

class FavoriteWidget extends StatefulWidget {
  const FavoriteWidget({Key? key}) : super(key: key);

  
  _FavoriteWidgetState createState() => _FavoriteWidgetState();
}

์ด๊ฑฐ ์ด์ƒ์œผ๋กœ๋Š” ๋”ฑํžˆ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.


initState( )

์œ„์ ฏ์ด ์ƒ์„ฑ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. state๋ฅผ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๋Š” ์—ญํ• ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ตœ์ดˆ ํ•œ๋ฒˆ ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค.
์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.


void initState(){
  super.initState(); // ๋ฐ˜๋“œ์‹œ ํ•ด์ค˜์•ผํ•œ๋‹ค.
  /*์ดˆ๊ธฐํ™” ๊ด€๋ จ...*/
}

didChangeDependencies( )

์œ„์ ฏ์ด ์ตœ์ดˆ ์ƒ์„ฑ ๋œ ํ›„, initState() ๋‹ค์Œ์— ๋ฐ”๋กœ ํ˜ธ์ถœ๋œ๋‹ค.

Called when a dependency of this State object changes. - Flutter
๋˜ํ•œ ์œ„ ๋‚ด์šฉ์ฒ˜๋Ÿผ ์œ„์ ฏ์ด ์˜์กดํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋ ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค.


void didChangeDependencies(){
  super.didChangeDependencies();
  /*state ๋ณ€๊ฒฝ ์‹œ ํ˜ธ์ถœ*/
}

build( )

UI๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ, ์ด ๋ฉ”์„œ๋“œ๋Š” ๊ฐ€์žฅ ๋งŽ์ด ํ˜ธ์ถœ๋œ๋‹ค. ์ด๊ณณ์— ๊ณ„์‚ฐ์ด ํ•„์š”ํ•œ ๋กœ์ง์ด ๋งŽ์ด ์žˆ๋‹ค๋ฉด ์•ฑ์˜ ํผํฌ๋จผ์Šค๊ฐ€ ํ˜„์ €ํžˆ ๋‚ฎ์•„์ง„๋‹ค.
build() ๋ฉ”์„œ๋“œ์˜ ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.
  • ์žฌ์ •์˜(override) ๋Œ€์ƒ์ด๋‹ค.
  • ๋ฐ˜๋“œ์‹œ Widget์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

Widget build(){
  return Container(...)
} 

setState( )

๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ํ”„๋ ˆ์ž„์›Œํฌ์— ์•Œ๋ ค์ค€๋‹ค. ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์œผ๋กœ UI์— ๋ณ€ํ•œ ๊ฐ’์„ ๋ฐ˜์˜ํ•ด์•ผํ•˜๋‹ˆ build ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ๋งŒ์•ฝ setState() ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋ฉด build() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์•„ UI ์— ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š”๋‹ค.

void setState(() => {
  _myState = value;
})
// void callback ํ•จ์ˆ˜

didUpdateWidget( )

์œ„์ ฏ์˜ ๊ตฌ์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค. ์ •ํ™•ํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด ๋ถ€๋ชจ ์œ„์ ฏ์ด ๋ณ€๊ฒฝ๋˜์–ด ์žฌ๊ตฌ์„ฑ ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ํ˜ธ์ถœ๋œ๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋Š” ์ด์ „ ์ƒํƒœ์˜ ์ž์‹ ์„ ๋ฐ›๋Š”๋‹ค.(oldWidget)


void didUpdateWidget(covariant T oldWidget) {
  super.didUpdateWidget(oldWidget);
  if(oldWidget.value != widget.value){
    print('update!');
  }
}

dispose( )

dispose() ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉ๋˜์—ˆ๋˜ ๊ฒƒ๋“ค์„ ์˜๊ตฌ์ ์œผ๋กœ ์ œ๊ฑฐํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. (scrollController, pageController...) ์ œ๊ฑฐํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์•ฑ์˜ ํผํฌ๋จผ์Šค๊ฐ€ ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ํ•ด์ฃผ๋Š”๊ฒƒ์ด ์ข‹๋‹ค.


void dispose() {
  // ...
  super.dispose()
}

๋งˆ์น˜๋ฉฐ

ํ”Œ๋Ÿฌํ„ฐ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค. ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ž˜ ์•Œ์•„๋‘๋ฉด ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์ƒ๊ธฐ๋Š” ์ด์Šˆ๋ฅผ ๋น ๋ฅด๊ฒŒ ์บ์น˜ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์กฐ๋งŒ๊ฐ„ ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ์— ๋“ค์–ด๊ฐˆ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ์ „๊นŒ์ง€ ํ”Œ๋Ÿฌํ„ฐ ์ง€์‹์„ ์ตœ๋Œ€ํ•œ ์Šต๋“ํ•˜์—ฌ ๋ฌธ์ œ์—†์ด ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ž.

profile
ํ”Œ๋Ÿฌํ„ฐ ๊ณต๋ถ€ ์ค‘์— ์žˆ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€