miniriverpod ၏ ဒီဇိုင်းမူဝါဒများ.
အပြုအမူကို ရှင်းလင်းအောင် ထားရှိရန် package သည် features များကို ရည်ရွယ်ချက်ရှိရှိ လျှော့ချထားသည်: args ဖြင့် provider identity, Scope မှတစ်ဆင့် scoped injection, နှင့် ခန့်မှန်းနိုင်သော disposal semantics.
Riverpod မှ ဘာတွေ ပြောင်းလဲသလဲ
ထုတ်လုပ်ထားသော family classes နှင့် implicit notifier channels များအစား miniriverpod သည် subclass + args + explicit invoke ကို ဦးစားပေးသည်။
Provider identity
runtimeType + args hash
family အစားထိုး
Provider / AsyncProvider ကို subclass လုပ်ပြီး super.args((...)) ကို pass လုပ်ပါ
DI fallback
Scope<T>.required + overrideWithValue
ဤအရာသည် အဘယ်ကြောင့် အရေးကြီးသနည်း
သာမန် Dart constructors များမှ equality နှင့် overrides ကို အကြောင်းပြနိုင်သည်၊ ထိုကြောင့် debugging နှင့် tests များ ရိုးရှင်းနေသည်။
args ဖြင့် Provider identity
args သည် provider key ကို သတ်မှတ်ပေးသောကြောင့် args တူလျှင် ProviderContainer အတွင်း cache entry တူညီသည်။
Identity rule
လက်တွေ့အကျိုးဆက်များ
- family type သီးသန့် မလိုအပ်ပါ။
- argument တစ်ခုချင်း override ကို provider instances ဖန်တီး၍ လုပ်ဆောင်သည်။
- ခန့်မှန်းနိုင်သော caching အတွက် args ကို တည်ငြိမ်ပြီး immutable အဖြစ် ထားပါ။
ဥပမာ: family ဆန်သော provider + Scope fallback
constructor argument ကို identity အဖြစ် အသုံးပြုပြီး 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(),
);
နောက်ထပ်အဆင့်များ
Provider များနှင့် ဖတ်ရှုခြင်း
watch/read/listen နှင့် AsyncProvider.future အတွက် တိကျသော ပုံစံများကို ကြည့်ပါ။
Provider များ ဖွင့်ရန်ပြောင်းလဲမှုများ
mutation token, mutate, နှင့် ref.invoke ဖြင့် state updates ကို အကောင်အထည်ဖော်ပါ။
Mutations ဖွင့်ရန်