Dart Programming

Dart အခြေခံများ Part 4 (StreamController and StreamTransformer)

အရင်အပိုင်းတွေကို ဖတ်ချင်ရင်တော့

ကျွန်တော်တို့ အပိုင်း (၂) (၃) တွေမှာ Streams အကြောင်းကို ပြောခဲ့ပြီး ဖြစ်ပါတယ်။ ဒီအပိုင်းမှာတော့ StreamController နဲ့ StreamTransformer တွေအကြောင်း ပြောမှာ ဖြစ်ပါတယ်။ ဒီအပိုင်းကို နားလည်ဖို့ အပိုင်း (၁) ကနေ (၃) အထိ လေ့လာထားဖို့ လိုအပ်မှာ ဖြစ်ပါတယ်။

StreamController ဆိုတာ ဘာလဲ

StreamController ဆိုတာက​တော့ ကျွန်တော်တို့ အပေါ်မှာ ရေးခဲ့တာတွေ လွယ်သွားအောင် ကူညီးပေးတဲ့ Controller တစ်ခုဖြစ်ပါတယ်။ Factory Pattern ပုံစံ Create လုပ်ပေးရမှာ ဖြစ်ပါတယ်။

factory StreamController(
    {void onListen(),
    void onPause(),
    void onResume(),
    onCancel(),
    bool sync: false}) {
  return sync
      ? new _SyncStreamController<T>(onListen, onPause, onResume, onCancel)
      : new _AsyncStreamController<T>(onListen, onPause, onResume, onCancel);
}

ကျွန်တော်တို့ နမူနာလေး တစ်ခုလောက် ရေးကြည့်ရအောင်

StreamController ကို အသုံးပြုပြီး Stream တစ်ခု ဖန်တီးလိုက်ပါတယ်။ အဲဒီ Stream အတွက် onListen(), onPause(), onResume(), နဲ့ onCancel() ဆိုပြီး သက်ဆိုင်ရာ Event တွေ ဖန်တီးပေးထားပါတယ်။ StreamSubscription နဲ့ StreamController ကို listen လုပ်တဲ့အခါမှာလဲ (data) ရလာရင် data ကို ပြန်ထုတ်ပေးပါလိမ့်မယ်။ Error ဖြစ်တယ်ဆိုရင် Error ကို ဖမ်းပေးပါလိမ့်မယ်။ close() ဖြစ်သွားရင် done ဆိုတဲ့ event triggger ဆွဲပါလိမ့်မယ်။

အခုအသုံးပြုတဲ့ပုံစံက Single Subscription ပုံပါ။ နောက်ထပ် Subscription တစ်ခု ထပ် listen လိုက်ရင် Error တက်သွားပါလိမ့်မယ်။ ဥပမာ –

StreamSubscription sub2 = streamController.stream.listen((data) => print("$data");

အဲဒီလိုဆိုရင် Error တက်သွားပါလိမ့်မယ်။ ကျွန်တော်တို့ ရှေ့အပိုင်းတွေမှာ ပြောခဲ့သလို Multiple Subscription သုံးချင်တယ်ဆိုရင်တော့ အခုလို ပုံစံအတိုင်း​ ပြောင်းရေးပေးရမှာ ဖြစ်ပါတယ်။

​ဒီလို Broadcast Streams အကြောင်းကို ရှေ့အပိုင်းမှာ ပြောခဲ့ပြီး ဖြစ်ပါတယ်။ ကျွန်တော်တို့ ရှေ့ဆက်ပြီး လေ့လာကြမှာက StreamTransformer အကြောင်းဖြစ်ပါတယ်။

StreamTransformer ဆိုတာ ဘာလဲ

Stream တစ်ခုရဲ့ အထဲမှာ ရှိတဲ့ ဒေတာတွေကို လိုအပ်သလို အတွင်းပိုင်းမှာ ပြင်ဆင်ချင်တယ်ဆိုရင် ပြင်ဆင်ချင်တယ်ဆိုရင် StreamTransformer တွေကို အသုံးပြုရမှာ ဖြစ်ပါတယ်။

StreamTransformer အကြောင်းကို ဒီထက် နားလည်အောင် ပြောရမယ်ဆိုရင် ကျွန်တော်တို့ ဖျော်ရည်တစ်ခု လုပ်မယ်ဆိုပါစို့ အစမှ Stream ပိုက်ထဲ ထည့်လိုက်ပါမယ်။ ကြားမှာ စက်တစ်ခုက လိမ္မော်အရည်ကိုထည့်ပါမယ်၊ နောက်တစ်နေရာမှာ သကြားထည့်ပါမယ်။ နောက်ဆုံးမှာ လိမ္မော်ရည်ထွက်လာပါမယ်။ အဲဒီလို အတွင်းမှာ လိမ္မော်ရည်ထည့်တာတို့ သကြားတို့ထည့်တာတို့က StreamTransformer တွေပါပဲ။ ကျွန်တော်တို့ နမူနာလေးနဲ့ ရေးကြည့်ရအောင်

အပေါ်မှာ ပြထားတာကို Run ကြည့်မယ်ဆိုရင် အောက်မှာ ပြထားတဲ့အတိုင်း ရလာပါလိမ့်မယ်။

You fool
You fool
You're idiot
You're idiot
Howdy
Howdy
Unhandled exception:
Something went wrong: Hello

handleData method မှာ data ရယ် EventSink ရယ် ဝင်လာပါတယ်။ အဲဒီမှာ ကျွန်တော် switch နဲ့ တိုက်ပြီး စစ်ထားပါတယ်။ fool ဆိုရင် You fool ဆိုပြီး Data ကို ပြင်လိုက်ပါလိမ့်မယ်။ idiot ဆိုရင်လဲ You’re idiot လို့ ပြင်လိုက်ပါလိမ့်မယ်။ ​handleError, handleDone တို့ကတော့ Error တက်လာရင် ဖြစ်ဖြစ် close သွားရင် ဖြစ်ဖြစ် ဘာလုပ်မလဲဆိုတာ ရေးပေးလို့ရပါလိမ့်မယ်။

ဒီလောက်ဆိုရင် StreamController နဲ့ StreamTransformer အကြောင်းကို နားလည်မယ်ထင်ပါတယ်။ ရှေ့ဆက်ပြီး rxDart အကြောင်းကို ရေးမယ်လို့ စိတ်ကူးထားပါတယ်။ လူစိတ်ဝင်းစားမှု ဘယ်လောက်ရှိလဲအပေါ် မူတည်ပါတယ်။