miniriverpod-এর পেছনের নকশা নীতি।
প্যাকেজটি ইচ্ছাকৃতভাবে বৈশিষ্ট্য সংকুচিত করে, যাতে আচরণ স্পষ্ট থাকে: args দিয়ে provider identity, scoped injection, এবং predictable disposal semantics।
Riverpod থেকে কী বদলায়
জেনারেটেড family classes এবং implicit notifier channel-এর বদলে, miniriverpod subclass + args + explicit invoke পছন্দ করে।
Provider identity
runtimeType + args hash
family alternative
Subclass Provider / AsyncProvider এবং super.args((...)) পাস করুন
DI fallback
Scope<T>.required + overrideWithValue
এটি কেন গুরুত্বপূর্ণ
সাধারণ Dart constructor দিয়ে equality এবং override নিয়ে যুক্তি করা যায়, যা debugging এবং test-কে সহজ রাখে।
args সহ Provider identity
args provider key নির্ধারণ করে, তাই সমান args মানে ProviderContainer-এর ভিতরে একই cache entry।
Identity rule
ব্যবহারিক ফলাফল
- আলাদা family type প্রয়োজন নেই.
- প্রতিটি argument-এর জন্য override provider instance তৈরি করে করা হয়.
- পূর্বানুমেয় caching-এর জন্য args স্থির এবং অপরিবর্তনীয় রাখুন.
উদাহরণ: family-এর মতো provider + Scope fallback
একটি constructor argument-কে identity হিসেবে ব্যবহার করুন এবং Scope-এর মাধ্যমে একটি fallback instance inject করুন।
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(),
);
পরবর্তী পদক্ষেপ
Providers এবং Reads
watch/read/listen এবং AsyncProvider.future-এর জন্য নির্দিষ্ট pattern দেখুন।
Provider খুলুনMutations
mutation tokens, mutate, এবং ref.invoke দিয়ে state update বাস্তবায়ন করুন।
Mutations খুলুন