miniriverpod'un arkasındaki tasarım ilkeleri.
Bu paket davranışı açık tutmak için özellikleri bilinçli olarak daraltır: args ile provider kimliği, scope içi enjeksiyon ve öngörülebilir disposal semantiği.
Riverpod'a göre ne değişir
Oluşturulan family sınıfları ve örtük notifier kanalları yerine miniriverpod, subclass + args + açık invoke yaklaşımını tercih eder.
Provider kimliği
runtimeType + args hash
family alternatifi
Provider / AsyncProvider'ı subclass edin ve super.args((...)) ile geçin.
DI yedeği
Scope<T>.required + overrideWithValue
Bu neden önemli
Düz Dart constructor'larından eşitlik ve override'ları akıl yürütebilirsiniz; bu da debug etmeyi ve testleri sade tutar.
args ile Provider kimliği
args, provider anahtarını tanımlar; bu yüzden eşit args, ProviderContainer içinde aynı cache girdisi anlamına gelir.
Kimlik kuralı
Pratik sonuçlar
- Ayrı bir family türü gerekmez.
- Argümana göre override, provider örnekleri oluşturularak yapılır.
- Öngörülebilir cache için args değerlerini sabit ve değişmez tutun.
Örnek: family benzeri provider + Scope yedeği
Bir constructor argümanını kimlik olarak kullanın ve Scope aracılığıyla bir yedek örnek enjekte edin.
class ProductProvider extends AsyncProvider<List<Product>> {
ProductProvider({this.search = ''}) : super.args((search,));
final String search;
static final fallback = Scope<ProductProvider>.required('product.fallback');
@override
FutureOr<List<Product>> build(ref) async {
final api = ref.watch(productsApiProvider);
return api.search(q: search);
}
}
// Enjekte et
ProviderScope(
overrides: [
ProductProvider.fallback.overrideWithValue(ProductProvider(search: 'jeans')),
],
child: const App(),
);
Sonraki Adımlar
Provider'lar ve okumalar
watch/read/listen ve AsyncProvider.future için somut kalıplara bakın.
Provider'ları AçMutasyonlar
mutation token'ları, mutate ve ref.invoke kullanarak durum güncellemelerini uygulayın.
Mutasyonları Aç