Provider'ları kapsamlama
Kapsamlama (scoping), bir provider'ın davranışını yalnızca uygulamanızın küçük bir bölümü için değiştirme işlemidir.
Şunlar için kullanışlıdır:
- Sayfaya/widget'a özel özelleştirme (örneğin uygulamanızın temasını yalnızca belirli bir sayfa için değiştirmek)
- Performans optimizasyonu (örneğin bir
ListViewiçinde yalnızca değişen öğeyi yeniden oluşturmak) - Parametreleri elden ele taşımak zorunda kalmamak (örneğin Family için)
Kapsamlama, uygulamanızın kökü olmayan ProviderContainers/ProviderScopes içindeki bir provider'ı geçersiz kılarak, Provider'ları geçersiz kılma aracılığıyla gerçekleştirilir.
Kapsamlama özelliği oldukça karmaşıktır ve gelecekte daha kullanışlı hale getirmek için büyük olasılıkla yeniden düzenlenecektir.
Dikkatli ilerleyin.
Kapsamlı bir provider tanımlamak
Riverpod varsayılan olarak bir provider'ı kapsamlamanıza izin vermez. Bu özelliği kullanmak için
provider üzerinde dependencies belirterek açıkça devreye almanız gerekir.
Uygulamanızdaki ilk kapsamlı provider genellikle dependencies: [] belirtir.
Aşağıdaki kod parçası, o anda gösterilmekte olan öğenin ID'sini sunan kapsamlı bir provider tanımlar:
- riverpod
- riverpod_generator
final currentItemIdProvider = Provider<String?>(
dependencies: const [],
(ref) => null,
);
(dependencies: [])
String? currentItemId(Ref ref) => null;
Kapsamlı bir provider'ı dinlemek
Kapsamlı bir provider'ı dinlemek için, Ref'ler elde ederek (örneğin Consumer'lar ile) provider'ı her zamanki gibi kullanın.
final currentItemId = ref.watch(currentItemIdProvider);
Bir provider kapsamlı bir provider'ı dinliyorsa, o kapsamlı provider'ın,
kendisini dinleyen provider'ın dependencies listesine dahil edilmesi gerekir:
- riverpod
- riverpod_generator
final currentItemProvider = FutureProvider<Item?>(
dependencies: [currentItemIdProvider],
(ref) async {
final currentItemId = ref.watch(currentItemIdProvider);
if (currentItemId == null) return null;
// Fetch the item from a database or API
return fetchItem(id: currentItemId);
},
);
(dependencies: [currentItemId])
Future<Item?> currentItem(Ref ref) async {
final currentItemId = ref.watch(currentItemIdProvider);
if (currentItemId == null) return null;
// Fetch the item from a database or API
return fetchItem(id: currentItemId);
}
dependencies içinde yalnızca kapsamlı provider'ları listelemeniz gerekir.
Kapsamlı olmayan provider'ları listelemenize gerek yoktur.
Kapsamlı bir provider'ın değerini belirlemek
Kapsamlı bir provider'ın değerini belirlemek için Provider'ları geçersiz kılma kullanabilirsiniz.
Tipik bir örnek, ProviderScope üzerinde overrides belirtmektir:
class HomePage extends StatelessWidget {
const HomePage({super.key});
Widget build(BuildContext context) {
return ProviderScope(
overrides: [
currentItemIdProvider.overrideWithValue('123'),
],
// The detail page will rely on '123' as the current item ID, without
// having to pass it explicitly.
child: const DetailPageView(),
);
}
}