Návrhové princípy za miniriverpodom.

Balík zámerne zužuje funkcie, aby správanie zostalo explicitné: identita providera podľa args, injektovanie v scope a predvídateľná semantika uvoľňovania.

Čo sa mení oproti Riverpodu

Namiesto generovaných family tried a implicitných kanálov notifikácií miniriverpod uprednostňuje subclass + args + explicit invoke.

Identita providera

runtimeType + hash args

alternatíva k family

Zdedte Provider / AsyncProvider a odovzdajte super.args((...))

DI záloha

Scope<T>.required + overrideWithValue

Prečo je to dôležité

O rovnosti a overrideoch môžete uvažovať z bežných Dart konštruktorov, čo udržuje ladenie aj testy jednoduché.

Identita providera s args

args definuje kľúč providera, takže rovnaké args znamenajú rovnakú cache položku v ProviderContaineri.

Pravidlo identity

Praktické dôsledky

- Nie je potrebný vyhradený family typ.
- Prepísanie pre každý argument sa robí vytvorením inštancií providera.
- Udržujte args stabilné a nemenné pre predvídateľné cachovanie.

Príklad: provider podobný family + záložný Scope

Použite argument konštruktora ako identitu a cez Scope vložte záložnú inštanciu.

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);
  }
}

// Vložiť
ProviderScope(
  overrides: [
    ProductProvider.fallback.overrideWithValue(ProductProvider(search: 'jeans')),
  ],
  child: const App(),
);
Scope ponecháva prepojenie závislostí explicitné a vhodné na testovanie.
overrideWithValue funguje pre každú inštanciu providera, vrátane inštancií založených na args.
Správanie autoDispose sa použitím subclass + args nemení.

Ďalšie kroky

Providery a čítanie

Pozrite si konkrétne vzory pre watch/read/listen a AsyncProvider.future.

Otvoriť providery

Mutácie

Implementujte aktualizácie stavu pomocou mutation tokenov, mutate a ref.invoke.

Otvoriť mutácie