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.
// ❌ 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ət | Yanaş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
- package:provider — ProxyProviderrəsmipub.dev
"Dəyişə bilən dəyərlərdən create içində obyekt yaratmayın" qaydası README-dədir.
- Provider vs Riverpod (rəsmi müqayisə)rəsmiriverpod.dev
ProxyProvider → ref.watch və ChangeNotifierProxyProvider → ref.listen uyğunluğu.
- Flutter arxitektura bələdçisi: layer-lərrəsmidocs.flutter.dev
Repository və service-in bir-birindən asılılığı haqqında rəsmi qaydalar.