Provider
Provider๋ Flutter์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
โข
ChangeNotifier๋ฅผ ํ์ฉํ ์ํ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ฉฐ, ์์กด์ฑ ์ฃผ์
(DI) ๊ธฐ๋ฅ๋ ์ง์
โข
๋น๊ต์ ๊ฐ๋จํ ์ฑ์์ ์ฌ์ฉํ๊ธฐ ์ข์ผ๋ฉฐ, Flutter ๊ณต์์ ์ผ๋ก ๊ถ์ฅํ๋ ๋ฐฉ์
Provider์ ํต์ฌ ๊ฐ๋
์ฃผ์ ๊ฐ๋
๊ฐ๋
| ์ค๋ช
|
ChangeNotifier | ์ํ ๋ณํ๋ฅผ ์๋ฆฌ๋ ํด๋์ค |
ChangeNotifierProvider | ChangeNotifier๋ฅผ UI์ ์ฐ๊ฒฐ |
Consumer | ์ํ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ฌ UI ์
๋ฐ์ดํธ |
Provider.of() | Provider์์ ์ง์ ์ํ ๊ฐ์ ธ์ค๊ธฐ |
context.watch() | ์ํ ๋ณํ๋ฅผ ๊ฐ์งํ์ฌ ๋น๋ |
context.read() | ์ํ ๋ณํ๋ฅผ ๊ฐ์งํ์ง ์๊ณ ์ฝ๊ธฐ |
Provider์ ์ฃผ์ ๊ธฐ๋ฅ๊ณผ ํน์ง
1. ๊ฐ๋จํ ์ํ ๊ด๋ฆฌ
โข
ChangeNotifier๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ณ UI์ ๋ฐ์
โข
notifyListeners()๋ฅผ ํธ์ถํ๋ฉด ์๋์ผ๋ก UI ์
๋ฐ์ดํธ
2. ์์กด์ฑ ์ฃผ์
(DI) ์ง์
โข
MultiProvider๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ํ๋ฅผ ์ ์ญ์ผ๋ก ๊ด๋ฆฌ ๊ฐ๋ฅ
3. ๊ฐ๋จํ ๋น๋๊ธฐ ์ํ ๊ด๋ฆฌ ์ง์
โข
FutureProvider, StreamProvider๋ฅผ ํ์ฉํ์ฌ ๋น๋๊ธฐ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๊ฐ๋ฅ
Provider ์ฝ๋ ์์ (Counter ์ฑ)
ChangeNotifier ์ฌ์ฉ ์์ (์ํ ๊ด๋ฆฌ)
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
// ChangeNotifier๋ฅผ ์ฌ์ฉํ ์ํ ๊ด๋ฆฌ ํด๋์ค
class CounterProvider extends ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners(); // UI ์
๋ฐ์ดํธ
}
void decrement() {
_count--;
notifyListeners(); // UI ์
๋ฐ์ดํธ
}
}
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => CounterProvider(),
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text("Provider ์์ ")),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// ์ํ ๋ณ๊ฒฝ ๊ฐ์งํ์ฌ UI ์
๋ฐ์ดํธ
Consumer<CounterProvider>(
builder: (context, counter, child) {
return Text('${counter.count}', style: TextStyle(fontSize: 40));
},
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () => context.read<CounterProvider>().increment(),
child: Text("+"),
),
SizedBox(width: 20),
ElevatedButton(
onPressed: () => context.read<CounterProvider>().decrement(),
child: Text("-"),
),
],
)
],
),
),
);
}
}
Dart
๋ณต์ฌ
Provider์ ๋ค์ํ ๊ธฐ๋ฅ
MultiProvider ์ฌ์ฉ (์ฌ๋ฌ Provider ๋ฑ๋ก)
void main() {
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => CounterProvider()),
ChangeNotifierProvider(create: (context) => AnotherProvider()),
],
child: MyApp(),
),
);
}
Dart
๋ณต์ฌ
๋น๋๊ธฐ ์ํ ๊ด๋ฆฌ (FutureProvider)
final futureProvider = FutureProvider<int>((ref) async {
await Future.delayed(Duration(seconds: 2));
return 42;
});
Consumer<int>(
builder: (context, value, child) {
return Text(value.toString());
},
);
Dart
๋ณต์ฌ
Provider vs ๋ค๋ฅธ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋น๊ต
๊ธฐ๋ฅ | Provider | Riverpod | GetX | Bloc |
์ํ ๊ด๋ฆฌ ๋ฐฉ์ | ChangeNotifier | StateNotifier | obs | ์ด๋ฒคํธ ๊ธฐ๋ฐ |
๋น๋๊ธฐ ์ง์ | ||||
์์กด์ฑ ๊ด๋ฆฌ (DI) | ||||
์ฑ๋ฅ ์ต์ ํ | ||||
ํ
์คํธ ์ฉ์ด์ฑ |
Provider๊ฐ ์ ํฉํ ๊ฒฝ์ฐ
์ํฉ | Provider ์ฌ์ฉ ์ฌ๋ถ |
๊ฒฐ๋ก : ์ธ์ Provider๋ฅผ ์จ์ผ ํ ๊น?
โข
๊ฐ๋จํ ์ฑ์์ ๋น ๋ฅด๊ฒ ์ํ ๊ด๋ฆฌ๋ฅผ ์ ์ฉํ ๋
โข
๋ณต์กํ ์ํ ๊ด๋ฆฌ๊ฐ ํ์ํ์ง ์์ ๋
โข
Flutter ๊ธฐ๋ณธ ๋ฐฉ์์ ์ต์ํ ๊ฐ๋ฐ์์๊ฒ ์ ํฉ