1. Provider
ํ๋ฌํฐ์๋ Stateless์ Stateful ์์ ฏ์ด ์กด์ฌํ๋๋ฐ Stateful์์ ฏ์ ์ฌ์ฉํ์ฌ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด, ์ด๋ฅผ ํ๋ฉด์ ๋ฐ์์ ํด์ฃผ์ด์ผ ํ๋๋ฐ ์ด๋ setstate(){}๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝ๋ ํ๋ฉด์ ์ ๋ฐ์ดํธ๋ฅผ ์์ผ์ค ์๊ฐ ์๋ค.
1. Stateless๋ Constructor์ด ์์ฑ๋๊ณ ์์ฑ๋์๋ง์ build ํจ์๋ฅผ ์คํํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ผ์ดํ ์ฌ์ดํด๋์ ํ๋ฒ๋ง ์คํ๋๋ค -> ๊ทธ ํ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅ
2. Stateful ์์ ฏ์ Constructor์ด ์คํ๋๊ณ ๋ ํ createState๊ฐ ๋ถ๋ฆฌ๊ฒ ๋๋ค.
๋ง์ฝ ํ๋ผ๋ฏธํฐ๊ฐ ๋ณ๊ฒฝ์ด ๋๋ค๋ฉด ํธ์ถ์์๋ 1 -> didUpdateWidget -> 5 -> 6 -> 7
ํ์ง๋ง setState๋ state๋ด๋ถ์์ ์งํ๋๊ธฐ ๋๋ฌธ์ ํธ์ถ์์๋ setState -> 5 -> 6 -> 7
์ ์ฌ์ง๋ง ๋ณธ๋ค๋ฉด ๋ด๋ถ์์ ๋์๊ฐ๋ ๊ตฌ์กฐ๋ ์ฝ๊ฒ ์ดํด๊ฐ ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
๊ทธ๋๋ ์ดํด๊ฐ ์๋๋ค๋ฉด ์ฝ๋ฉ์ ฐํ๋์ stateful ์์ ฏ ๊ฐ์๋ฅผ ์ฐธ๊ณ
https://www.youtube.com/watch?v=StvbitxUKSo&t=5s
๊ทธ๋ฌ๋ฉด ๋ง์ฝ์ ์์๊ฐ์ด setState๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ํ์์๋ ๋ถ๋ถ๊น์ง ์ ๋ถ Rebuild๊ฐ ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋น๋๊ฐ ํ์์๋ ๋ถ๋ถ์ ์ ์ธํ ํน์ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธ๋ฅผ ํ๋ค๋ฉด ๋งค์ฐ ํจ์จ์ ์ด๊ฒ ์ด์์ด ๊ฐ๋ฅํ๊ฒ ๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ์ํ ๊ฒ์ด
Provider ์ GetX์ด๋ค.
์์ ๊ฐ์ด ์ฌ๊ท์ ์ผ๋ก ๊ณ์ํด์ ๋ถ๋ฆฌ๋ ์์ ฏ์ด ์กด์ฌํ๋ค๊ณ ๊ฐ์ ํด๋ณด์!
๊ทธ๋ ๋ค๋ฉด ์ด์ ๊ฐ์ ์์ ฏ์ด 100๊ฐ๊ฐ ๋๊ฒ ๋๋ค๋ฉด ํ๋์ ํด๋์ค์ ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ํ์ ์์ ฏ 99๊ฐ๊ฐ ์ ๋ถ ์ฌ๋น๋๊ฐ ๋์ด์ผ ํ๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ด๋ด๋ setState๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋ณด๋ค Provider๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๋ถ๋ถ์ ๊ฐ๋ง ๋ณ๊ฒฝ๋๊ฒ ํ ์ ์๋ค.
Provider๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ ์ ๊ฐ์ด Model์ ๋ง๋ค์ด ์ฃผ์ด์ผ ํ๋ค.
changeFIshNumber() -> number์ ๊ฐ์ +1 ์ฆ๊ฐ์์ผ์ฃผ๊ณ
notifyListeners() -> ๋ง์ฝ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์ด๋ฅผ ์๋ ค์ฃผ๋ ํจ์
(notifyListeners๊ฐ ์๋ค๋ฉด ๊ฐ์ด ๋ณ๊ฒฝ๋์๋ค๊ณ ์๋ ค์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ๋ฐ์์ด ์๋๋ค)
์ด์ View๋ถ๋ถ์ผ๋ก ๋์์์ MultiProvider()๋ฅผ ํตํด์ ์ฌ๋ฌ๊ฐ์ Provider๋ฅผ ์ค์ ํ ์ ๊ฐ ์๋ค.
์ด๋ฅผ ํตํด ์๋ก ๋ค๋ฅธ Model๋ฅผ ํตํด ๊ฐ๊ธฐ ๋ค๋ฅธ ์ ๋ฐ์ดํธ ๊ฐ์ ์ ๋ฌํด ์ค ์ ์๊ฒ ๋๋ค.
Model์ ๊ฐ์ ๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ์ฝ๋ค.
Provider.of<model>(context).[value or function] ์ ๋ฃ์ผ๋ฉด ๋๋ค.
์ด๋ (context, listen : false)๋ก ์ค์ ํ๋ ์ด์ ๋ ๊ณ์ํด์ ๋ชจ๋ํฐ๋ง์ด ํ์์๋ ๋ถ๋ถ์ ์ฒ๋ฆฌํด ์ค ์ ์๋ค.
์ด๋ฌํ ๋ฐฉ์์ผ๋ก Provider๋ฅผ ํตํ์ฌ setState๋ณด๋ค ๋ ํจ์จ์ ์ธ ์ํ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
2. GetX
๊ทธ๋ ๋ค๋ฉด GetX๋ ๋ฌด์์ผ๊น?
Provider๋ ๋ฌด์์ด ๋ค๋ฅด๊ธธ๋ ์ Provider๋ณด๋ค GetX์ ๋ค์ด๋ก๋์๊ฐ ๋ ๋ง์๊น?
GetX์๋ 2๊ฐ์ง์ ์ํ๊ฐ ์กด์ฌํ๋ค.
- ๋จ์ ์ํ ๊ด๋ฆฌ์ (GetBuild)
- ๋ฐ์ํ ์ํ ๊ด๋ฆฌ์ (GetX / obs)
๋จ์ ์ํ ๊ด๋ฆฌ์๋ Provider์ ChangeNotifierProvider์ ๋น์ทํ๋ค.
<Provider>
//controller ์ํ๊ด๋ฆฌ ์ดํ brodcast ๋ฐฉ๋ฒ
class ChangeNotifierController extends ChangeNotifier{
int count=0;
void increment(){
count++
notifyListeners();
}
}
//๋ณ๊ฒฝ๋ ์ํ๊ฐ์ ์ ๋ฌ๋ฐ๋ ui ์ชฝ ์์ค
Consumer<ChangeNotifierController>(
builder: (context, controller, child) {
return Text( '${controller.count}');
}
)
<GetX>
//controller ์ํ๊ด๋ฆฌ ์ดํ brodcast ๋ฐฉ๋ฒ
class CounterController extends GetxController{
int count=0;
void increment(){
count++
update();
}
}
//๋ณ๊ฒฝ๋ ์ํ๊ฐ์ ์ ๋ฌ๋ฐ๋ ui ์ชฝ ์์ค
Getbuilder<CounterController>(
builder: (controller) {
return Text( '${controller.count}');
}
),
GetX์ ์ข์์ ์ผ๋ก๋ ๋ง์ฝ ์ ์ธํ ๋ณ์์ ๊ฐ์ด "Person"์ด๋ผ๋ String ๊ฐ์ด ์๊ณ ,
์ฌ์ฉ์๊ฐ ๋๊ฐ์ด "Person"์ ๊ฐ์ ๋ค์ ๋ฃ๊ณ ์์ ํ๊ฒ ๋๋ค๋ฉด GetX์์๋ ๋ฆฌ์์ค๋ฅผ ์๋ผ๊ธฐ ์ํด
๋๊ฐ์ ๊ฐ์ด ๋ค์ด์ค๊ฒ ๋๋ฉด ์ ๊ฐ์ ๋ฌด์ํ๊ณ ๊ธฐ์กด๊ฐ์ ๊ทธ๋๋ก ์ ์งํ๋ค.
GetX์ ๋ฐ์ํ ์ํ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ฒ์ ์์๋ณด์
์์ ๊ฐ์ด ๋ชจ๋ธ์ ์ค์ ํด์ฃผ๊ณ
์ปจํธ๋กค๋ฌ๋ฅผ ์ค์ ํด ์ค๋ค.
์์ ๊ฐ์ด ๋ณ์์ .obs๋ฅผ ์ง์ ํด์ฃผ๋ฉด ์ด ๋ณ์๋ฅผ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๊ณ์ํด์ ๋ชจ๋ํฐ๋ง์ ๋ฐ๊ฒ ๋๋ค. (obs์ ๋ป์ Observable)
-> View ์ค์
final Controller controller = Get.put(Controller()) ๋ฅผ ํตํด ์ปจํธ๋กค๋ฌ๋ฅผ ์์ฑํ๋ค.
GetX์ ์ข์์ ํ๋๊ฐ Provider์ฒ๋ผ context์ ์์กดํ์ง ์๊ธฐ ๋๋ฌธ์ ์ต์์์ Provider๋ฅผ ๋ฌถ์ด์ค์ ๊ด๋ฆฌํด์ฃผ์ง ์๊ธฐ ๋๋ฌธ์
์ํ๋ ๋ถ๋ถ์๋ง Controller๋ฅผ ์ฌ์ฉํ๋ค๋ ์ ์์ ๋งค์ฐ ํธ๋ฆฌํ๋ค.
-> ์ด ๋ง์ด ์ดํด๊ฐ ์๊ฐ๋ ๋์ค์ ๋๋ค ์ฌ์ฉํด๋ณด๊ฒ ๋๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์ดํด๊ฐ ๋๋ค.
์ด์ GetX๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค. -> ๋์ค ์ด๋๊ฒ์ ์ฌ์ฉํด๋ ๋๊ฐ์
์์ ๊ฐ์ด
GetX<> ๋ก ๋ฌถ์ด์ฃผ์ด๋ ๋๊ณ
Obx()๋ก ๋ฌถ์ด์ ์ฌ์ฉํด๋ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋ฒํผ์ ํตํด์ ์ก์ ์ ์คํํด์ ํน์ ๋ณ์์ ๊ฐ๋ง ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ํ์ฌ ํ๋ฉด์ ๋ฐ์ํ๋๋ก ํ ์ ์๋ค.
๊ฐ์ธ์ ์ผ๋ก GetX์ ์ฌ์ฉ์ฑ์ด Provider๋ณด๋ค ๋ช๋ฐฐ๋ ๋ ํธ๋ฆฌํ๊ณ ์ฝ๋๊ธธ์ด ๋จ์ถ์๋ ๋ ์ข๋ค๊ณ ์๊ฐํ๋ค.
๋๋ค ํด๋ณธ ๋๋์ผ๋ก๋ ์ด๋ณด์๋ผ๋ฉด Provider๋ฅผ ๋ฐ๋์ ์ง๊ณ ๋์ด๊ฐ ๋ค์ GetX๋ฅผ ์ฌ์ฉํ๋๊ฒ ์ข๋ค๊ณ ์๊ฐํ๋ ์ด์ ๋ก๋
GetX๋ ์ด๋ป๊ฒ ๊ฐ์ด ๋ณ๊ฒฝ๋์ด ์ด๋ ํ ๊ณผ์ ์ ๊ฑฐ์ณ์ ๊ฐ์ด ๋ณํ๋๋์ง ์ฝ๋๋ก๋ง ๋ด์๋ ๊ฐ์ ์ก๊ธฐ ํ๋ ๋ฐ
Provider๋ ์ํ ํ๋ฆ์ ํ๋์ฉ ๋ณด๋ฉด์ ๊ณต๋ถํด์ ๊ทธ๋ฐ์ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ฝ๋๊ฐ ์ด๋ป๊ฒ ํ๋ฌ๊ฐ๋์ง ๊ฐ์ ์ก์ ์ ์์๋ค.
๋ง์ ํ์ดํ ์น๋ฉด์ ์๊ฐํด๋ณด๋๊น ๊ทธ๋ฅ ๋น์ทํ๊ฑฐ ๊ฐ๊ธฐ๋ ํ๊ณ ...? ์๋๊ฐ??
+ GetX์ ๋ผ์ฐํฐ ๊ธฐ๋ฅ
Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) => HomePage(),
),
);
์๋ ํ๋ฌํฐ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ MaterialPageRoute๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ๊ธธ์ด์ง๋๋ฐ GetX๋ฅผ ์ฌ์ฉํ ๋ผ์ฐํฐ๋
`Get.to(HomePage());`
์ด๋ ๊ฒ ๊ฐ๊ฒฐํ๊ฒ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํ๊ณ
`Get.to(SamplePage(), transition: Transition.downToUp);`
์ ์ฒ๋ผ ํ์ด์ง๊ฐ ์ด๋ํ ๋ ํจ๊ณผ๋ฅผ ์ค ์ ์๋ค.