Dizaino principai, slypintys už miniriverpod.
Šis paketas sąmoningai siaurina galimybes, kad elgsena išliktų aiški: providerio tapatybė pagal args, įterpimas per Scope ir nuspėjama atlaisvinimo semantika.
Kas keičiasi lyginant su Riverpod
Vietoje sugeneruotų family klasių ir implicit notifier kanalų miniriverpod teikia pirmenybę poklasiui + args + aiškiam invoke.
Providerio tapatybė
runtimeType + args hash
family alternatyva
Paveldėkite Provider / AsyncProvider ir perduokite super.args((...))
DI atsarginis variantas
Scope<T>.required + overrideWithValue
Kodėl tai svarbu
Apie lygybę ir override galite samprotauti iš paprastų Dart konstruktorių, todėl derinimas ir testai išlieka paprasti.
Providerio tapatybė su args
args apibrėžia providerio raktą, todėl vienodi args reiškia tą patį cache įrašą ProviderContainer viduje.
Tapatybės taisyklė
Praktinės pasekmės
- Specialaus family tipo nereikia.
- Override pagal argumentą daromas sukuriant providerio egzempliorius.
- Laikykite args stabilius ir nekeičiamus, kad cache būtų nuspėjamas.
Pavyzdys: family tipo providerį primenantis provideris + Scope atsarginis variantas
Naudokite konstruktoriaus argumentą kaip tapatybę ir per Scope įterpkite atsarginį egzempliorių.
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);
}
}
// Įterpimas
ProviderScope(
overrides: [
ProductProvider.fallback.overrideWithValue(ProductProvider(search: 'jeans')),
],
child: const App(),
);
Kiti žingsniai
Provideriai ir skaitymas
Peržiūrėkite konkrečius watch/read/listen ir AsyncProvider.future modelius.
Atidaryti provideriusMutacijos
Įgyvendinkite būsenos atnaujinimus naudodami mutation tokenus, mutate ir ref.invoke.
Atidaryti mutacijas