miniriverpod-тың артындағы жобалау қағидалары.
Пакет мінез-құлықты айқын ұстау үшін мүмкіндіктерді әдейі тарылтады: args бойынша provider идентификаторы, Scope арқылы scope-талған енгізу және алдын ала болжанатын жою семантикасы.
Riverpod-пен салыстырғанда не өзгереді
Генерацияланған family кластары мен implicit notifier арналар орнына miniriverpod subclass + args + explicit invoke тәсілін артық көреді.
Provider идентификаторы
runtimeType + args hash
family баламасы
Provider / AsyncProvider-ды subclass етіп, super.args((...)) беріңіз.
DI резерві
Scope<T>.required + overrideWithValue
Неліктен бұл маңызды
Қарапайым Dart конструкторларынан теңдік пен override-тарды түсінуге болады, бұл debugging пен tests-ті қарапайым етеді.
args-пен provider идентификаторы
args provider кілтін анықтайды, сондықтан бірдей args ProviderContainer ішіндегі бір cache жазбасын білдіреді.
Идентификатор ережесі
Практикалық салдарлар
- Арнайы family түрі қажет емес.
- Әр аргумент үшін override provider даналарын құру арқылы жасалады.
- Алдын ала болжанатын кэштеу үшін args тұрақты әрі immutable болсын.
Мысал: family-ге ұқсас provider + Scope резерві
Constructor аргументін идентификатор ретінде пайдаланып, Scope арқылы резервтік дананы енгізіңіз.
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);
}
}
// Енгізу
ProviderScope(
overrides: [
ProductProvider.fallback.overrideWithValue(ProductProvider(search: 'jeans')),
],
child: const App(),
);
Келесі қадамдар
Provider-лар және оқулар
watch/read/listen және AsyncProvider.future үшін нақты үлгілерді көріңіз.
Provider-ларды ашуMutations
Mutation token-дар, mutate және ref.invoke арқылы күй жаңартуларын іске асырыңыз.
Mutations ашу