์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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
- ์๋ฐ์คํฌ๋ฆฝํธ ๊ณต๋ถ
- serverless
- ํ์ด์ฌ๊ณต๋ถ
- ์๋ฐ์ด๋ณด
- ์คํธ๋ฆผ๋ฆฟ
- ์๋ฐ๊ณต๋ถ
- MySQL
- ํ์ด์ฌ
- ์๋๋ก์ด๋ ์ฑ ๊ฐ๋ฐ
- Flutter
- ์คํธ๋ฆผ๋ฆฟ ๊ธฐ๋ณธ
- Pandas
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- java
- Streamlit๊ธฐ์ด
- RESTful API
- ํ๋ค์ค
- ์๋๋ก์ด๋ ์คํ๋์ค
- ์๋ฐํ๋ก๊ทธ๋๋ฐ
- Android
- ์น๋์๋ณด๋ ๊ธฐ์ด
- JavaScript
- ์๋ฐ
- ์น๋์๋ณด๋ ์ ์
- ์๋ฐ์คํฌ๋ฆฝํธ
- ์๋ฐ๊ธฐ์ด
- db
- ํ๋ค์ค๊ณต๋ถ
- streamlit
- Today
- Total
ruriruriya
[Flutter] ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ Provider ํจํค์ง ๋ณธ๋ฌธ
[Flutter] ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ Provider ํจํค์ง
๋ฃจ๋ฆฌ์ผใ 2025. 2. 25. 16:44Provider๋ Flutter์์ ๊ณต์์ ์ผ๋ก ์ถ์ฒํ๋ Flutter ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ํจํค์ง์ด๋ค.
1. Provider๋?
Provider๋ Flutter์ InheritedWidget์ ๊ฐํธํ๊ฒ ์ฌ์ฉํ๋๋ก ๋๋ ํจํค์ง๋ก ์ฌ๋ฌ ์์ ฏ์์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ณ , ์ํ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ฌ UI๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์๋ค.
โ Provider๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ ์
- ๋ฆฌ์์ค ํ ๋น ๋ฐ ํด์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ํด์ง
→ ๋ถํ์ํ ๋ฆฌ์์ค ์ฌ์ฉ์ ์ค์ด๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ ์ ์์. - Lazy-loading ์ง์
→ ํ์ํ ๋๊น์ง ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์์์ ์ฑ๋ฅ ์ต์ ํ๊ฐ ๊ฐ๋ฅํจ. - ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋ ๊ฐ์
→ ์ ํด๋์ค๋ฅผ ์์ฑํ ๋๋ง๋ค ๋ฐ๋ณต๋๋ ์ฝ๋๊ฐ ์ค์ด๋ฆ. - Flutter DevTools์ ํธํ
→ DevTools์์ ์ฑ ์ํ๋ฅผ ์๊ฐ์ ์๋ก ํ์ธ ๊ฐ๋ฅ. - ๊ณตํต๋ ์๋น ๋ฐฉ๋ฒ ์ ๊ณต
→ Provider.of, Consumer, Selector ๊ฐ์ API๋ฅผ ํ์ฉํ ์ ์์. - ํ์ฅ์ฑ ์ฆ๊ฐ
→ ChangeNotifier ๊ฐ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋, ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๋ ๊ฑธ ๋ง์์ค.
2. Provider์ ์ฌ์ฉ๋ฒ
2.1. ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ ๋(create ์ฌ์ฉ)
Provider๋ ๋จ์ํ ๊ฐ์ ๋ ธ์ถํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ, ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ๊ด๋ฆฌํ๊ณ , ํด์ ํ ์๋ ์๋ค.
(๐จ ์ฃผ์! create๊ฐ ์๋ .value๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ์์์น ๋ชปํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์)
Provider(
create: (_) => MyModel(), // ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑ
child: MyApp(),
);
2.2. ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ ๋ (value ์ฌ์ฉ)
์ด๋ฏธ ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ฅผ Provider๋ฅผ ํตํด ์ ๋ฌํ๋ ค๋ฉด .value๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
final myModel = MyModel();
ChangeNotifierProvider.value(
value: myModel, // ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ๋๋ .value ์ฌ์ฉ!
child: MyApp(),
);
3. Provider์์ ๊ฐ ์ฝ๊ธฐ
3.1. context.watch<T>() → UI ์๋ ์ ๋ฐ์ดํธ
- ์ํ๋ฅผ ๊ฐ์งํ๊ณ ๋ณ๊ฒฝ๋ ๋๋ง๋ค UI๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธํจ.
- build() ํจ์ ๋ด๋ถ์์๋ง ์ฌ์ฉํ ์ ์์.
Text(
context.watch<String>(), // ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด UI ์๋ ์
๋ฐ์ดํธ
);
3.2. context.read<T>() → ๊ฐ ๊ฐ์ ธ์ค๊ธฐ (UI ๋ณ๊ฒฝ ์์)
- ๋จ์ํ ๊ฐ์ ํ ๋ฒ ๊ฐ์ ธ์ค๊ณ , UI ์ ๋ฐ์ดํธ ์์ด ์ฌ์ฉํ ๋ ์ ํฉ.
- build() ํจ์ ์ธ๋ถ์์๋ ์ฌ์ฉํ ์ ์์.
ElevatedButton(
onPressed: () {
print(context.read<Counter>().count); // ์ํ๋ฅผ ์ฝ๊ธฐ๋ง ํจ (UI ๋ณ๊ฒฝ X)
},
child: Text("Print Count"),
);
3.3. context.select<T, R>(R cb(T value)) → ํน์ ๊ฐ๋ง ๊ฐ์ง
- ๊ฐ์ฒด์ ์ผ๋ถ ๊ฐ๋ง ๊ฐ์งํ๊ณ UI๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์ถ์ ๋ ์ฌ์ฉ.
final name = context.select((Person p) => p.name); // name์ด ๋ณ๊ฒฝ๋ ๋๋ง UI ์
๋ฐ์ดํธ
return Text(name);
4. MultiProvider ์ฌ์ฉ๋ฒ
Provider๋ฅผ ์ฌ๋ฌ ๊ฐ ์ค์ฒฉํด์ ์ฌ์ฉํ ๊ฒฝ์ฐ MultiProvider๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๊น๋ํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
MultiProvider(
providers: [
Provider<Something>(create: (_) => Something()),
Provider<SomethingElse>(create: (_) => SomethingElse()),
],
child: MyApp(),
);
5. ProxyProvider ์ฌ์ฉ๋ฒ
ProxyProvider๋ ๋ค๋ฅธ Provider์ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํ๋ค.
๐ ์ฅ์
- Counter๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค Translations ๊ฐ์ฒด๋ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋จ.
- ์ํ ๊ฐ์ ์์กด์ฑ์ ์ค์ ํ ๋ ์ ์ฉํจ.
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => Counter()),
ProxyProvider<Counter, Translations>(
update: (_, counter, __) => Translations(counter.count),
),
],
child: Foo(),
);
}
class Translations {
final int count;
Translations(this.count);
String get title => 'You clicked $count times';
}
'๐ฑFlutter > Flutter Framework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Flutter] ๊ธฐ๋ณธ ์ํ ๊ด๋ฆฌ (State Management) (0) | 2025.02.22 |
---|---|
[Flutter] Flutter ๋ ์ด์์ ์ดํดํ๊ธฐ(Layout) (0) | 2025.02.18 |
[Flutter] ๊ธฐ๋ณธ ๋ ์ด์์์ ๊ตฌ์ฑํ๋ Scaffold ์์ ฏ (0) | 2025.01.20 |
[Flutter] build ๋ฉ์๋ (0) | 2025.01.17 |
[Flutter] ์์ ฏ์ ๋ํด์(Widget) (0) | 2025.01.15 |