Принсипҳои тарроҳӣ дар паси miniriverpod.
Ин баста хусусиятҳоро қасдан маҳдуд мекунад, то рафтор ошкор бошад: идентификатсияи provider бо args, дарҷкунии scope-ӣ ва семантикаи пешбинишавандаи хориҷкунӣ.
Дар муқоиса бо Riverpod чӣ тағйир меёбад
Ба ҷои class-ҳои generated family ва каналҳои ғайримустақими notifier, miniriverpod subclass + args + explicit invoke-ро авлотар мешуморад.
Provider identity
runtimeType + args hash
family alternative
Provider / AsyncProvider-ро subclass кунед ва super.args((...))-ро гузаронед.
DI fallback
Scope<T>.required + overrideWithValue
Чаро ин муҳим аст
Шумо метавонед баробарӣ ва override-ҳоро аз конструкторҳои оддии Dart таҳлил кунед, ки ин debug ва тестҳоро содда нигоҳ медорад.
Идентификатсияи Provider бо args
args калиди provider-ро муайян мекунад, аз ин рӯ args-и баробар маънои ҳамон cache entry-ро дар дохили ProviderContainer дорад.
Identity rule
Оқибатҳои амалӣ
- No dedicated family type is required.
- Per-argument override is done by creating provider instances.
- Keep args stable and immutable for predictable caching.
Мисол: provider-и ба family монанд + fallback-и Scope
Аргументи конструкторро ҳамчун идентификатор истифода баред ва instance-и эҳтиётиро тавассути 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);
}
}
// Inject
ProviderScope(
overrides: [
ProductProvider.fallback.overrideWithValue(ProductProvider(search: 'jeans')),
],
child: const App(),
);
Қадамҳои навбатӣ
Provider-ҳо ва хондан
Намунаҳои мушаххасро барои watch/read/listen ва AsyncProvider.future бинед.
Provider-ҳоро кушоедMutation-ҳо
Навсозии ҳолатро бо mutation tokens, mutate ва ref.invoke татбиқ кунед.
Mutation-ҳоро кушоед