miniriverpod артындагы дизайн принциптери.
Пакет жүрүм-турумду ачык кармоо үчүн функцияларды атайылап чектейт: args боюнча провайдер идентификатору, Scope аркылуу инъекция жана алдын ала болжолдоого мүмкүн болгон жок кылуу семантикасы.
Riverpodдон эмнелер өзгөрөт
Жаратылган family класстары жана жашыруун notifier каналдарынын ордуна, miniriverpod subclass + args + explicit invoke ыкмасын артык көрөт.
Провайдер идентификатору
runtimeType + args hash
family альтернативасы
Provider / AsyncProvider'ды subclass кылып, super.args((...)) өткөрүңүз.
DI fallback
Scope<T>.required + overrideWithValue
Эмне үчүн бул маанилүү
Жөн гана Dart constructor'лорунан теңдик жана override жөнүндө ой жүгүртө аласыз, бул debugging менен тесттерди жөнөкөй кылат.
args менен Провайдер идентификаторы
args провайдердин ачкычын аныктайт, ошондуктан args бирдей болсо, ProviderContainer ичиндеги cache entry да бирдей болот.
Идентификатор эрежеси
Практикалык кесепеттер
- Өзүнчө family түрү талап кылынбайт.
- Аргумент боюнча override провайдер instance'терин түзүү менен жасалат.
- Алдын ала болжолдуу кэш үчүн args туруктуу жана immutable болсун.
Мисал: family сыяктуу провайдер + Scope fallback
Constructor аргументин идентификатор катары колдонуп, Scope аркылуу fallback instance'ти киргизиңиз.
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(),
);
Кийинки кадамдар
Провайдерлер жана окуулар
watch/read/listen жана AsyncProvider.future үчүн конкреттүү ыкмаларды көрүңүз.
Провайдерлерди ачууMutation'дар
mutation token'дор, mutate жана ref.invoke аркылуу state жаңыртууларын ишке ашырыңыз.
Mutation'дарды ачуу