Sparround

Kompozisiya: ProxyProvider və asılılıqlar

Real tətbiqdə obyektlər bir-birindən asılıdır: repository API client-dən, view model repository-dən. Provider sənədinin birbaşa qaydası: `create` daxilində zamanla dəyişə bilən dəyərlərdən obyekt yaratmayın — bunun üçün `ProxyProvider` var.

Səbəb sadədir: create yalnız bir dəfə çağırılır. Əgər obyekti başqa provider-in cari dəyəri ilə qurursunuzsa və o dəyər sonra dəyişirsə, sizin obyekt köhnə asılılıqla qalır.

ProxyProvider<A, R> isə update callback-i ilə işləyir: A dəyişdikdə update yenidən çağırılır və R yenilənir. previous parametri əvvəlki R-i verir — obyekti yenidən yaratmaq yerinə təkrar istifadə etmək üçün.

dart
// ❌ create bir dəfə işləyir: auth token sonra dəyişsə, repository köhnə token ilə qalır.
MultiProvider(
  providers: [
    ChangeNotifierProvider(create: (_) => AuthModel()),
    Provider<TodoRepository>(
      create: (context) => TodoRepository(context.read<AuthModel>().token),
    ),
  ],
  child: const MyApp(),
);

// ✅ ProxyProvider: AuthModel bildiriş verdikdə update yenidən çağırılır.
MultiProvider(
  providers: [
    ChangeNotifierProvider(create: (_) => AuthModel()),
    ProxyProvider<AuthModel, TodoRepository>(
      update: (_, auth, previous) => TodoRepository(auth.token),
    ),
  ],
  child: const MyApp(),
);

// ✅ Notifier asılıdırsa: ChangeNotifierProxyProvider + previous ilə təkrar istifadə.
ChangeNotifierProxyProvider<TodoRepository, TodoListModel>(
  create: (context) => TodoListModel(context.read<TodoRepository>()),
  update: (_, repo, previous) => (previous ?? TodoListModel(repo))..updateRepository(repo),
);

Asılı obyektin düzgün və səhv qurulması.

VəziyyətYanaşma
Asılılıq heç vaxt dəyişmir (API client, config)Sadə `Provider` + `create` içində `context.read`
Asılılıq zamanla dəyişir (token, seçilmiş dil, user id)`ProxyProvider` — `update` hər dəyişiklikdə işləyir
Asılı obyektin özü `ChangeNotifier`-dir`ChangeNotifierProxyProvider` + `previous` ilə təkrar istifadə
İki və daha çox asılılıq`ProxyProvider2`…`ProxyProvider6`

Riverpod-un rəsmi müqayisə səhifəsi bunu belə ifadə edir: Riverpod-da ProxyProvider-in ekvivalenti provider-in içində sadəcə ref.watch() çağırmaqdır — dəyər dəyişdikdə asılı provider avtomatik yenidən hesablanır. Müsahibədə bu müqayisə "niyə Riverpod?" sualına konkret texniki arqument verir: kompozisiya ayrı bir provider növü tələb etmir.

📚 Mənbələr və sənədlər