Sparround

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).
  • ChangeNotifierProviderChangeNotifier dinləyir və notifyListeners() gələndə abunəçiləri yeniləyir.
  • ListenableProvider, ValueListenableProvider — digər Listenable tiplə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.
KonstruktorNə vaxtDispose
`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.

dart
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