Provider — 2019-cu ildə Remi Roussel tərəfindən InheritedWidget üzərində qurulmuş Flutter üçün vəziyyətin idarə edilməsi paketi. Provider, props drilling olmadan məlumatların vidjet ağacında aşağı ötürülməsi problemini həll edir: istənilən vidjet context.read<T>() və ya context.watch<T>() vasitəsilə vəziyyətə giriş əldə edir. pub.dev məlumatlarına görə, Provider 25 mindən çox bəyənmə ilə Flutter-in ən populyar vəziyyət meneceridir.
Əsas məqamlar
Provider — InheritedWidget üzərində qurulmuş Flutter-də vəziyyətin idarə edilməsi və asılılıqların inject edilməsi üçün paket. Provider vidjet ağacında obyekti (vəziyyət, xidmət, depozitoriya) təqdim edir və məlumat dəyişdikdə UI-ni avtomatik yenidən qurur. InheritedWidget-in birbaşa istifadəsindən fərqli olaraq, Provider bütün boilerplate-i aradan qaldırır: InheritedWidget alt sinfi yazmaq, statik of() metodu qurmaq və iç-içəliyi idarə etmək lazım deyil.
Provider — Google tərəfindən Flutter-də vəziyyətin idarə edilməsi üçün rəsmi olaraq tövsiyə edilən üsuldur (Flutter Team, 2019-2023). Paket Flutter Ecosystem-ə daxildir və Flutter komandası tərəfindən dəstəklənir. Buraxıldığı anda Provider qlobal dəyişənlərə və InheritedWidget-ə alternativ olaraq təklif edilmişdi: istənilən obyekt konstruktor vasitəsilə ötürülmədən istənilən yerdən əlçatandır.
Flutter Community Survey 2025 məlumatlarına görə, Provider Flutter tətbiqlərinin 72%-də istifadə olunur. Populyarlığın əsas səbəbləri: minimal giriş həddi, ChangeNotifier-in daxili dəstəyi, digər arxitekturalarla (MVVM, BLoC) uyğunluq və xarici asılılıqların olmaması.
ChangeNotifier — Listener nümunəsini həyata keçirən Flutter-in daxili sinfi. ChangeNotifier notifyListeners() çağırışı vasitəsilə abunəçilərə dəyişiklik barədə məlumat verir. Provider kontekstində ChangeNotifier vəziyyət üçün əsas sinifdir: məlumatları dəyişdikdən sonra notifyListeners() çağıran sahələri və metodları olan ChangeNotifier varisi sinif yaradılır.
class CounterProvider extends ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
void reset() {
_count = 0;
notifyListeners();
}
}notifyListeners qaydaları: məlumat tam dəyişdikdən sonra çağırın — metodun ortasında deyil, sonunda. Əgər metod bir neçə dəyişiklik edirsə, hər dəyişiklikdən sonra deyil, bütün dəyişikliklərdən sonra bir dəfə notifyListeners() çağırın. Bu, bir məntiqi addımda çoxsaylı yenidən çəkilmələrin qarşısını alır. Kütləvi yeniləmələr üçün notifyListeners-i setState-ə bənzər nümunələrlə birlikdə istifadə edin.
ChangeNotifier alternativləri: ValueNotifier — tək dəyər üçün (primitivlər üçün yaxşıdır), StateNotifier — state_notifier paketindən (nadir hallarda ayrıca istifadə olunur). Provider həllərinin əksəriyyəti daxili dəstək və sadəliyə görə ChangeNotifier istifadə edir.
Consumer — ChangeNotifier-ə abunə olan və hər notifyListeners() çağırışında yenidən qurulan vidjet. Consumer üç parametrli builder funksiyası qəbul edir: context, model, child. Child — modeldən asılı olmayan, Consumer-in yenidən qurmadığı vidjet. Bu optimallaşdırmadır: əgər Consumer-in daxilində statik vidjet varsa (ikona, məlumatsız mətn), o child vasitəsilə ötürülür və yenidən yaradılmır.
Consumer<CounterProvider>(
builder: (context, provider, child) => Column(
children: [
child!, // yenidən qurulmur
Text('${provider.count}'),
ElevatedButton(
onPressed: () => provider.increment(),
child: Icon(Icons.add),
),
],
),
child: Text('Sayğac:'),
)context.watch — Provider-ə abunə olmaq üçün BuildContext genişləndirmə metodu. Modeli qaytarır və cari vidjeti onun dəyişikliklərinə abunə edir. context.read — abunəsiz giriş (onPressed, initState və dispose handler-ləri üçün). context.select — digər sahələr dəyişdikdə yenidən qurulmadan modelin ayrıca sahəsinə abunəlik. Select 10+ sahəsi olan mürəkkəb modellər üçün ən məhsuldar variantdır.
Consumer, watch və ya select nə vaxt istifadə edilməlidir: Consumer — optimallaşdırma üçün child-vidjet lazım olduqda. watch — build metodunda sadə oxuma üçün. select — modelin çox sahəsi olduqda, lakin vidjet yalnız birindən asılı olduqda. Provider vidjet məhv edildikdə avtomatik abunəni ləğv edir, yaddaş sızmalarının qarşısını alır.
MultiProvider — iç-içə olmadan bir neçə Provider-i qeydiyyatdan keçirmək üçün vidjet. 5 səviyyəli Provider → Provider → Provider ağacı əvəzinə, MultiProvider provider-ların siyahısını qəbul edir. Hər sonrakı Provider əvvəlkilərdən konstruktor vasitəsilə istifadə edə bilər. MultiProvider tətbiqin kök səviyyəsini təşkil etmək üçün standart üsuldur.
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => CartProvider()),
ChangeNotifierProvider(create: (_) => AuthProvider()),
ProxyProvider<AuthProvider, OrderProvider>(
update: (_, auth, __) => OrderProvider(auth.userId),
),
],
child: MaterialApp(home: HomePage()),
)ProxyProvider — başqa Provider-dən asılı olan Provider. ProxyProvider digər provider-lardan dəyərləri alır və onları öz obyektinə ötürür. Məsələn, OrderProvider AuthProvider-dən asılıdır (userId lazımdır). AuthProvider dəyişdikdə ProxyProvider avtomatik olaraq OrderProvider-i yeni userId ilə yenidən yaradır. ChangeNotifierProxyProvider — ChangeNotifier üçün ProxyProvider versiyası.
StreamProvider və FutureProvider: StreamProvider Stream-ə (Firebase, WebSocket) abunə olur və hər yeni hadisədə Consumer-i yeniləyir. FutureProvider — asinxron inisializasiya üçün: Future işə salır, yüklənməni göstərir, sonra nəticəni vidjetlərə ötürür. Hər ikisi abunələrin əl ilə idarə edilməsi olmadan tipik vəzifələri həll edir.
Provider test edilir vidjetin test dəyərləri ilə MultiProvider-ə bükülməsi ilə. Test üçün real API və ya verilənlər bazası lazım deyil — Provider mock obyektlə əvəz edilir. provider paketi testlərin izolyasiyası üçün ProviderScope təqdim edir — hər test digərlərindən asılı olmayaraq öz Provider ağacını yaradır.
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('Counter increments on button tap',
(tester) async {
await tester.pumpWidget(
ChangeNotifierProvider(
create: (_) => CounterProvider(),
child: CounterScreen(),
),
);
await tester.tap(find.byKey(Key('increment')));
await tester.pump();
expect(find.text('1'), findsOneWidget);
},
);
}MockProvider: API-dən asılı olan Provider ilə vidjetləri test etmək üçün zastavka alt sinfi yaradın və ya mockito / mocktail istifadə edin. Provider xüsusi mock alətləri tələb etmir — ChangeNotifier-dən varis olan istənilən obyekt real xidməti çağırmadan create vasitəsilə ötürülə bilər. Asan dəyişdirmə üçün Provider-i interfeyslər (abstract class) vasitəsilə proqramlaşdırın.
Provider performansı InheritedWidget-ə əsaslanır: Provider dəyişdikdə context.watch və ya Consumer vasitəsilə abunə olan bütün vidjetlər yenidən qurulur. Lazımsız yenidən çəkilmələrin qarşısını almaq üçün context.select (konkret sahəyə abunəlik), Consumer child parametri ilə və statik vidjetlər üçün const istifadə edin. Provider dəyişikliklərə abunə olmayan ağac budaqlarını yenidən qurmur.
| Metod | Abunəlik | Yenidən çəkilmə | İstifadə |
|---|---|---|---|
| context.watch | Tam model | İstənilən dəyişiklik | Sadə vidjetlər |
| Consumer | Tam model | İstənilən dəyişiklik | Child optimallaşdırması ilə |
| context.select | Konkret sahə | Yalnız sahə dəyişdikdə | Mürəkkəb modellər |
| context.read | Yox | Heç vaxt | Hadisə handler-ləri |
Məhdudiyyətlər: Provider biznes məntiqinin Event səviyyəsində izolyasiyasını dəstəkləmir (BLoC kimi). Bütün dəyişikliklər ChangeNotifier metodlarının birbaşa çağırılması ilə baş verir ki, bu da nəzarətsiz dəyişiklik zəncirlərinə səbəb ola bilər. Mürəkkəb ssenarilərdə (çoxsaylı asinxron əməliyyatlar, mürəkkəb validasiya) Provider BLoC və Riverpod-dan geri qalır.
Provider-dan miqrasiya: Provider digər paketlərlə asanlıqla birləşdirilir. Riverpod-a keçmək üçün ChangeNotifierProvider.adaptive — mövcud ChangeNotifier-ləri yenidən yazmadan Riverpod ilə istifadə etməyə imkan verən adapterdən istifadə edin. BLoC üçün — BlocProvider Provider ağacı daxilində yerləşdirilə bilər, tədricən ChangeNotifier-i Bloc ilə əvəz edir.
Tez-tez verilən suallar
Provider — ChangeNotifier ilə asılılıqların inject edilməsi üçün InheritedWidget üzərində qurulmuş örtük. BLoC — məntiqi izolyasiya etmək üçün Event + Stream ilə arxitektura nümunəsi. Provider öyrənmək daha asandır, BLoC kodu daha ciddi strukturlaşdırır. Provider kiçik tətbiqlər və UI vəziyyəti üçün uyğundur, BLoC — mürəkkəb biznes məntiqi üçün. Flutter Community 2025 məlumatlarına görə, hər ikisi tez-tez bir layihədə birlikdə istifadə olunur.
ChangeNotifierProvider — ChangeNotifier nümunələri üçün Provider tipi. Obyekti create vasitəsilə yaradır, onu övladlara təqdim edir və notifyListeners çağırıldıqda Consumer-i yenidən qurur. ChangeNotifierProvider ağacdan silindikdə ChangeNotifier-də avtomatik dispose çağırır. Üç yaradılma üsulu var: ChangeNotifierProvider.value (mövcud obyekt üçün), ChangeNotifierProvider (lazy-yaratma üçün) və ChangeNotifierProvider.create (açıq lazy üçün).
context.watch əvəzinə context.select istifadə edin — vidjet yalnız seçilmiş sahə dəyişdikdə yenidən çəkilir. Böyük ChangeNotifier-ləri bir neçə kiçikə bölün (bir model — bir məsuliyyət). Statik hissələr üçün Consumer child istifadə edin. Siyahılar üçün açarlarla ListView.builder tətbiq edin. Provider DevTools (Flutter Inspector) hansı vidjetlərin yenidən çəkildiyini və niyə olduğunu göstərir.
Bəli. Provider (ChangeNotifier olmadan) — dəyişməz obyektlərin (depozitoriya, API-klient, konfiqurasiya) inject edilməsi üçün. ValueListenableProvider — ValueNotifier üçün. StreamProvider — Stream (Firebase, WebSocket) üçün. FutureProvider — Future (başlanğıcda konfiqurasiya yükləmə) üçün. ProxyProvider — digər Provider-lərdən asılı olan Provider üçün. ChangeNotifier yalnız UI yeniləməsi ilə mutasiya olunan vəziyyət üçün lazımdır.
ProviderNotFoundException — vidjet ağacında yuxarıda elan edilməmiş Provider-i əldə etməyə cəhd etdikdə yaranan runtime istisnası. Tez-tez rast gəlinən səbəblər: Provider onu oxumağa çalışan vidjetdən aşağıda elan edilib; Provider bir marşrutda elan edilib, digərində oxunur; tipdə səhv. Həlli: Provider-i ağacda yuxarı qaldırın və ya qlobal asılılıqlar üçün MaterialApp səviyyəsində MultiProvider istifadə edin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun