Provider ağacı: create, .value, dispose
package:provider özünü belə təsvir edir: InheritedWidget-ləri daha rahat və təkrar istifadəyə yararlı edən örtük. Praktikada üç işi görür: obyekti ağaca yerləşdirir, onun ömrünü idarə edir və oxuyanlara abunəlik verir.
Əsas provider növləri:
Provider— dəyişməyən obyekt (repository, service, konfiqurasiya).ChangeNotifierProvider—ChangeNotifierdinləyir vənotifyListeners()gələndə abunəçiləri yeniləyir.ListenableProvider,ValueListenableProvider— digərListenabletipləri üçün.FutureProvider,StreamProvider— async mənbələr üçün.ProxyProvider— bir provider-in dəyərindən asılı olan provider.MultiProvider— dərin yuvalanmanın qarşısını alan siyahı forması; sənəd oxunaqlılıq üçün onu tövsiyə edir.
| Konstruktor | Nə vaxt | Dispose |
|---|---|---|
| `ChangeNotifierProvider(create: ...)` | Obyekti **burada yaradırsınız** | Provider ağacdan çıxanda `dispose()` avtomatik çağırılır |
| `ChangeNotifierProvider.value(value: ...)` | Obyekt **artıq mövcuddur** (başqa yerdə yaradılıb, testdə fake-dir) | Provider onu söküb atmır — sahibi kimdirsə, o məsuliyyət daşıyır |
Sənədin birbaşa xəbərdarlığı: obyekt yaratmaq üçün .value konstruktorundan istifadə etməyin — arzuolunmaz yan effektlər verə bilər; əksinə, mövcud obyekti create ilə vermək o obyektin hələ istifadədə olduğu halda dispose olunmasına səbəb ola bilər. Praktik yaddaş qaydası: `create` = mən yaradıram, provider söksün; `.value` = başqası yaratdı, provider toxunmasın.
void main() {
final api = ApiClient(); // tətbiqin ömrü boyu yaşayır
runApp(
MultiProvider(
providers: [
// Dəyişməyən obyekt: yalnız ötürülür.
Provider<ApiClient>.value(value: api),
// Repository api-dan asılıdır → ProxyProvider.
ProxyProvider<ApiClient, TodoRepository>(
update: (_, client, previous) => previous ?? TodoRepository(client),
),
// State: burada yaradılır, ona görə provider dispose edəcək.
ChangeNotifierProvider(
create: (context) => CartModel(context.read<TodoRepository>()),
),
// lazy: false → ilk oxunuşu gözləmədən dərhal yaradılır.
ChangeNotifierProvider(
create: (_) => AuthModel()..restoreSession(),
lazy: false,
),
],
child: const MyApp(),
),
);
}Tipik kök: MultiProvider ilə service-lər və notifier-lər.
📚 Mənbələr və sənədlər
- package:providerrəsmipub.dev
create və .value fərqi, MultiProvider və bütün provider növləri README-də sadalanıb.
- Sadə app state idarəetməsirəsmidocs.flutter.dev
Flutter komandasının ChangeNotifierProvider ilə rəsmi addım-addım nümunəsi.
- ChangeNotifier APIrəsmiapi.flutter.dev