miniriverpod ortidagi dizayn tamoyillari.
Bu paket xatti-harakatni aniq saqlash uchun imkoniyatlarni ataylab qisqartiradi: args orqali provider identifikatsiyasi, scope ichida kiritish va oldindan aytish mumkin bo'lgan disposal semantikasi.
Riverpod ga nisbatan nima o'zgaradi
Yaratilgan family class'lar va implicit notifier channel'lar o'rniga miniriverpod subclass + args + explicit invoke ni afzal ko'radi.
Provider identifikatsiyasi
runtimeType + args hash
family ga alternativ
Provider / AsyncProvider ni subclass qiling va super.args((...)) ni uzating
DI fallback
Scope<T>.required + overrideWithValue
Nega bu muhim
Oddiy Dart constructor'laridan equality va override'lar haqida fikr yuritish mumkin, bu debugging va testlarni sodda qiladi.
args bilan Provider identifikatsiyasi
args provider key ni belgilaydi, shuning uchun bir xil args ProviderContainer ichida bir xil cache entry degani.
Identifikatsiya qoidasi
Amaliy oqibatlar
- Alohida family type kerak emas.
- Har bir argument uchun override provider instances yaratish orqali qilinadi.
- Kutiladigan caching uchun args ni barqaror va o'zgarmas holda saqlang.
Misol: family-ga o'xshash provider + Scope fallback
Constructor argument ni identifikator sifatida ishlating va Scope orqali fallback instance kiritib qo'ying.
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);
}
}
// Kiritish
ProviderScope(
overrides: [
ProductProvider.fallback.overrideWithValue(ProductProvider(search: 'jeans')),
],
child: const App(),
);
Keyingi qadamlar
Provider'lar va o'qish
watch/read/listen va AsyncProvider.future uchun aniq pattern'larni ko'ring.
Provider'larni ochishMutation'lar
mutation token'lar, mutate va ref.invoke yordamida state update'larni amalga oshiring.
Mutation'larni ochish