Search

Provider

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
์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜
๋น„๋™๊ธฐ ์ง€์›
๊ฐ€๋Šฅ (FutureProvider)
๊ฐ•๋ ฅํ•จ (FutureProvider)
๊ฐ„ํŽธํ•จ
Stream ์ง€์›
์˜์กด์„ฑ ๊ด€๋ฆฌ (DI)
๊ธฐ๋ณธ ์ œ๊ณต ์—†์Œ
ProviderScope ์ง€์›
Get.put() ์ง€์›
RepositoryProvider
์„ฑ๋Šฅ ์ตœ์ ํ™”
๊ธฐ๋ณธ์  (์ „์ฒด ๋ฆฌ๋นŒ๋“œ ๊ฐ€๋Šฅ)
watch() ์ตœ์ ํ™”
GetBuilder๋กœ ์ตœ์ ํ™”
BlocListener
ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ
๊ฐ€๋Šฅ
์šฐ์ˆ˜
๋‹ค์†Œ ๋ถ€์กฑ
๋งค์šฐ ์šฐ์ˆ˜

Provider๊ฐ€ ์ ํ•ฉํ•œ ๊ฒฝ์šฐ

์ƒํ™ฉ
Provider ์‚ฌ์šฉ ์—ฌ๋ถ€
์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ
์ถ”์ฒœ
๊ฐ„๋‹จํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ํ•„์š”
์ถ”์ฒœ
๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ
Bloc ๋˜๋Š” Riverpod ์ถ”์ฒœ
์˜์กด์„ฑ ์ฃผ์ž…์ด ๋งŽ์€ ๊ฒฝ์šฐ
Riverpod ์ถ”์ฒœ

๊ฒฐ๋ก : ์–ธ์ œ Provider๋ฅผ ์จ์•ผ ํ• ๊นŒ?

โ€ข
๊ฐ„๋‹จํ•œ ์•ฑ์—์„œ ๋น ๋ฅด๊ฒŒ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์ ์šฉํ•  ๋•Œ
โ€ข
๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ
โ€ข
Flutter ๊ธฐ๋ณธ ๋ฐฉ์‹์— ์ต์ˆ™ํ•œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ ํ•ฉ
Provider๋Š” ๊ฐ„๋‹จํ•˜์ง€๋งŒ, ๋ณต์žกํ•œ ์•ฑ์—์„œ๋Š” Riverpod ๋˜๋Š” Bloc์ด ๋” ์ ํ•ฉ!