<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Arkar Min Tun</title>
    <description>The latest articles on DEV Community by Arkar Min Tun (@arkarmintun1).</description>
    <link>https://dev.to/arkarmintun1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F259901%2F2799dc22-5953-4367-afa5-109f190881d7.jpg</url>
      <title>DEV Community: Arkar Min Tun</title>
      <link>https://dev.to/arkarmintun1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arkarmintun1"/>
    <language>en</language>
    <item>
      <title>Database ACID Compliance</title>
      <dc:creator>Arkar Min Tun</dc:creator>
      <pubDate>Tue, 18 Jan 2022 15:06:47 +0000</pubDate>
      <link>https://dev.to/arkarmintun1/database-acid-compliance-33aa</link>
      <guid>https://dev.to/arkarmintun1/database-acid-compliance-33aa</guid>
      <description>&lt;p&gt;Database တွေမှာ ACID Compliance ဆိုတာရှိတယ်။ သူက database တွေရဲ့ integrity (ယုံကြည်စိတ်ချရမှု)ကို တိုင်းတာတဲ့ standard တခုဖြစ်တယ်။ Data integrity ဆိုတာဟာ အရမ်းကို အရေးပါတဲ့အရာဖြစ်တယ်။ အကယ်၍သာ user တွေအတွက် အရေးကြီးတာတွေ ပျက်သွားတာဖြစ်ဖြစ်၊ မှားသွားတာဖြစ်ဖြစ် ဖြစ်လာခဲ့ရင် လုပ်ငန်းအတွက် အဆုံးအရှုံးအများကြီး ဖြစ်သွားနိုင်တယ်။&lt;/p&gt;

&lt;h2&gt;
  
  
  Atomicity
&lt;/h2&gt;

&lt;p&gt;Database transaction တခုကို molecule တခုလိုမျိုး atom တွေနဲ့ ဖွဲ့စည်းထားတယ်လို့မြင်ကြည့်တာနဲ့တူမယ်။ atom တခုခု အဆင်မပြေဖြစ်တာနဲ့ molecule တခုလုံး invalid ဖြစ်သွားတာမျိုးပေါ့။ &lt;code&gt;All or Nothing&lt;/code&gt; Rule လို့လဲ ခေါ်ကြတယ်။ Transaction ရဲ့ အစိတ်အပိုင်းတခုမှာ Error ဖြစ်တာနဲ့ transaction တခုလုံး Fail ဖြစ်သွားတာမျိုးပေါ့။ Database အနေနဲ့ အဲ့လိုမျိုး လုပ်ဆောင်ချက်ကို support လုပ်ပေးတယ်ဆို အဲ့ဒီ့ database မှာ atomicity ရှိတယ်လို့ ပြောလို့ရတယ်။&lt;/p&gt;

&lt;h2&gt;
  
  
  Consistency
&lt;/h2&gt;

&lt;p&gt;ဒါကျတော့ database တခုရဲ့ သတ်မှတ်ချက်တွေအတိုင်း လုပ်ဆောင်မှုကို ပြောတာဖြစ်တယ်။ ဥပမာ - database အနေနဲ့ data type မတူတာကို ထည့်ဖို့ကြိုးစားတဲ့အခါ ထည့်ခွင့်ပြုသလား၊ သတ်မှတ်ထားတဲ့ constraints တွေကို အတိအကျလိုက်နာသလား အဲ့ဒါကို တိုင်းတာခြင်း ဖြစ်တယ်။ တကယ်လို့ သတ်မှတ်ချက်မညီတာမျိုး ပါလာရင် ထည့်ခွင့်မပြုပဲ အရင် state အတိုင်း ထားထားပေးနိုင်တယ်ဆို consistency ရှိတယ်လို့ ပြောလို့ရတယ်။&lt;/p&gt;

&lt;h2&gt;
  
  
  Isolation
&lt;/h2&gt;

&lt;p&gt;ဒါကျတော့ database အနေနဲ့ ဝင်လာတဲ့ transactions တွေကို ခွဲခြားပြီး ဘယ်လောက် တိတိကျကျ ကိုင်တွယ်နိုင်သလဲဆိုတာ တိုင်းတာခြင်း ဖြစ်တယ်။ User အများကြီးက တပြိုင်ထဲ အသုံးပြုတဲ့အခါ database မှာ ပြောင်းလဲတာတွေက အချိန်နဲ့အမျှဖြစ်နေမှာ ဖြစ်တယ်။ အဲ့ပြောင်းလဲမှုတွေကို အမှားအယွင်းမပါပဲ သီးသန့်စီ ဆောင်ရွက်နိုင်နေရမှာ ဖြစ်တယ်။ ဥပမာ - ၅ခုပဲကျန်တဲ့ ပစ္စည်းတခုကို user ၂ယောက်က တစ်ပြိုင်ထဲ ဝယ်ယူဖို့ ကြိုးစားတယ်ဆိုပါစို့။ အဲ့လိုအခြေအနေဆို စက္ကန့်အနည်းငယ်ဖြစ်ဖြစ် စောတဲ့ user က မှာယူလို့ ရသွားပြီး နောက် user ကို ပစ္စည်း မကျန်တော့ဘူးဆိုတာ ပြသနိုင်ရမှာဖြစ်တယ်။ အဲ့လို ဆောင်ရွက်နိုင်တယ်ဆိုရင်တော့ isolation ရှိတယ်လို့ ပြောလို့ရတယ်။&lt;/p&gt;

&lt;h2&gt;
  
  
  Durability
&lt;/h2&gt;

&lt;p&gt;ဒါကတော့ အောင်မြင်စွာလုပ်ဆောင်ပြီးတဲ့ transactions တွေက database ထဲမှာ လုံးဝရောက်ရှိသွားရမှာဖြစ်တယ်။ အကယ်၍ system က တခုခုဖြစ်လို့ database နဲ့ connection ပြတ်သွားခဲ့ရင်တောင် ပြန်ပြီး system တက်လာချိန်မှာ data state တွေက နဂိုအတိုင်း ရှိနေရမှာဖြစ်တယ်။ transaction success လို့ user ဆီကို အကြောင်းပြန်ပြီးတော့မှ system failure ကြောင့် user ရဲ့ data ပျောက်သွားခဲ့တယ်ဆို ဒါဟာ ပြဿနာအများကြီး ဖြစ်လာနိုင်တယ်။ Database အနေနဲ့ အဲ့လို situation မှာ ကောင်းကောင်း ကိုင်တယ်နိုင်တယ်ဆို durability ရှိတယ်လို့ ပြောလို့ရတယ်။&lt;/p&gt;

</description>
      <category>database</category>
      <category>burmese</category>
    </item>
    <item>
      <title>Flutter Fall Event</title>
      <dc:creator>Arkar Min Tun</dc:creator>
      <pubDate>Sat, 09 Oct 2021 12:35:26 +0000</pubDate>
      <link>https://dev.to/arkarmintun1/flutter-fall-event-1f3a</link>
      <guid>https://dev.to/arkarmintun1/flutter-fall-event-1f3a</guid>
      <description>&lt;p&gt;&lt;a href="https://www.raywenderlich.com/28213725-announcing-our-flutter-fall-event-featuring-flutter-apprentice"&gt;Original Post From raywenderlich&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Google နဲ့ Raywenderlinch တို့က​စီစဥ်တဲ့ Flutter Fall Event ဆိုတာ Flutter လေ့လာရလွယ်ကူအောင် စီစဥ်ပေးထားတာပါ။ Information အပြည့်အစုံကို &lt;a href="https://flutter.dev/apprentice-giveaway"&gt;ဒီမှာ&lt;/a&gt; သွားကြည့်လို့ရပါတယ်။ ဒီ event မှာပါဝင်ချင်ရင် ဒီ post မှာဖော်ပြထားသလိုပါဝင်လို့ရပါတယ်။ ကိုယ်တိုင်တစ်ယောက်ထဲလုပ်ချင်ရင်လဲ​ရသလို Google Developer Group - Yangon (GDG Yangon) မှာ တခြားသူတွေနဲ့အတူပါဝင်လို့လဲရပါတယ်။ &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/NVzIALG7CUc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;အရင်ဆုံးအနေနဲ့ ဒီ event က Flutter Apprentice ဆိုတဲ့စာအုပ်ပေါ် အခြေခံပြီး ပြုလုပ်သွားမှာဖြစ်ပါတယ်။&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cAHIHCur--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.alexandria.raywenderlich.com/books/be0da83c17e547776b6ff910c5109b836d4b642faedff5a9a04d18d4375714e0/images/ad5295501b90ad84026582f5d9a8996c1cb9713176e6c390088fa8e67829b5c5/w594.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cAHIHCur--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.alexandria.raywenderlich.com/books/be0da83c17e547776b6ff910c5109b836d4b642faedff5a9a04d18d4375714e0/images/ad5295501b90ad84026582f5d9a8996c1cb9713176e6c390088fa8e67829b5c5/w594.png" alt="Flutter Apprentice Book"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ဒီစာအုပ်ကို ၃လတာ အတွင်း free access ရနေမှာဖြစ်တယ်။​ ဒီထဲမှာ အခြေခံ ကနေပြီး နောက်ဆုံး app release လုပ်တဲ့ထိ ပါသွားမှာဖြစ်တယ်။ &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="//www.raywenderlich.com"&gt;www.raywenderlich.com&lt;/a&gt; ကိုသွားပြီး register လုပ်ဖို့လိုပါမယ်။ &lt;/li&gt;
&lt;li&gt;ပြီးရင်တော့ &lt;a href="https://www.raywenderlich.com/books/flutter-apprentice"&gt;Book&lt;/a&gt; ကိုစပြီးဖတ်ပြီး tutorials တွေစလုပ်လို့ရပါပြီ။&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;အပတ်စဥ်လဲ Google Flutter Team က Youtube ကနေ Q&amp;amp;A sessions တွေကို လုပ်သွားပေးဖို့ရှိပါတယ်။ &lt;a href="https://www.youtube.com/playlist?list=PL4dBIh1xps-HAaadBRWQobCO_IJ4gMOG2"&gt;ဒီမှာ&lt;/a&gt; သွားကြည့်လို့ရပါတယ်။ မြန်မာစံတော်ချိန်နဲ့ဆို ဗုဒ္ဓဟူးနေ့ ည ၁၀ခွဲတိုင်းမှာဖြစ်ပါမယ်။&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Homework&lt;/th&gt;
&lt;th&gt;Live stream topic&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;October 6+&lt;/td&gt;
&lt;td&gt;Sign up for free access! Check out the first live stream for details.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 13&lt;/td&gt;
&lt;td&gt;Read chapters 1, 2&lt;/td&gt;
&lt;td&gt;Getting started&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 20&lt;/td&gt;
&lt;td&gt;Read chapters 3, 4&lt;/td&gt;
&lt;td&gt;Widgets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 27&lt;/td&gt;
&lt;td&gt;Read chapters 5, 6&lt;/td&gt;
&lt;td&gt;More widgets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;November 3&lt;/td&gt;
&lt;td&gt;Read chapters 7, 8&lt;/td&gt;
&lt;td&gt;Navigation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;November 10&lt;/td&gt;
&lt;td&gt;Read chapters 9, 15 (1st half)&lt;/td&gt;
&lt;td&gt;Data persistence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;November 17&lt;/td&gt;
&lt;td&gt;Read chapters 10, 11&lt;/td&gt;
&lt;td&gt;Networking &amp;amp; serialization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;November 24&lt;/td&gt;
&lt;td&gt;Read chapters 12, 13&lt;/td&gt;
&lt;td&gt;State management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;December 1&lt;/td&gt;
&lt;td&gt;Read chapters 14, 15 (2nd half)&lt;/td&gt;
&lt;td&gt;Streams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;December 8&lt;/td&gt;
&lt;td&gt;Read chapters 16, 17, 18&lt;/td&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;December 15&lt;/td&gt;
&lt;td&gt;Read chapter 19&lt;/td&gt;
&lt;td&gt;Firebase&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
    </item>
    <item>
      <title>Flutter Localization</title>
      <dc:creator>Arkar Min Tun</dc:creator>
      <pubDate>Tue, 12 Jan 2021 07:46:21 +0000</pubDate>
      <link>https://dev.to/arkarmintun1/flutter-localization-hcb</link>
      <guid>https://dev.to/arkarmintun1/flutter-localization-hcb</guid>
      <description>&lt;p&gt;Flutter application မှာ language တခုထက်ပိုပြီး support လုပ်ပေးချင်တဲ့အခါ localization ဆိုတာ လုပ်ရလေ့ရှိပါတယ်။ ခု ဒီ tutorial မှာတော့ localization setup ဘယ်လိုလုပ်ရသလဲဆိုတာတွေကို sharing လုပ်ပေးသွားမှာ ဖြစ်ပါတယ်။ &lt;a href="https://flutter.dev/docs/development/accessibility-and-localization/internationalization"&gt;Flutter documentation&lt;/a&gt; မှာလဲ အပြည့်အစုံ ရေးထားပေးတာရှိပါတယ်။ &lt;/p&gt;

&lt;p&gt;အရင်ဆုံး &lt;code&gt;pubspec.yaml&lt;/code&gt; ထဲမှာ &lt;code&gt;flutter_localizations&lt;/code&gt; dependency ကို သွားထည့်ရပါမယ်။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;flutter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;sdk&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;flutter&lt;/span&gt;
  &lt;span class="na"&gt;flutter_localizations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# Add this line&lt;/span&gt;
    &lt;span class="na"&gt;sdk&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;flutter&lt;/span&gt;         &lt;span class="c1"&gt;# Add this line&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Localization တွေမလုပ်ခင် package တခုကို သွင်းထားဖို့လိုပါမယ်။ ဒါကတော့ internalization အတွက် အသုံးပြုတဲ့ intl ဆိုတဲ့ package ပဲဖြစ်ပါတယ်။ ကျွန်တော်ကတော့ vscode plugin ဖြစ်တဲ့ Pubspec Assist ကို သုံးတာဖြစ်တဲ့အတွက် အဲ့ဒီကနေ &lt;code&gt;intl&lt;/code&gt; package ကို သွင်းပါမယ်။&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sYRgZGXN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ztzhskslpvzwolhdavwp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sYRgZGXN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ztzhskslpvzwolhdavwp.png" alt="Alt Text" width="880" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Command+Shift+P&lt;/code&gt; ကိုနှိပ်ပြီး command တွေကျလာပါမယ်။ အဲ့ထဲကမှ &lt;code&gt;Pubspec Assist: Add/update dependencies&lt;/code&gt; ဆိုတာကို ရွေးပါမယ်။&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NKuB3ZS2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0l2inq5km76kcl9elz8r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NKuB3ZS2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0l2inq5km76kcl9elz8r.png" alt="Alt Text" width="880" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;အဲ့ဒါပြီးရင်တော့ &lt;code&gt;intl&lt;/code&gt; လို့ရိုက်လိုက်ပါမယ်။&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BTgS5aWX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/o6yahouw71aamue4swzi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BTgS5aWX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/o6yahouw71aamue4swzi.png" alt="Alt Text" width="880" height="93"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;အဲ့ဒါဆိုရင်တော့ &lt;code&gt;pubspec.yaml&lt;/code&gt; ရဲ့ dependencies အောက်မှာ &lt;code&gt;intl&lt;/code&gt; package ထည့်သွင်းပြီး ဖြစ်သွားပါလိမ့်မယ်။ တကယ်လို့ manually လုပ်ချင်တယ်ဆို &lt;a href="https://pub.dev/"&gt;pub.dev&lt;/a&gt; ကိုသွားပြီး intl package ကိုရှာလို့လဲရပါတယ်။&lt;/p&gt;

&lt;p&gt;နောက်ဆုံးတခုအနေနဲ့ကတော့ dependencies တို့၊ dev-dependencies တို့ရဲ့ အောက်မှာရှိတဲ့ flutter namespace အောက်ထဲမှာ &lt;code&gt;generate: true&lt;/code&gt; ဆိုတာကို ထည့်ပါမယ်။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;flutter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;uses-material-design&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;အခုဆိုရင်တော့ &lt;code&gt;pubspec.yaml&lt;/code&gt; file ထဲမှာ လိုအပ်တာတွေ ပြင်ဆင်လို့ ပြီးပါပြီ။&lt;/p&gt;

&lt;p&gt;Project based folder ထဲမှာ &lt;code&gt;l10n.yaml&lt;/code&gt; ဆိုတဲ့ file တခုကို ဆောက်ပြီး အောက်မှာပြထားတဲ့ configuration တွေထည့်ပါမယ်။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;arb-dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;lib/l10n&lt;/span&gt;
&lt;span class="na"&gt;template-arb-file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_en.arb&lt;/span&gt;
&lt;span class="na"&gt;output-localization-file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_localizations.dart&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8HXwongo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wo51yom9brdkyx4ro3pb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8HXwongo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wo51yom9brdkyx4ro3pb.png" alt="Alt Text" width="718" height="782"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ဒါကတော့ ကိုယ် translation လုပ်မယ့် file ဘယ်မှာရှိမယ်၊ Generate လုပ်လိုက်တဲ့အခါ ဘယ်နာမည်နဲ့ class ဆောက်မယ်၊ အဲ့ဒါတွေကို သတ်မှတ်ပေးထားတာပဲ ဖြစ်ပါတယ်။ အခု ဒီ configuration အတိုင်းဆိုရင် ကျွန်တော်တို့ app ရဲ့ base language keywords တွေကို &lt;code&gt;app_en.arb&lt;/code&gt; ဆိုတဲ့ file ထဲမှာ သိမ်းထားမယ်။ အဲ့ file က &lt;code&gt;lib/l10n&lt;/code&gt; ဆိုတဲ့ ပတ်လမ်းကြောင်းမှာ ရှိမယ်။ Generate လုပ်လိုက်တဲ့ class ကို &lt;code&gt;app_localizations.dart&lt;/code&gt; ဆိုတဲ့နာမည်နဲ့ သိမ်းမယ်လို့ သတ်မှတ်ပေးလိုက်တာပဲ ဖြစ်ပါတယ်။&lt;/p&gt;

&lt;p&gt;ခုဆိုရင် &lt;code&gt;app_en.arb&lt;/code&gt; ဆိုတဲ့ file ကိုဖွင့်ပြီး စာကြောင်းတခုလောက်နဲ့ စစမ်းကြည့်ရအောင်ပါ။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"helloWorld"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@helloWorld"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The conventional newborn programmer greeting"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ဒါနဲ့အတူ မြန်မာလိုပါ ထည့်ကြည့်လိုက်ရအောင်ပါ။ &lt;code&gt;app_my.arb&lt;/code&gt; ဆိုတဲ့ file တခုကို &lt;code&gt;l10n&lt;/code&gt; folder ထဲမှာပဲ ဆောက်လိုက်ပြီး အောက်မှာပြထားတဲ့စာတွေ ထည့်လိုက်ပါ့မယ်။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"helloWorld"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"မင်္ဂလာပါ"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P9zXKUSI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4lejcvkbvz7ntjv77y2s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P9zXKUSI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4lejcvkbvz7ntjv77y2s.png" alt="Alt Text" width="710" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ဘယ် language အတွက် ဘယ် keyword ကို suffix ထားသလဲဆိုတာ သိချင်ရင် ဒီ &lt;a href="https://api.flutter.dev/flutter/flutter_localizations/GlobalMaterialLocalizations-class.html"&gt;link&lt;/a&gt; မှာ သွားကြည့်လို့ရပါတယ်။&lt;/p&gt;

&lt;p&gt;ခုလိုတာတွေ ပြင်ဆင်ပြီးပြီဆိုတော့ command run ဖွင့် terminal ဖွင့်ပါမယ်။ vs code ထဲမှာဆိုရင်တော့ Terminal &amp;gt; New Terminal ဆိုတာ ဖွင့်လိုက်ပါမယ်။ Terminal path က project base folder မှာ ရှိနေရမှာဖြစ်ပါတယ်။ အခု terminal ထဲမှာ &lt;code&gt;flutter gen-l10n&lt;/code&gt; ဆိုတာ ရီုက်လိုက်ပါမယ်။ ဒီ command ကတော့ &lt;code&gt;l10n.yaml&lt;/code&gt; ကိုကြည့်ပြီး ရှိနေတဲ့ arb files တွေကနေပြီးတော့ app ထဲမှာ ပြန်သုံးလို့ရမယ့် translation files တွေ ထုတ်ပေးဖို့ ရိုက်ရတဲ့ command ဖြစ်ပါတယ်။&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Lj7UKfOs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/waqrovs4qb7se07gmaaq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Lj7UKfOs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/waqrovs4qb7se07gmaaq.png" alt="Alt Text" width="880" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ခုလိုပေါ်လာပြီဆိုရင်တော့ generate လုပ်တာ success ဖြစ်သွားပါပြီ။ project base folder ထဲက &lt;code&gt;.dart_tool&lt;/code&gt; ဆိုတဲ့ folder ထဲမှာ &lt;code&gt;flutter_gen/gen_l10n&lt;/code&gt; ဆိုပြီး ထွက်လာမှာဖြစ်ပါတယ်။ အဲ့ထဲမှာတော့ ကိုယ် arb အနေနဲ့သတ်မှတ်ထားတဲ့ files တွေ (app_localizations_en.dart, app_localizations_my.dart) အပြင် application နဲ့ အဓိက ချိတ်ဆက်မယ့် app_localizations.dart file လဲ ထွက်လာမှာဖြစ်ပါတယ်။&lt;/p&gt;

&lt;p&gt;ကဲ.. ပြီးခါနီးပါပြီ။ &lt;code&gt;main.dart&lt;/code&gt; ကိုဖွင့်လိုက်မယ်။ အဲ့ထဲမှာ MaterialApp widget ကို ခုလိုမျိုး update လုပ်လိုက်ပါမယ်။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// Import generated app_localizations.dart&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter_gen/gen_l10n/app_localizations.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;runApp&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyApp&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="s"&gt;'Flutter Demo'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;localizationsDelegates:&lt;/span&gt; &lt;span class="n"&gt;AppLocalizations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;localizationsDelegates&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;supportedLocales:&lt;/span&gt; &lt;span class="n"&gt;AppLocalizations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;supportedLocales&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;locale:&lt;/span&gt; &lt;span class="n"&gt;Locale&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'en'&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
      &lt;span class="nl"&gt;theme:&lt;/span&gt; &lt;span class="n"&gt;ThemeData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;primarySwatch:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;blue&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;visualDensity:&lt;/span&gt; &lt;span class="n"&gt;VisualDensity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;adaptivePlatformDensity&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
      &lt;span class="o"&gt;),&lt;/span&gt;
      &lt;span class="nl"&gt;home:&lt;/span&gt; &lt;span class="n"&gt;MyHomePage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="s"&gt;'Flutter Demo Home Page'&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
    &lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ဒါနဲ့အတူ default Text Widget ကိုလဲ localization အတွက် ပြုလုပ်ထားတဲ့ &lt;code&gt;helloWorld&lt;/code&gt; ပြအောင် အခုလို ပြုလုပ်လို့ရပါတယ်။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;AppLocalizations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;helloWorld&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;),&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ခုလို သတ်မှတ်ပြီးသွားရင် &lt;code&gt;locale: Locale('en')&lt;/code&gt; ဒါမှမဟုတ် &lt;code&gt;locale: Locale('my')&lt;/code&gt; စသဖြင့် ပြောင်းပြီးစမ်းကြည့်လို့ရပါပြီ။ တကယ်လို့ ကိုယ့် app setting ထဲကနေ ပြောင်းစေချင်တယ်ဆိုလဲ state management mechanism နဲ့ချိတ်ပြီး locale ကို update လုပ်ပေးပြီး ပြောင်းသွားလို့ရပါတယ်။&lt;/p&gt;

&lt;p&gt;iOS အတွက်တော့ xcode ထဲမှာ ခုဖော်ပြမယ့် steps လေးတွေ ဖြည့်ပြီးလုပ်ပေးဖို့ လိုအပ်ပါတယ်။&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KFJFM99b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/d8o2ewt4mxuzy4yauzt0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KFJFM99b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/d8o2ewt4mxuzy4yauzt0.png" alt="Alt Text" width="880" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eN1InymX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q0w9g8hl5o8bm242kwzh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eN1InymX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q0w9g8hl5o8bm242kwzh.png" alt="Alt Text" width="880" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1jgv5mCQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4x2cesc3m0m8og6tkv7e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1jgv5mCQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4x2cesc3m0m8og6tkv7e.png" alt="Alt Text" width="880" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title># BLoC Pattern ဆိုတာဘာလဲ?</title>
      <dc:creator>Arkar Min Tun</dc:creator>
      <pubDate>Mon, 23 Nov 2020 16:39:42 +0000</pubDate>
      <link>https://dev.to/arkarmintun1/bloc-pattern-5hmg</link>
      <guid>https://dev.to/arkarmintun1/bloc-pattern-5hmg</guid>
      <description>&lt;p&gt;BLoC ဆိုတာ &lt;strong&gt;B&lt;/strong&gt;usiness &lt;strong&gt;Lo&lt;/strong&gt;gic &lt;strong&gt;C&lt;/strong&gt;omponent ကိုအတိုချုံ့ ပြောထားတာဖြစ်တယ်။ &lt;/p&gt;

&lt;p&gt;သူရဲ့ အဓိက ရည်ရွယ်ချက်ကတော့ Application မှာပါတဲ့ Business Logic ကို&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;တခု (သို့) တခုထက်ပိုတဲ့ BLoC တွေဆီ ရွှေ့ထားဖို့&lt;/li&gt;
&lt;li&gt;Presentation Layer (UI) မှာ ပါမနေစေဖို့&lt;/li&gt;
&lt;li&gt;Stream အသုံးပြုပြီး input(sink), output(stream) တွေနဲ့သုံးဖို့&lt;/li&gt;
&lt;li&gt;platform ပေါ်မှာ မှီခိုမှု မရှိအောင်&lt;/li&gt;
&lt;li&gt;environment ပေါ်မှာ မှီခိုမှု မရှိအောင် လုပ်ထားတာဖြစ်တယ်&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mwWrxN87--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.didierboelens.com/images/blog/streams_bloc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mwWrxN87--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.didierboelens.com/images/blog/streams_bloc.png" alt="Image" width="561" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Widget တွေက event တွေကို sinks တွေကနေ BLoC ဆီပို့ပေးတယ်&lt;/li&gt;
&lt;li&gt;Widget တွေက BLoC ရဲ့ stream ကနေတဆင့် notification ကို လက်ခံရရှိတယ်&lt;/li&gt;
&lt;li&gt;Business Logic ကို UI က ဘာမှ သိနေဖို့ မလိုအပ်တော့ဘူး&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Business Logic နဲ့ UI သပ်သပ်ဆီ ဖြစ်နေခြင်းအားဖြင့်&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business Logic မှာ ပြောင်းလဲမှုတွေ လုပ်ခြင်းက UI မှာ သက်ရောက်မှု တော်တော်လေး နည်းသွားမယ်&lt;/li&gt;
&lt;li&gt;UI အပြောင်းအလဲလုပ်မယ်ဆို Business Logic တွေကို ထိိဖို့မလိုတော့ဘူး&lt;/li&gt;
&lt;li&gt;Business Logic ကို test လုပ်ရတာ တော်တော်လေး လွယ်ကူသွားမယ်&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Counter Application ကိုပဲ Bloc Pattern သုံးပြီး &lt;code&gt;bloc_pattern: ^2.5.1&lt;/code&gt; နဲ့ ရေးကြည့်မယ်ဆိုရင် ခုလိုမျိုး ထွက်လာမယ်။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:async'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:bloc_pattern/bloc_pattern.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;runApp&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyApp&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="s"&gt;'Flutter Demo'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;theme:&lt;/span&gt; &lt;span class="n"&gt;ThemeData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;primarySwatch:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;blue&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;visualDensity:&lt;/span&gt; &lt;span class="n"&gt;VisualDensity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;adaptivePlatformDensity&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
      &lt;span class="o"&gt;),&lt;/span&gt;
      &lt;span class="nl"&gt;home:&lt;/span&gt; &lt;span class="n"&gt;BlocProvider&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;blocs:&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Bloc&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;IncrementBloc&lt;/span&gt;&lt;span class="o"&gt;())],&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;CounterPage&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
      &lt;span class="o"&gt;),&lt;/span&gt;
    &lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CounterPage&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;bloc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BlocProvider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBloc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IncrementBloc&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;appBar:&lt;/span&gt; &lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Counter with Stream'&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
      &lt;span class="o"&gt;),&lt;/span&gt;
      &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;StreamBuilder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;stream:&lt;/span&gt; &lt;span class="n"&gt;bloc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;outCounter&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;initialData:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AsyncSnapshot&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'You pressed me &lt;/span&gt;&lt;span class="si"&gt;${snapshot.data}&lt;/span&gt;&lt;span class="s"&gt; times'&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
          &lt;span class="o"&gt;},&lt;/span&gt;
        &lt;span class="o"&gt;),&lt;/span&gt;
      &lt;span class="o"&gt;),&lt;/span&gt;
      &lt;span class="nl"&gt;floatingActionButton:&lt;/span&gt; &lt;span class="n"&gt;FloatingActionButton&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Icon&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Icons&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
        &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;bloc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;incrementCounter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;},&lt;/span&gt;
      &lt;span class="o"&gt;),&lt;/span&gt;
    &lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;IncrementBloc&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;BlocBase&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;_counter&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;//&lt;/span&gt;
  &lt;span class="c1"&gt;// Stream to handle the counter&lt;/span&gt;
  &lt;span class="c1"&gt;//&lt;/span&gt;
  &lt;span class="n"&gt;StreamController&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_counterController&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;StreamController&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;
  &lt;span class="n"&gt;StreamSink&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;_inAdd&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_counterController&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sink&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;Stream&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;outCounter&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_counterController&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;//&lt;/span&gt;
  &lt;span class="c1"&gt;// Stream to handle the action on the counter&lt;/span&gt;
  &lt;span class="c1"&gt;//&lt;/span&gt;
  &lt;span class="n"&gt;StreamController&lt;/span&gt; &lt;span class="n"&gt;_actionController&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;StreamController&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;StreamSink&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;incrementCounter&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_actionController&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sink&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;//&lt;/span&gt;
  &lt;span class="c1"&gt;// Constructor&lt;/span&gt;
  &lt;span class="c1"&gt;//&lt;/span&gt;
  &lt;span class="n"&gt;IncrementBloc&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;_actionController&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_handleLogic&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;dispose&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_actionController&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;_counterController&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;_handleLogic&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_counter&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;_inAdd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_counter&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Seperation of Responsibilities&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ကြည့်မယ်ဆို &lt;em&gt;CounterPage&lt;/em&gt; ထဲမှာ business logic လုံးဝ ပါမနေတာ တွေ့ရမယ်။ သူ့မှာ ရှိတဲ့တာဝန်က counter ကိုပြဖို့၊ value အသစ်ပြောင်းတဲ့အခါ refresh လုပ်ပေးဖို့နဲ့ button ကို နှိပ်တဲ့အခါ action ကိုပို့ပေးဖို့ပဲ ရှိတော့တယ်။&lt;/p&gt;

&lt;p&gt;Business Logic အကုန်ကလဲ &lt;em&gt;IncrementBloc&lt;/em&gt; ထဲမှာ တစုတစည်းထဲဖြစ်သွားတယ်။ Business Logic ပြောင်းဖို့လိုမယ်ဆို တနေရာထဲမှာ ပြောင်းပေးလိုက်ရုံပဲ ဖြစ်သွားမယ်။&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Testability&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Business logic ကို test လုပ်ရတာလဲ ပိုမို လွယ်ကူသွားမယ်။ UI ကနေတဆင့် လုပ်နေစရာမလိုတော့ဘဲ &lt;em&gt;IncrementBloc&lt;/em&gt; တခုကို test လုပ်ရုံနဲ့တင် ရသွားမယ်။&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Freedom to organize the layout&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stream ကို အသုံးပြုထားတာ ဖြစ်တဲ့အတွက် layout တွေကို ကြိုက်သလိုအပြောင်းအလဲလုပ်ရင်တောင် business logic ကို ထိမှာမျိုး မပူရတော့ဘူး။ Application ရဲ့ ကြိုက်တဲ့နေရာကနေ action ကိုခေါ်ချင်ရင် &lt;em&gt;incrementCounter&lt;/em&gt; သုံးပြီး ခေါ်လို့ရတယ်။ ပြချင်တယ်ဆိုရင်လဲ ကြိုက်တဲ့နေရာမှာ &lt;em&gt;outCounter&lt;/em&gt; နဲ့ ပြလို့ရတယ်။&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reduction of the number of "build"s&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;setState()&lt;/code&gt; ကိုမသုံးဘဲ &lt;code&gt;StreamBuilder&lt;/code&gt; ကိုသုံးခြင်းအားဖြင့် build လုပ်ရတဲ့ အကြိမ်အရေအတွက်ကို အများကြီး လျှော့ချပြီးသား ဖြစ်သွားတယ်။ တကယ်လိုအပ်တဲ့အချိန်မှပဲ ပြန်ပြီး build လုပ်ဖို့ လိုအပ်တယ်။ Performance ဘက်က ကြည့်မယ်ဆို ဒါဟာ ကြီးမားတဲ့ တိုးတက်မှုဖြစ်တယ်။&lt;/p&gt;

&lt;p&gt;ဒါတွေအကုန် အလုပ်လုပ်ဖို့ဆို BLoC ကို နေရာတိုင်းက အသုံးပြုလို့ရနေဖို့လိုအပ်တယ်။ ဒီလိုလုပ်ထားဖို့ နည်းလမ်း (၃)ခုရှိတယ်။&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;global&lt;/em&gt; Singleton&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ဒီနည်းလမ်းက သုံးလို့ရတယ်ဆိုပေမယ့် အသုံးပြုဖို့ မတိုက်တွန်းချင်ဘူး။ Dart မှာ class &lt;em&gt;destructor&lt;/em&gt; မရှိတဲ့အတွက် resource ထဲကနေ သူ့ကို ပြန်ထုတ်လို့ ရမှာမဟုတ်ဘူး။&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;local&lt;/em&gt; instance&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;BLoC ကို local instance အနေနဲ့ လုပ်ပြီး သုံးလို့ရတယ်။ တချို့အခြေအနေမှာဆို ဒီလိုလုပ်ပေးတာ အသင့်တော်ဆုံးပဲ။ local instance အနေနဲ့သုံးမယ်ဆို &lt;em&gt;StatefulWidget&lt;/em&gt; နဲ့သုံးဖို့ စဥ်းစားသင့်တယ်။ ဒီတော့မှ &lt;code&gt;dispose()&lt;/code&gt; ထဲမှာ local instance ကို ပြန်ပြီး ဖျက်ပစ်လို့ရမယ်။&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;provided by an &lt;em&gt;ancestor&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;အသုံးအများဆုံးနည်းလမ်းကတော့ ကိုယ်သုံးချင်တဲ့ Widget အထက်မှာရှိတဲ့ တခုခုကနေပြီးတော့ အသုံးပြုလို့ရအောင် လုပ်ပေးထားတာမျိုးဖြစ်တယ်။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Generic Interface for all BLoCs&lt;/span&gt;
&lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BlocBase&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;dispose&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Generic BLoC Provider&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BlocProvider&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;BlocBase&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatefulWidget&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;bloc&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;BlocProvider&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="nd"&gt;@required&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;child&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="nd"&gt;@required&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bloc&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="o"&gt;})&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;key:&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;StatefulWidget&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;createState&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_BlocProviderState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;BlocBase&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;BlocProvider&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAncestorWidgetOfExactType&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BlocProvider&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bloc&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;_BlocProviderState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BlocProvider&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BlocBase&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;dispose&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bloc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dispose&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dispose&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;child&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;bloc_pattern library သုံးထားတဲ့နေရာမှာ ခု bloc pattern ကို သုံးလို့ရပြီ။ ခုလိုရေးတာက ancestor ကနေတဆင့် ပို့ပေးတဲ့ နည်းလမ်းကို အသုံးပြုထားခြင်းဖြစ်တယ်။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:async'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'bloc.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;runApp&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyApp&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="s"&gt;'Flutter Demo'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;theme:&lt;/span&gt; &lt;span class="n"&gt;ThemeData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;primarySwatch:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;blue&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;visualDensity:&lt;/span&gt; &lt;span class="n"&gt;VisualDensity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;adaptivePlatformDensity&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
      &lt;span class="o"&gt;),&lt;/span&gt;
      &lt;span class="nl"&gt;home:&lt;/span&gt; &lt;span class="n"&gt;BlocProvider&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;bloc:&lt;/span&gt; &lt;span class="n"&gt;IncrementBloc&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;CounterPage&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
      &lt;span class="o"&gt;),&lt;/span&gt;
    &lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CounterPage&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;bloc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BlocProvider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IncrementBloc&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;appBar:&lt;/span&gt; &lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Counter with Stream'&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
      &lt;span class="o"&gt;),&lt;/span&gt;
      &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;StreamBuilder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;stream:&lt;/span&gt; &lt;span class="n"&gt;bloc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;outCounter&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;initialData:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AsyncSnapshot&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'You pressed me &lt;/span&gt;&lt;span class="si"&gt;${snapshot.data}&lt;/span&gt;&lt;span class="s"&gt; times'&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
          &lt;span class="o"&gt;},&lt;/span&gt;
        &lt;span class="o"&gt;),&lt;/span&gt;
      &lt;span class="o"&gt;),&lt;/span&gt;
      &lt;span class="nl"&gt;floatingActionButton:&lt;/span&gt; &lt;span class="n"&gt;FloatingActionButton&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Icon&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Icons&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
        &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;bloc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;incrementCounter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;},&lt;/span&gt;
      &lt;span class="o"&gt;),&lt;/span&gt;
    &lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;IncrementBloc&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="n"&gt;BlocBase&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;_counter&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;//&lt;/span&gt;
  &lt;span class="c1"&gt;// Stream to handle the counter&lt;/span&gt;
  &lt;span class="c1"&gt;//&lt;/span&gt;
  &lt;span class="n"&gt;StreamController&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_counterController&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;StreamController&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;
  &lt;span class="n"&gt;StreamSink&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;_inAdd&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_counterController&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sink&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;Stream&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;outCounter&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_counterController&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;//&lt;/span&gt;
  &lt;span class="c1"&gt;// Stream to handle the action on the counter&lt;/span&gt;
  &lt;span class="c1"&gt;//&lt;/span&gt;
  &lt;span class="n"&gt;StreamController&lt;/span&gt; &lt;span class="n"&gt;_actionController&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;StreamController&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;StreamSink&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;incrementCounter&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_actionController&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sink&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;//&lt;/span&gt;
  &lt;span class="c1"&gt;// Constructor&lt;/span&gt;
  &lt;span class="c1"&gt;//&lt;/span&gt;
  &lt;span class="n"&gt;IncrementBloc&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;_actionController&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_handleLogic&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;dispose&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_actionController&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;_counterController&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;_handleLogic&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_counter&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;_inAdd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_counter&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;BlocProvider ကို ဘယ်လို လုပ်သလဲဆို&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;home: BlocProvider(
  bloc: IncrementBloc(),
  child: CounterPage(),
),
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ဒီနေရာမှာ provider တခုကို တည်ဆောက်ပြီး အဲ့ဒီ့ provider ကနေ ပို့ပေးမယ့် bloc (IncrementBloc) ကို တည်ဆောက်တယ်။ &lt;code&gt;IncrementBloc()&lt;/code&gt; ကို သုံးမယ့် &lt;code&gt;CounterPage()&lt;/code&gt; ကိုလဲ child ထဲမှာ တခါထဲ ကြေငြာသွားတယ်။&lt;/p&gt;

&lt;p&gt;ဒီလို ကြေငြာပြီးတာနဲ့ BlocProvider အောက်မှာ ရှိတဲ့ sub-tree အကုန်လုံးကနေ ကြိုက်တဲ့နေရာမှာ &lt;em&gt;IncrementBloc&lt;/em&gt; ကို ယူသုံးလို့ရပြီ။&lt;/p&gt;

&lt;p&gt;BLoC တွေအများကြီးကို သုံးလို့ရသလားဆိုရင်တော့ ရတယ်လို့ပဲ ဖြေပေးရမယ်။ အသုံးပြုဖို့ တိုက်တွန်းချင်တဲ့ နေရာတွေကတော့&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Business logic ရှိတယ်ဆိုတဲ့ page တိုင်းရဲ့ ထိပ်ဆုံးမှာ&lt;/li&gt;
&lt;li&gt;Application State ကို handle လုပ်ဖို့ ApplicationBloc ဆိုပြီး သုံးတဲ့နေရာမှာ&lt;/li&gt;
&lt;li&gt;Component တခုအနေနဲ့ အတိုင်းအတာတခုထိ ရှုပ်ထွေးလာပြီဆို သက်ဆိုင်ရာ BLoC သုံးပြီး လုပ်တဲ့နေရာတွေမှာ အသုံးပြုပေးပါ။&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
    </item>
    <item>
      <title>Stream ဆိုတာဘာလဲ?</title>
      <dc:creator>Arkar Min Tun</dc:creator>
      <pubDate>Sun, 22 Nov 2020 18:45:22 +0000</pubDate>
      <link>https://dev.to/arkarmintun1/stream-40m2</link>
      <guid>https://dev.to/arkarmintun1/stream-40m2</guid>
      <description>&lt;p&gt;Original Post: &lt;a href="https://www.didierboelens.com/2018/08/reactive-programming-streams-bloc/"&gt;https://www.didierboelens.com/2018/08/reactive-programming-streams-bloc/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stream ဆိုတာ အစွန်း၂ဖက်ပါတဲ့ ပိုက်လိုပဲ၊ တဖက်ကနေ ထည့်ပေးပြီး တဖက်က ပြန်ထွက်လာတာမျိုးပေါ့။ ပိုက်ကို ထိန်းချုပ်ပေးတာကကျတော့ &lt;strong&gt;StreamController&lt;/strong&gt; လို့ခေါ်တယ်။ ဝင်ပေါက်ကို &lt;strong&gt;sink&lt;/strong&gt; လို့သတ်မှတ်ပြီး ထွက်ပေါက်ကိုတော့ &lt;strong&gt;stream&lt;/strong&gt; (S အသေး) နဲ့သတ်မှတ်တယ်။&lt;/p&gt;

&lt;p&gt;Stream ထဲကနေ ကိုယ်ကြိုက်တာကို လက်ဆင့်ကမ်းပေးလို့ရတယ်။ value, event, object, collection, map, error ဒါမှမဟုတ် နောက်ထပ် Stream တခုကိုပါ လက်ဆင့်ကမ်းလို့ရတယ်။&lt;/p&gt;

&lt;p&gt;Stream ထဲထည့်ပေးလိုက်တာကို သိချင်တယ်ဆို &lt;strong&gt;StreamController&lt;/strong&gt; ကို &lt;strong&gt;listen&lt;/strong&gt; လုပ်ပေးထားဖို့တော့လိုတယ်။&lt;/p&gt;

&lt;p&gt;listener သတ်မှတ်လိုက်တဲ့အခါ &lt;strong&gt;StreamSubscription&lt;/strong&gt; ဆိုတဲ့ object ကိုရလာတယ်။ ဒီ &lt;em&gt;StreamSubscription&lt;/em&gt; object ကနေပဲ Stream ထဲမှာ တခုခုထည့်ပေးလိုက်တဲ့အခါ သိရမှာဖြစ်တယ်။&lt;/p&gt;

&lt;p&gt;နားထောင်နေတဲ့ active listener တခုရှိပြီဆိုတာနဲ့ Stream ကနေပြီး event တွေစပြီး လွှင့်ပေးတယ်။ ဘယ်အချိန်တွေမှာ event ထုတ်လွှင့်သလဲဆို&lt;br&gt;
၁ - stream ကနေပြီး data ထွက်ဖို့ရှိတဲ့အခါ&lt;br&gt;
၂ - stream ကို error လှမ်းပို့လိုက်တဲ့အခါ&lt;br&gt;
၃ - stream ပိတ်သွားတဲ့အခါ&lt;br&gt;
အဲ့လိုအချိန်တွေမှာ event တွေကို ထုတ်လွှင့်ပေးတယ်။&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;StreamSubscription&lt;/strong&gt; object ကိုသုံးပြီးတော့ Stream ကို နားထောင်တာ လုံးဝရပ်ဖို့၊ ခဏရပ်ဖို့၊ ဆက်နားထောင်ဖို့ ဒါတွေကို သတ်မှတ်ပေးလို့ရတယ်။&lt;/p&gt;

&lt;p&gt;Stream ကို ပိုက်လိုမျိုးဆိုပြီး ပြောလို့ တဖက်ကဝင်လာတာ တစ်ဖက်က ထွက်သွားရုံပဲတော့ မဟုတ်ဘူး။ ဝင်လာတာတွေကို ပုံစံပြောင်းတာတွေလဲ လုပ်ပေးလို့ရတယ်။ ဒီလိုလုပ်ဖို့ဆိုရင်တော့ &lt;strong&gt;StreamTransformer&lt;/strong&gt; ဆိုတာလိုအပ်လာပြီ။ &lt;em&gt;StreamTransformer&lt;/em&gt; ရဲ့အလုပ်လုပ်ပုံက ရိုးရိုး function လိုမျိုးပဲ ဒါပေမယ့်သူက &lt;em&gt;Stream&lt;/em&gt; ထဲဝင်လာတဲ့ data တွေကို ရယူပြီး အလုပ်လုပ်သွားတာဖြစ်တယ်။ သူထဲမှာ လိုအပ်တာတွေ ပြုလုပ်ပြီးရင် &lt;strong&gt;Stream&lt;/strong&gt; အနေနဲ့ ပြန်ထွက်လာတယ်။ ဒါကြောင့် &lt;em&gt;StreamTransformer&lt;/em&gt; တွေအများကြီးကို တခုပြီးတခု ဆင့်သုံးသွားလို့လဲ​ ရတယ်။ &lt;em&gt;StreamTransformer&lt;/em&gt; တွေကို filtering, regrouping, modification, injection, buffering, processing တွေအပြင် အသုံးပြုလို့ရတာတွေ အများကြီး ရှိတယ်။&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stream&lt;/strong&gt; အမျိုးအစား ၂ခုရှိတယ်။&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single-subscription Streams&lt;/strong&gt; - ဒီအမျိုးအစားကတော့ &lt;em&gt;Stream&lt;/em&gt; စတာကနေ ဆုံးတဲ့အချိန်ထိ listener တခုပဲ နားထောင်လို့ရတယ်။ ပထမနားထောင်နေတဲ့ listener ကိုရပ်ပြီး ပြန်နားထောင်မယ်ဆိုရင်တောင် မရတော့ဘူး။&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Broadcast Streams&lt;/strong&gt; - ဒီအမျိုးအစားကတော့ listener ကြိုက်သလောက် နားထောင်လို့ရတယ်။ listener စပြီးနားထောင်လိုက်တဲ့အချိန်ကစပြီး &lt;em&gt;Stream&lt;/em&gt; ထဲမှာဖြစ်လာသမျှ &lt;em&gt;event&lt;/em&gt; တွေကို လက်ခံရရှိမှာဖြစ်တယ်။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Single-Subscription Stream
import 'dart:async';

void main() {
  final StreamController ctrl = new StreamController();
  final StreamSubscription subscription = ctrl.stream.listen((data) {
    print(data);
  });

  ctrl.sink.add('my name');
  ctrl.sink.add(1234);
  ctrl.sink.add({'a': 'Element A', 'b': 'Element B'});
  ctrl.sink.add(3.142);

  ctrl.close();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Broadcast Stream with StreamTransformer
import 'dart:async';

void main() {
  final StreamController&amp;lt;int&amp;gt; ctrl = new StreamController&amp;lt;int&amp;gt;.broadcast();
  final StreamSubscription subscription = ctrl.stream
      .where((value) =&amp;gt; value % 2 == 0)
      .listen((value) =&amp;gt; print(value));

  for (var i = 0; i &amp;lt; 11; i++) {
    ctrl.sink.add(i);
  }

  ctrl.close();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>React Introduction</title>
      <dc:creator>Arkar Min Tun</dc:creator>
      <pubDate>Wed, 23 Sep 2020 04:26:11 +0000</pubDate>
      <link>https://dev.to/arkarmintun1/react-introduction-164l</link>
      <guid>https://dev.to/arkarmintun1/react-introduction-164l</guid>
      <description>&lt;p&gt;React ဆိုတာ Frontend framework တွေထဲမှာ နာမည်အကြီးဆုံးတခုဖြစ်ပြီး Angular နဲ့ Vue တို့လိုမျိုး Component တွေနဲ့ frontend ကိုတည်ဆောက်တဲ့ နည်းပညာတစ်ခုပဲဖြစ်ပါတယ်။ ပုံမှန်နည်းလမ်းအရ web development လုပ်တယ်ဆို user က request လုပ်တဲ့အချိန် html, css, javascript files တွေကို response ပြန်ပေးပြီး browser က ရလာတဲ့ file တွေကို ပြပေးတာပဲ ဖြစ်ပါတယ်။ အဲ့လိုလုပ်တဲ့အခါ ဘာဖြစ်သလဲဆို အသစ်တခုခေါ်တိုင်း server ကို request ပို့၊ server ကနေ အဲ့ဒါကို html, css, javascript တွေနဲ့ပေါင်းပြီး response ပြန်ပေး၊ ပြီးရင် ရလာတဲ့ page တစ်ခုလုံးကို ပြန်ပြဖို့လုပ် အဲ့လိုမျိုး အကြိမ်တိုင်း လုပ်ပေးရပါတယ်။ react ကို သုံးခြင်းအားဖြင့် အဲ့လို server ကို အကြိမ်ကြိမ်ခေါ်၊ page ကို အကြိမ်ကြိမ်ပြန်ပြတာမျိုး လုပ်စရာမလိုတော့ပဲ website ရဲ့ လိုအပ်တဲ့နေရာတွေကိုပဲ ပြောင်းနိုင် ပြင်နိုင်တာမျိုး လုပ်သွားနိုင်တယ်။ Single Page Application လို့လဲ ခေါ်ကြတယ်။ ဘာလို့လဲဆိုတော့ website ပေါ်မှာဖြစ်နေတာတွေအားလုံးဟာ ထပ်ပြီး refresh လုပ်တာမျိုးမရှိဘဲ single page အတွင်းမှာပဲ အပြောင်းအလဲတွေ ဖြစ်နေတာမျိုးကြောင့်ပါ။&lt;/p&gt;

&lt;p&gt;အဲ့ဒါဆို react ကို စပြီးလေ့လာကြည့်ရအောင်ပါ။ React ကိုလေ့လာမယ်ဆို သူနဲ့ဆက်စပ်ပြီး သိထားသင့်တဲ့ နည်းပညာတွေကတော့ Node, NPM နဲ့ Terminal တွေပါ။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org"&gt;Node&lt;/a&gt; ဆိုတာ JavaScript Runtime ဖြစ်ပြီး ဆိုလိုတာက JavaScript ကို browser ထဲမှာတင်မဟုတ်ဘဲ တခြားနေရာတွေမှာပါ အသုံးချလို့ရအောင် ပြုလုပ်ထားတဲ့ နည်းပညာပဲ ဖြစ်ပါတယ်။&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com"&gt;npm&lt;/a&gt; ဆိုတာ Node Package Manager ဖြစ်ပြီး application တွေ development လုပ်တဲ့အချိန်မှာ လိုအပ်တဲ့ library တွေ၊ Package တွေကို စုစည်းထားပေးတဲ့ source ကြီးပဲဖြစ်ပါတယ်။ Node installation ပြီးတဲ့အခါ npm command ကိုပါ သုံးနိုင်ပါပြီ။ သပ်သပ် install လုပ်ပေးဖို့ မလိုပါဘူး။&lt;/li&gt;
&lt;li&gt;Terminal ကတော့ code တွေရေးပြီး run ဖို့လိုအပ်ပါတယ်။ &lt;a href="https://code.visualstudio.com"&gt;Visual Studio Code&lt;/a&gt; အသုံးပြုတယ်ဆိုရင်တော့ code editor ထဲမှာ အသင့်ပါပြီးသား terminal ကိုလဲ အသုံးပြုနိုင်ပါတယ်။&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8YW34Wl0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7mufdcjhbyca0kaqyv0z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8YW34Wl0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7mufdcjhbyca0kaqyv0z.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;စက်ထဲမှာ node နဲ့ npm သွင်းပြီးမပြီးနဲ့ လက်ရှိ version ကို ဖော်ပြထားတဲ့ command တွေနဲ့ စစ်ကြည့်လို့ရပါတယ်။&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;node --version&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;



&lt;p&gt;&lt;code&gt;npm --version&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;React Project တခု စလုပ်တော့မယ်ဆို ကိုယ်တိုင် file တွေကို နေရာချတာ၊ configuration တွေလုပ်တာတို့ လုပ်နိုင်သလို create-react-app ဆိုတဲ့ command နဲ့လဲ အဆင့်သင့် development စလုပ်နိုင်တဲ့၊ လိုအပ်တဲ့ configuration တွေပြင်ဆင်ပြီးသားဖြစ်တဲ့ project တခုကို ပြုလုပ်နိုင်ပါတယ်။&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx create-react-app sample-app&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;npx ဆိုတာ Node install လုပ်တဲ့အခါ အတူပါလာတဲ့ npm ရဲ့ အစိတ်အပိုင်းတခုပဲဖြစ်ပါတယ်။ တခုသတိပြုရမှာက npx က npm version 5.2 နောက်ပိုင်းမှာမှ ပါလာတဲ့အတွက် အဲ့ထက်ဟောင်းတဲ့ version သုံးနေတယ်ဆိုရင်တော့ npx command ကိုအသုံးပြုနိုင်မှာမဟုတ်ပါဘူး။&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fuVvju2A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/do6kxqiaq135scyaqgbz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fuVvju2A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/do6kxqiaq135scyaqgbz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Command ကို terminal မှာ run ပြီးရင် နည်းနည်းတော့ စောင့်ရတယ်။ &lt;strong&gt;Happy Hacking!&lt;/strong&gt; ဆိုတာပေါ်လာပြီး terminal prompt ပြန်ပြောင်းသွားပြီဆိုရင်တော့  react project တခုကို initialize ပြုလုပ်ပြီးပါပြီ။&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm run start&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;react project ကို စပြီး run ပေးတဲ့ command ဖြစ်ပါတယ်။ ဒီ command ကို run လိုက်တဲ့အခါ localhost:3000 မှာ ခုလိုပေါ်လာရင် react setup အောင်မြင်ပြီပဲဖြစ်ပါတယ်။&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ay3o7qv8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bru1o40d6b19ass3m7q4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ay3o7qv8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bru1o40d6b19ass3m7q4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XwySxoPL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hryey82g4iycebiy08zp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XwySxoPL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hryey82g4iycebiy08zp.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>SafeArea Widget (Widget of the week)</title>
      <dc:creator>Arkar Min Tun</dc:creator>
      <pubDate>Fri, 29 May 2020 21:03:42 +0000</pubDate>
      <link>https://dev.to/arkarmintun1/safearea-widget-widget-of-the-week-1jcb</link>
      <guid>https://dev.to/arkarmintun1/safearea-widget-widget-of-the-week-1jcb</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/lkF0TQJO0bA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  SafeArea Widget ဆိုတာဘာလဲ?
&lt;/h1&gt;

&lt;p&gt;ခုနောက်ပိုင်းထွက်လာတဲ့ ဖုန်းတွေမှာ အရင်ကလိုမျိုး screen က လေးထောင့်ကျမနေတော့ဘူး။ ဘောင်တွေက အကွေးတွေဖြစ်လာပြီး အပေါ်အောက် notch တွေပါလာတယ်။ တကယ်လို့ app ရေးတဲ့အခါ အဲ့လိုမျိုးတွေကို သတိမထားတဲ့အခါ ကိုယ့်ပြချင်တဲ့ content တွေ၊ user action တွေအတွက် button တွေဟာ ကြည့်မရ၊ နှိပ်မရနဲ့ user experience ကို အများကြီး အနှောင့်အယှက်ဖြစ်လာနိုင်တယ်။&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FFq8KpR6%2FSmartphones-with-a-notch.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FFq8KpR6%2FSmartphones-with-a-notch.jpg" alt="Smartphones with notches"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;အဲ့အတွက် flutter မှာ SafeArea ဆိုတဲ့ widget ကိုသုံးပြီး အလွယ်တကူ အဲ့လိုပြဿနာတွေကို ရှောင်ရှားနိုင်ပါတယ်။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HomePage&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatefulWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;_HomePageState&lt;/span&gt; &lt;span class="n"&gt;createState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_HomePageState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;_HomePageState&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;HomePage&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;RaisedButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Click me"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="p"&gt;(){},&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fy7mtpg38y0f1lgzprby7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fy7mtpg38y0f1lgzprby7.png" alt="Without SafeArea"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HomePage&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatefulWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;_HomePageState&lt;/span&gt; &lt;span class="n"&gt;createState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_HomePageState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;_HomePageState&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;HomePage&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;SafeArea&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;RaisedButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Click me"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="p"&gt;(){},&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2e0shbmlssltmplzx473.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2e0shbmlssltmplzx473.png" alt="With SafeArea"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;တကယ်လို့ကိုယ်က default ပေးထားသလို အပေါ်အောက် သူ့ဘာသာ detact လုပ်တာမျိုးမဟုတ်ဘဲ အပေါ်ကိုပဲ သတ်မှတ်ချင်တယ် အောက်ကိုပဲသတ်မှတ်ချင်တယ်ဆိုရင် top, bottom စတဲ့ သက်ဆိုင်ရာ ဘက်အခြမ်းကိုပဲ သတ်မှတ်ပေးလို့ရတယ်။ သူ့ minimum value တွေကို မကြိုက်ဘူးဆိုလဲ ကိုယ့်ဘာသာ minimum ဆိုပြီး သတ်မှတ်လို့ရပါတယ်။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HomePage&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatefulWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;_HomePageState&lt;/span&gt; &lt;span class="n"&gt;createState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_HomePageState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;_HomePageState&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;HomePage&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;SafeArea&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;top:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;bottom:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;minimum:&lt;/span&gt; &lt;span class="n"&gt;EdgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;RaisedButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Click me"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="p"&gt;(){},&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqujlkdjgasg6yqlkgwui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqujlkdjgasg6yqlkgwui.png" alt="Custom value"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
    </item>
    <item>
      <title>Oculus Quest Not showing up on PC</title>
      <dc:creator>Arkar Min Tun</dc:creator>
      <pubDate>Mon, 24 Feb 2020 15:51:53 +0000</pubDate>
      <link>https://dev.to/arkarmintun1/oculus-quest-not-showing-up-on-pc-33dn</link>
      <guid>https://dev.to/arkarmintun1/oculus-quest-not-showing-up-on-pc-33dn</guid>
      <description>&lt;p&gt;If your Oculus Quest not showing up on your PC or Mac, don't worry. It's not a big deal. Just type &lt;code&gt;adb devices&lt;/code&gt; and permission panel will show up in your Headset. Press &lt;code&gt;Allow&lt;/code&gt; Button inside headset. That's it.&lt;/p&gt;

&lt;p&gt;You don't have to turn off developer option for accessing the files on your quest. Some people might say to turn this option off, but you don't have to do that.&lt;/p&gt;

</description>
      <category>oculusquest</category>
    </item>
    <item>
      <title>How to make the label Panel scrollable for Addressables (Unity)</title>
      <dc:creator>Arkar Min Tun</dc:creator>
      <pubDate>Thu, 20 Feb 2020 01:37:37 +0000</pubDate>
      <link>https://dev.to/arkarmintun1/how-to-make-the-label-panel-scrollable-for-addressables-unity-35fj</link>
      <guid>https://dev.to/arkarmintun1/how-to-make-the-label-panel-scrollable-for-addressables-unity-35fj</guid>
      <description>&lt;p&gt;When it comes to asset management in unity with addressable, labels play quite an important role. You can load assets from remote server using the label as a handle. But in current version of addressable (1.6 at the time of writing), labels can't be managed well due to the limitations of panel size and lack of scrolling. In this tutorial I will show simple steps to make the label panel scrollable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1
&lt;/h2&gt;

&lt;p&gt;Find the &lt;strong&gt;LabelWindow.cs&lt;/strong&gt; in the addressable package&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--at1cXmRP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ismpszz24k1jgxljwj8s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--at1cXmRP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ismpszz24k1jgxljwj8s.png" alt="LabelWindow Script" width="462" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2
&lt;/h2&gt;

&lt;p&gt;Add Vector2 scroll position to given places&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pXSlJvHQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.discordapp.com/attachments/524886210146205729/651353410083225611/Annotation_2019-12-03_155529.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pXSlJvHQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.discordapp.com/attachments/524886210146205729/651353410083225611/Annotation_2019-12-03_155529.png" alt="Script 1" width="460" height="98"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S6HMNfpr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.discordapp.com/attachments/524886210146205729/651353173864218644/Annotation_2019-12-03_155405.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S6HMNfpr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.discordapp.com/attachments/524886210146205729/651353173864218644/Annotation_2019-12-03_155405.png" alt="Script 2" width="880" height="155"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that's it. It's that simple.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Unity UI System ဆိုတာဘာလဲ</title>
      <dc:creator>Arkar Min Tun</dc:creator>
      <pubDate>Sun, 29 Dec 2019 04:39:28 +0000</pubDate>
      <link>https://dev.to/arkarmintun1/unity-ui-system-30hp</link>
      <guid>https://dev.to/arkarmintun1/unity-ui-system-30hp</guid>
      <description>&lt;p&gt;အခုတခါမှာတော့ Unity မှာ User Interface (UI) ကို ဘယ်လိုဆောက်သလဲ ကြည့်ရအောင်။&lt;/p&gt;

&lt;p&gt;UI တစ်ခုဆောက်တော့မယ်ဆို အရင်ဆုံး Canvas တခုလိုအပ်တယ်။ ပုံဆွဲသလိုပဲပေါ့။ Canvas ပေါ်မှာ ကိုယ်လိုချင်တာတွေကို တခုပြီးတခု ဆွဲသွားရတာ။ တကယ်လို့ Button ဖြစ်စေ၊ Text ဖြစ်စေ UI Component တခုခုက Canvas ရဲ့ child အနေနဲ့ ရှိမနေရင် UI ပေါ်မှာ ပေါ်လာမှာ မဟုတ်ပါဘူး။&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t0H44d8n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/QJSy3W1/Screen-Shot-2019-12-29-at-9-52-56-AM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t0H44d8n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/QJSy3W1/Screen-Shot-2019-12-29-at-9-52-56-AM.png" alt="UI Components"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;စစချင်း Unity ကိုလုပ်မယ့်သူတွေအတွက်ဆို UI အောက်မှာပါတဲ့ Text တို့၊ Button တို့၊ Dropdown တို့၊ TextInput တို့မှာ နှစ်ခုစီဖြစ်နေတာ နည်းနည်း confusing ဖြစ်တတ်တယ်။ ဘယ်နေရာမှာ ဘယ်ဟာသုံးမလဲပေါ့။&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7dAZaGL7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/3BQdBKy/Screen-Shot-2019-12-29-at-10-00-14-AM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7dAZaGL7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/3BQdBKy/Screen-Shot-2019-12-29-at-10-00-14-AM.png" alt="UI Component Tree"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;နောက်မှာ ဘာမှမပါတဲ့ Text တို့၊ Button တို့ဆိုတာ အရင်ထဲကပါတဲ့ဟာတွေဖြစ်ပြီး TextMeshPro ဆိုတဲ့စာပါတာတွေက နောက်ပိုင်းမှာ အသစ်ထည့်လိုက်တဲ့ဟာတွေပါ။ ဘာကွာသလဲဆိုတော့ TextMeshPro ပါတဲ့ Components တွေကပိုပြီး Customize လုပ်လို့ရလာတယ်၊ Screen မှာပေါ်တဲ့အခါလဲ ဝါးတာမှုန်တာတွေ မဖြစ်အောင် ပိုပြီး လုပ်ရလွယ်သွားတယ်။&lt;/p&gt;

&lt;p&gt;UI အောက်မှာ ပါတဲ့ Component တွေကို အကြမ်းဖျင်း ကြည့်ကြည့်ရအောင်...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;စာတွေဖော်ပြချင်တဲ့အခါသုံးတယ်။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text - TextMeshPro&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;စာတွေဖော်ပြချင်တဲ့အခါသုံးတယ်။ ရိုးရိုး Text ထက်ပိုပြီး Customize လုပ်လို့ရတယ်။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Image&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sprite ပုံတွေ ပြချင်တဲ့အခါသုံးတယ်။ ပြတဲ့အခါ ပုံစံအမျိုးမျိုး လိုအပ်သလို customize လုပ်လို့ရတယ်။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RawImage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Texture ပုံတွေ ပြချင်တဲ့အခါသုံးတယ်။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Button&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;User နှိပ်ဖို့ Button တွေအတွက်သုံးတယ်။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Button - TextMeshPro&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Button မှာပေါ်တဲ့စာကို ပိုပြီး Customize လုပ်နိုင်တယ်။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Toggle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On/Off အနေနဲ့ သတ်မှတ်တာတွေ လုပ်ချင်တဲ့အခါသုံးတယ်။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slider&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Value တွေကို Maximum နဲ့ Minimum နှစ်ခုကြားမှာ ရွေးစေချင်တဲ့အခါ သုံးတယ်။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scrollbar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;တခုထဲသုံးတာထက် ScrollView ထဲမှာ ထည့်သုံးလေ့ရှိတယ်။ ဘယ်ညာ အပေါ်အောက် Scroll လုပ်တာလုပ်ဖို့သုံးတယ်။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dropdown&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;နာမည်မှာပြထားတဲ့အတိုင်းပဲ User တွေကို ရွေးချယ်ဖို့ Option တွေပြချင်တဲ့အခါသုံးတယ်။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dropdown - TextMeshPro&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;နာမည်မှာပြထားတဲ့အတိုင်းပဲ User တွေကို ရွေးချယ်ဖို့ Option တွေပြချင်တဲ့အခါသုံးတယ်။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;InputField&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;User ဆီက နာမည်တို့၊ emailတို့ စသဖြင့် သူတို့ကို ရိုက်ထည့်စေချင်တဲ့အခါ သုံးတယ်။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;InputField - TextMeshPro&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;User ဆီက နာမည်တို့၊ emailတို့ စသဖြင့် သူတို့ကို ရိုက်ထည့်စေချင်တဲ့အခါ သုံးတယ်။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Canvas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;UI Components တွေပြဖို့ မရှိမဖြစ်လိုအပ်တဲ့ Component တခုဖြစ်တယ်။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Panel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;UI Components တွေကို သပ်သပ်စီ စုထားချင်တဲ့အခါ သုံးတယ်။​ ဥပမာ Button တခုကိုနှိပ်လိုက်ရင် alert box တပ်လာသလိုပေါ့။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ScrollView&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contents ပြစရာများတဲ့အခါ Scroll လို့ရတဲ့ View တခုအနေနဲ့ ပြချင်တဲ့အခါသုံးတယ်။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EventSystem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;UI တွေကို နှိပ်လို့ ရွှေ့လို့ရအောင်လုပ်ဖို့ နောက်ကွယ်ကနေ handle လုပ်ပေးနေတဲ့ EventSystem ဖြစ်တယ်။&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Unity ဖြင့် Game Development စတင်ခြင်း</title>
      <dc:creator>Arkar Min Tun</dc:creator>
      <pubDate>Fri, 27 Dec 2019 18:12:58 +0000</pubDate>
      <link>https://dev.to/arkarmintun1/unity-game-development-120k</link>
      <guid>https://dev.to/arkarmintun1/unity-game-development-120k</guid>
      <description>&lt;h1&gt;
  
  
  Installation
&lt;/h1&gt;

&lt;p&gt;Unity Game Development စလုပ်တော့မယ်ဆို ပထမဆုံး Unity Engine ကို သွင်းထားဖို့ လိုပါလိမ့်မယ်။ Unity Engine ကို Download ဆွဲဖို့အတွက် &lt;a href="https://unity.com/"&gt;Link&lt;/a&gt; ကိုသွားပါ။&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GI2d9eUJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/ZWrsbj3/Screen-Shot-2019-12-27-at-11-00-33-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GI2d9eUJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/ZWrsbj3/Screen-Shot-2019-12-27-at-11-00-33-PM.png" alt="Unity Home Page" width="640" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unity Home Page က မကြာခဏ Design ပြောင်းတာဖြစ်တဲ့အတွက် အခုပြထားတဲ့ပုံ မဟုတ်တော့တာလဲ ဖြစ်နိုင်ပါတယ်။&lt;/p&gt;

&lt;p&gt;ညာဘက် အပေါ်ဒေါင့်မှာ ရှိတဲ့ Profile ပုံကိုနှိပ်ပြီး &lt;code&gt;Create a Unity ID&lt;/code&gt; ကိုရွေးပြီး Account အသစ် Create လုပ်ပါ။ အခုမလုပ်လဲ Unity Hub သွင်းပြီးရင် လုပ်ရမှာဖြစ်တဲ့အတွက် အခုတခါထဲ လုပ်ထားလိုက်ပါ။&lt;/p&gt;

&lt;p&gt;Account Create လုပ်ပြီး Login လုပ်ပြီးသွားတဲ့အခါ Get Start ကိုနှိပ်ပါ။ အခုဖော်ပြထားတဲ့ Page ကိုရောက်သွားပါလိမ့်မယ်။&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5koW2l30--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/fkd54Xs/Screen-Shot-2019-12-27-at-11-09-38-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5koW2l30--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/fkd54Xs/Screen-Shot-2019-12-27-at-11-09-38-PM.png" alt="Unity Get Start Page" width="640" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;တစ်ကိုယ်ရည်သုံးမှာဖြစ်တဲ့အတွက် Individual Tab ကိုရွေးလိုက်ပြီး Free ကိုနှိပ်လိုက်ပါ။ အကယ်၍ကိုယ့်မှာ team ရှိပြီး Commercially အရ သတ်မှတ်ချက်ပြည့်မှီရင် Plus License, Pro License စသဖြင့် ဝယ်ပြီး သုံးရမှာ ဖြစ်ပါတယ်။&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dpP9PaUA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/PGfT630/Screen-Shot-2019-12-27-at-11-12-38-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dpP9PaUA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/PGfT630/Screen-Shot-2019-12-27-at-11-12-38-PM.png" alt="Unity License Page" width="640" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ကိုယ်က Unity ကိုအရင်ကသုံးဖူးလားမေးတာဖြစ်ပါတယ်။ ဘယ် Option ရွေးရွေး Unity Hub Installer ကို Download လုပ်လို့ရမှာဖြစ်ပါတယ်။ &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KKdtMHfN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/K0Q8NBj/Screen-Shot-2019-12-27-at-11-12-51-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KKdtMHfN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/K0Q8NBj/Screen-Shot-2019-12-27-at-11-12-51-PM.png" alt="Unity Download Page" width="640" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a73v9N3L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/nCQP1PH/Screen-Shot-2019-12-27-at-11-13-03-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a73v9N3L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/nCQP1PH/Screen-Shot-2019-12-27-at-11-13-03-PM.png" alt="Unity Download Alert" width="640" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unity Hub ဆိုတာ Unity Engine Version တွေကို အလွယ်တကူ စီမံနိုင်ဖို့၊ လေ့လာလို့ရမယ့် resource တွေကို တစုတစည်းထဲ ကြည့်လို့ရအောင် စုထားပေးဖို့၊ ကိုယ့် project တွေကို အလွယ်တကူ တနေရာထဲမှာ ကြည့်လို့ရအောင် လုပ်ထားပေးတာပဲ ဖြစ်ပါတယ်။ ဒါမရှိခင် အရင်ကဆို Unity Project တွေ စက်ထဲမှာ ပြန့်ကျဲနေပြီး project တွေဖွင့်တဲအခါလဲ အဆင်မပြေ အရမ်းဖြစ်ခဲ့ရတယ်။&lt;/p&gt;

&lt;p&gt;Installation ပြီးတဲ့အခါ Unity Hub ကိုဖွင့်လိုက်ပါ။ ရှေ့မှာ create လုပ်ထားတဲ့ Account နဲ့ login ဝင်လိုက်ပါ။ ပြီးရင် Profile Icon ဘေးက Gear Icon ကိုနှိပ်ပြီး License Management ကို နှိပ်လိုက်ပါ။ Free သုံးရင်တောင် Unity Personal License ရှိမှ အဆင်ပြေမှာဖြစ်တဲ့အတွက် License ကို activate လုပ်လိုက်ပါ။&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Abwu5CVq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/YWLRJ6F/Screen-Shot-2019-12-27-at-11-26-16-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Abwu5CVq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/YWLRJ6F/Screen-Shot-2019-12-27-at-11-26-16-PM.png" alt="Unity License Activation 1" width="640" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dn4sMM-P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/M9H38V9/Screen-Shot-2019-12-27-at-11-26-27-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dn4sMM-P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/M9H38V9/Screen-Shot-2019-12-27-at-11-26-27-PM.png" alt="Unity License Activation 2" width="640" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iGGOp306--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/bv71Wnx/Screen-Shot-2019-12-27-at-11-27-06-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iGGOp306--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/bv71Wnx/Screen-Shot-2019-12-27-at-11-27-06-PM.png" alt="Unity License Activation 2" width="640" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;License Activation ပြီးပြီဆိုရင် ရှေ့ကို ပြန်သွားပြီး Unity မှာ ပါတဲ့ Tab တွေကို ကြည့်ရအောင်။&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Projects - လက်ရှိ ကိုယ်လုပ်နေတဲ့ Projects တွေကို တစုတစည်းထဲ ကြည့်ဖို့&lt;/li&gt;
&lt;li&gt;Learn - Unity လေ့လာရာမှာ လွယ်ကူအောင် လုပ်ထားပေးတဲ့ Sample Projects တွေကြည့်ဖို့&lt;/li&gt;
&lt;li&gt;Install - မတူညီတဲ့ Unity Engine Version တွေကို အလွယ်တကူ Install/Uninstall လုပ်နိုင်ဖို့&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unity ရဲ့ Development Cycle ကိုပြောရမယ်ဆို သူ့မှာ Alpha, Beta, Final နဲ့ LTS (Long Term Support) ဆိုပြီး ခွဲကြည့်လို့ရပါတယ်။ နှစ်အလိုက်ထုတ်တဲ့ Version တွေကို ခွဲခြားသိနိုင်ဖို့ ခုနှစ်ကို ရှေ့ဆုံးမှာ ထည့်ထားလေ့ရှိတယ်။ ဥပမာ - 2020.1.0a17 ဆိုရင် 2020 Unity Version ရဲ့ ပထမဆုံး ဖြစ်မယ့် 1.0 ကို alpha version အနေနဲ့ 17 ကြိမ်မြောက်ထုတ်ထားတာပဲ ဖြစ်ပါတယ်။&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--snzc5OpT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/82YPPnT/Screen-Shot-2019-12-28-at-12-25-55-AM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--snzc5OpT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/82YPPnT/Screen-Shot-2019-12-28-at-12-25-55-AM.png" alt="Unity Versions" width="640" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unity 2019.3 မှာတော့ Unity က UI System တခုလုံးကို ပြန်လည်ပြင်ဆင်ထားတာဖြစ်တဲ့အတွက် အရင် Unity Version တွေနဲ့မတူတော့ပါဘူး။ ပြီးတော့ ပြောင်းလဲမှုတွေလဲ များစွာ ပြုလုပ်ထားတာဖြစ်တဲ့အတွက် ယခုလက်ရှိမှာတော့ Final Version ထွက်ပေမယ့် Bug အနည်းနဲ့အများ ရှိသေးတာဖြစ်တဲ့အတွက် 2019.3 မတိုင်ခင် ထွက်တဲ့ 2019.2 နောက်ဆုံး Version ကိုသွင်းလိုက်ပါမယ်။ အကယ်၍ပိုပြီး stable ဖြစ်တဲ့ version သုံးချင်ရင်တော့ LTS Version တွေသုံးနိုင်ပါတယ်။ တခြား Unity Version တွေတခုပြီးတခု အသစ်ထွက်ရင်တောင် LTS Version ကိုတော့ Unity က ၂နှစ်တိတိ support ပေးပါတယ်။&lt;/p&gt;

&lt;p&gt;Unity Engine သွင်းတဲ့အခါ အောက်မှာပြထားသလို panel ပေါ်လာတဲ့အခါ အကုန်လုံး လိုက်သွင်းဖို့ မလိုပါဘူး။ ကိုယ်က Android အတွက် Application လုပ်မယ်ဆို Android နဲ့ဆိုင်တဲ့ Module တွေပဲ သွင်းပေးဖို့လိုပါမယ်။ အကယ်၍ ကိုယ်က iOS အတွက်လုပ်မယ်ဆို iOS Module သွင်းဖို့လိုပါမယ်။ Unity Engine နဲ့လုပ်ထားတဲ့ app တွေကို Android, iOS စတဲ့ platform မျိုးစုံမှာ Run လို့ရပါတယ်။&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nWfvihID--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/fYP6ksV/Screen-Shot-2019-12-28-at-12-36-42-AM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nWfvihID--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.ibb.co/fYP6ksV/Screen-Shot-2019-12-28-at-12-36-42-AM.png" alt="Unity Module Installation" width="640" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Android Module သွင်းတဲ့အခါ သတိပြုဖို့ တချက်က Android Build Support ကို Check လုပ်ထားရင်တောင် သူ့အောက်မှာရှိတဲ့ Android JDK &amp;amp; NDK Tools နဲ့ OpenJDK တို့ကို Check လုပ်ထားတာ ဖြစ်မှာမဟုတ်ပါဘူး။ Expand လုပ်ပြီး manually check လုပ်ပေးမှ Install လုပ်တဲ့အချိန် ပါလာမှာဖြစ်ပါတယ်။&lt;/p&gt;

&lt;p&gt;Installation လုပ်တဲ့အချိိန်ဟာ Connection ပေါ်မူတည်ပြီး နှေးတာမြန်တာ ရှိသလို အကယ်၍ down နေတုန်း လိုင်းပြတ်သွားခဲ့ရင် သွင်းတာတွေအကုန် အစကပြန်စမှာဖြစ်တဲ့အတွက် တခုချင်းဆီ သွင်းသွားတာက ပိုပြီး စိတ်ချရပါတယ်။ အကယ်၍ လိုင်းပြတ်သွားခဲ့ရင်တောင် အစက ပြန်ပြီး သွင်းစရာလိုမှာ မဟုတ်တော့ဘူးပေါ့။&lt;/p&gt;

&lt;p&gt;Unity Version တခု Install လုပ်ပြီးရင်တော့ Unity Development စတင်လို့ရပါပြီ။&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
