<?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: benz93chung</title>
    <description>The latest articles on DEV Community by benz93chung (@benz93chung).</description>
    <link>https://dev.to/benz93chung</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%2F706423%2F5b14e801-755e-4547-8c83-7913d8f1f209.png</url>
      <title>DEV Community: benz93chung</title>
      <link>https://dev.to/benz93chung</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/benz93chung"/>
    <language>en</language>
    <item>
      <title>Improving MySejahtera's Check-out Functionality </title>
      <dc:creator>benz93chung</dc:creator>
      <pubDate>Fri, 03 Dec 2021 05:08:12 +0000</pubDate>
      <link>https://dev.to/benz93chung/improving-mysejahteras-check-out-functionality-3je0</link>
      <guid>https://dev.to/benz93chung/improving-mysejahteras-check-out-functionality-3je0</guid>
      <description>&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oh9OpIJY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6hfksk8psbx8av19g1qf.jpg" alt="MySejahtera" width="880" height="658"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;The MySejahtera App (picture courtesy of lowyat.net)&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;MySejahtera has introduced the &lt;a href="https://www.nst.com.my/news/nation/2021/12/757957/mysj-trace-replaces-need-check-out-mysejahtera"&gt;"MySJ Trace" feature&lt;/a&gt;, which solves the very problem of manual check-outs that this article discusses about, written before said feature was introduced.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MySejahtera is a mobile application developed by the Malaysian Government that serves as a response to curb the COVID-19 pandemic through the facilitation of contact tracing, and vaccination arrangements in hopes to achieve the nation's herd immunity.&lt;/p&gt;

&lt;p&gt;It has been essential for the everyday lives of Malaysians and the country's residents during such a time. For one to visit an establishment (restaurant, office, etc), one with the app must check-in upon entrance for as long as the personnel approves of the individual's risk level and vaccination status, and check-out upon exit.&lt;br&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  The Issue Of The Check-out Feature
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZTnqSsbu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.therakyatpost.com/wp-content/uploads/2021/11/MySejahtera-checkout.jpg" alt="MySejahtera" width="720" height="420"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;A family vacation was spoiled over something of MySejahtera they are not aware of.&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;However, it is no stranger to criticism. For one, the check-out feature has received a lot of flak for not being friendly enough for users to check themselves out of locations they're no longer present at.&lt;/p&gt;

&lt;p&gt;Therefore, some users, myself included, have even "stayed" in malls or convenience stores for weeks! 😱&lt;br&gt;
Fortunately as of the time of writing, there is no penalty that would be imposed for those who fail to check-out in due course. &lt;/p&gt;

&lt;p&gt;As comical as the issue may sound, &lt;a href="https://www.therakyatpost.com/news/malaysia/2021/11/20/mother-misses-family-vacation-after-forgetting-to-check-out-in-mysejahtera/"&gt;it has led to the dismay of a family whose mother missed her vacation just because she did not check-out for weeks.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This shines a bad light to the app in question. If the family didn't even think about checking for their mother such a thing, this means there is lack of emphasis for checking out of locations.&lt;/p&gt;

&lt;p&gt;This feature needs some work, and in this article we will explore about the issue exactly and think aloud what can be done to make the feature friendlier, let alone more useful.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;div class="instagram-position"&gt;
  &lt;iframe id="instagram-liquid-tag" src="https://www.instagram.com/p/CWlGGl-hQs2/embed/captioned"&gt;
  &lt;/iframe&gt;
  
&lt;/div&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Local comedian Gajen Nad has succinctly described the issue&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  Shaking things up
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/jox7UHMmZ6FRBFHwLc/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/jox7UHMmZ6FRBFHwLc/giphy.gif" alt="Shaking things up" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For disclosure, UI/UX is something I am currently learning but not my forte at the moment. What I am about to suggest is based on what I know and what I feel is right. Any open and constructive feedback though is welcome! 😊&lt;/p&gt;

&lt;p&gt;With that being said, let's explore the check-out feature and see what we can do differently!&lt;/p&gt;
&lt;h3&gt;
  
  
  Starting page
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Original version
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mTmF-Wtp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wfkkz7ax5f8levyr729h.png" alt="Original starting page" width="300" height="613"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;The start screen at the current state at the time of writing.&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The starting page seems informative. The user's risk status and vaccination status are displayed at the front.&lt;/p&gt;

&lt;p&gt;There is a tile that enables you to check-out your most recent check-in. That is useful, but if it's so important to check out all other check-ins, then we need something here that tells the user how urgent it is to do so.&lt;/p&gt;
&lt;h4&gt;
  
  
  🆕 Reworked version
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---3Vr25AH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8bb0l5jrd9vx5qbyn1z8.png" alt="New start screen" width="300" height="649"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;The start screen, with a check-out reminder.&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Therefore, we can have a reminder at this start screen, reminding user to check-out from locations.&lt;/p&gt;
&lt;h3&gt;
  
  
  Checking out
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Original version
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gEsChsek--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hj6nkk50j6vha40nmewe.png" alt="Check-in History page" width="300" height="614"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--283Rlu93--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2a90z3yfag87pjp00n7d.png" alt="Check-out page" width="300" height="612"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;The fact that there is a reminder at the top on how to assess for outstanding check-ins is concerning.&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;You have to tap upon one of the tiles in the History page to enter the check-in details page in order to check-out.&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The app currently provides an avenue for users to assess a history of check-ins, and check-out those they are no longer present at.&lt;/p&gt;

&lt;p&gt;But the problem is, the UI as it stands makes this whole experience of checking-out an eyeballing exercise. There is lack of proper distinction between locations in terms of its check-in status (checked-in or checked-out) whatsoever, resulting in an inconvenient experience.&lt;/p&gt;

&lt;p&gt;Also, the user has to crawl in to the detail page of a location/check-in history and hit the "Check-out" button one by one.&lt;/p&gt;

&lt;p&gt;This flow can make use of some refinement.&lt;/p&gt;
&lt;h4&gt;
  
  
  🆕 Reworked version
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V32R68rp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zuogdflezosrxmzqpbn2.png" alt="Reworked history page" width="300" height="649"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;A reworked history page.&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What can be done differently here is to split the histories in different tabs, for "checked-in" and "checked-out".&lt;br&gt;
Within the "checked-in" tab, users can check-out each of them on the spot, reducing the walkthrough of individual check-out.&lt;/p&gt;

&lt;p&gt;We can also introduce a "Check-out all" button in this tab. Upon click, all check-ins will be checked out.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://i.giphy.com/media/JqafjjIqfhUoVCk8oY/giphy.gif" alt="Checking out from history page" width="222" height="480"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://i.giphy.com/media/DEVkq75oamCPsixNlM/giphy.gif" alt="Checking out all at history page" width="222" height="480"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Checking out from history page.&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Checking out all at history page.&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l4FGo3IonE0SdQYeY/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l4FGo3IonE0SdQYeY/giphy.gif" alt="Sanitize me all over!" width="480" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Maybe there is a reason why the check-out feature at the time of writing is hard for users to use. To be fair, I would not want to dismiss the developers as lazy in coming up with this feature for at times, it can be the requirements that can lead up to such an experience. &lt;/p&gt;

&lt;p&gt;But I believe there has to be a better way of doing it, and to think aloud and start a conversation can be a start for finding such a way.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;br&gt;
You can check out my mock-up of the app in the following repository:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/benz93chung"&gt;
        benz93chung
      &lt;/a&gt; / &lt;a href="https://github.com/benz93chung/pseudosejahtera"&gt;
        pseudosejahtera
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A clone of the MySejahtera app, meant to pump some Dart/Flutter muscles as well as exploring what could be done differently.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
PseudoSejahtera&lt;/h1&gt;
&lt;h3&gt;
A clone of the &lt;a href="https://mysejahtera.malaysia.gov.my/intro/" rel="nofollow"&gt;MySejahtera app&lt;/a&gt;, meant to pump some Dart/Flutter muscles as well as exploring what could be done differently.&lt;/h3&gt;
&lt;h3&gt;
As seen in my &lt;a href="https://dev.to/benz93chung/improving-mysejahteras-check-out-functionality-3je0" rel="nofollow"&gt;dev.to&lt;/a&gt; article!&lt;/h3&gt;
&lt;br&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://camo.githubusercontent.com/dde175722ec2000c2865f7afe9f46ea92429ea4795ad782f59a144f3bc508392/68747470733a2f2f6465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d2f75706c6f6164732f61727469636c65732f616e6939683763736f6a636f347438366e7a39302e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/dde175722ec2000c2865f7afe9f46ea92429ea4795ad782f59a144f3bc508392/68747470733a2f2f6465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d2f75706c6f6164732f61727469636c65732f616e6939683763736f6a636f347438366e7a39302e706e67" width="214" height="463"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://camo.githubusercontent.com/d3cd4f85de4d2edc0142c07fa7c73e7352a47d88c967f5c30205b4e2f6f51521/68747470733a2f2f6465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d2f75706c6f6164732f61727469636c65732f6f6b716d3939616b6635726f326534346f6d71732e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/d3cd4f85de4d2edc0142c07fa7c73e7352a47d88c967f5c30205b4e2f6f51521/68747470733a2f2f6465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d2f75706c6f6164732f61727469636c65732f6f6b716d3939616b6635726f326534346f6d71732e706e67" width="214" height="463"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://camo.githubusercontent.com/8f12d464b067fc03d949ea7cfed2dbaa24cdabd5c6439d41f34429268581eff1/68747470733a2f2f6465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d2f75706c6f6164732f61727469636c65732f31723963796a6e73747362677436793736676d742e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/8f12d464b067fc03d949ea7cfed2dbaa24cdabd5c6439d41f34429268581eff1/68747470733a2f2f6465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d2f75706c6f6164732f61727469636c65732f31723963796a6e73747362677436793736676d742e706e67" width="214" height="463"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h2&gt;
⚠️ Important ⚠️
&lt;/h2&gt;
&lt;h3&gt;
This mock-up of an app is NOT developed by the Malaysian Government. It is STRICTLY for educational purposes and is not meant to be used in real world situations.&lt;/h3&gt;
&lt;h3&gt;
For such situations, you should download and use the MySejahtera app.&lt;/h3&gt;
&lt;br&gt;
&lt;h2&gt;
Setup&lt;/h2&gt;
&lt;h3&gt;
Before trying to run the app locally, run the &lt;code&gt;build_project.sh&lt;/code&gt; script under the &lt;code&gt;scripts&lt;/code&gt; folder. This will generate the mocks (for unit test) and retrieve the project dependencies.&lt;/h3&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/benz93chung/pseudosejahtera"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>mobile</category>
      <category>uiweekly</category>
      <category>ux</category>
    </item>
    <item>
      <title>Case Study: Externally rebuilding StatefulWidget</title>
      <dc:creator>benz93chung</dc:creator>
      <pubDate>Thu, 04 Nov 2021 09:48:35 +0000</pubDate>
      <link>https://dev.to/benz93chung/case-study-rebuilding-statefulwidgets-upon-state-change-5feh</link>
      <guid>https://dev.to/benz93chung/case-study-rebuilding-statefulwidgets-upon-state-change-5feh</guid>
      <description>&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%2Fuploads%2Farticles%2Fi5fe2tzp6cgv0r8pj2to.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi5fe2tzp6cgv0r8pj2to.jpg" alt="Stock image of alphabet blocks that altogether constitute to a word of REBUILDING"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have been developing apps on Flutter long enough, chances are you've been making use of a state management tool, like &lt;a href="https://pub.dev/packages/provider" rel="noopener noreferrer"&gt;Provider&lt;/a&gt;, &lt;a href="https://pub.dev/packages/flutter_bloc" rel="noopener noreferrer"&gt;BLoC&lt;/a&gt;, &lt;a href="https://pub.dev/packages/flutter_mobx" rel="noopener noreferrer"&gt;MobX&lt;/a&gt;, or the like.&lt;/p&gt;

&lt;p&gt;If so, there might be a chance you've stumbled upon a certain problem, whereby a &lt;code&gt;StatefulWidget&lt;/code&gt; doesn't choose to update itself upon state change.&lt;/p&gt;

&lt;p&gt;This is a pretty specific problem. So in this article, we will walk through the problem and its solution via examples.&lt;/p&gt;

&lt;p&gt;If you just want to know the summary, feel free to scroll downwards to the &lt;strong&gt;Summary&lt;/strong&gt; section.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Counter App
&lt;/h2&gt;

&lt;p&gt;Let's start off with the Hello World of Flutter app, the Counter App. For this, we will be using MobX as its state management tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;counter_store.dart&lt;/strong&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;'package:mobx/mobx.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;part&lt;/span&gt; &lt;span class="s"&gt;'counter_store.g.dart'&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;CounterStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_CounterStore&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;_$CounterStore&lt;/span&gt;&lt;span class="p"&gt;;&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;_CounterStore&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;Store&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@observable&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nd"&gt;@action&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="o"&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;Whether you are familiar with MobX or not, just understand that we have a store that contains a data member of &lt;code&gt;sum&lt;/code&gt;, and a method that adds said data member by 1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;my_home_page.dart&lt;/strong&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;MyHomePage&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;counterStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CounterStore&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;appBar:&lt;/span&gt; &lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="p"&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="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Counter'&lt;/span&gt;&lt;span class="p"&gt;),&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;Center&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;Observer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&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;StatelessCounterBody&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nl"&gt;value:&lt;/span&gt; &lt;span class="n"&gt;counterStore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nl"&gt;onPressedAddButton:&lt;/span&gt; &lt;span class="n"&gt;counterStore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;increment&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;stateless_counter_body.dart&lt;/strong&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;StatelessCounterBody&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;GestureTapCallback&lt;/span&gt; &lt;span class="n"&gt;onPressedAddButton&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;StatelessCounterBody&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&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;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&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;onPressedAddButton&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&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="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;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;mainAxisAlignment:&lt;/span&gt; &lt;span class="n"&gt;MainAxisAlignment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;center&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Widget&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;[&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;'You have pushed the button this many times:'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;),&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;'&lt;/span&gt;&lt;span class="si"&gt;$value&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="n"&gt;Theme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textTheme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;headline4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;padding:&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="mf"&gt;16.0&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
        &lt;span class="n"&gt;FloatingActionButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="n"&gt;onPressedAddButton&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;tooltip:&lt;/span&gt; &lt;span class="s"&gt;'Increment'&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;Icon&lt;/span&gt;&lt;span class="p"&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="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;This Counter App here is done a bit differently. We've refactored the content as a &lt;code&gt;StatelessWidget&lt;/code&gt; with the name of &lt;code&gt;StatelessCounterBody&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;From where this &lt;code&gt;StatelessCounterBody&lt;/code&gt; is used (my_home_page.dart), once the &lt;code&gt;onPressedAddButton&lt;/code&gt; callback is triggered, &lt;code&gt;counterStore.increment()&lt;/code&gt; is called to set the store's &lt;code&gt;value&lt;/code&gt;. Therefore the wrapping &lt;code&gt;Observer&lt;/code&gt; widget will discard the current instance and rebuild a new instance of &lt;code&gt;StatelessCounterBody&lt;/code&gt;, where the value of its &lt;code&gt;value&lt;/code&gt; parameter is the new value of &lt;code&gt;sum&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/ra8LDGzWVlOFNTa5qi/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/ra8LDGzWVlOFNTa5qi/giphy.gif" alt="Voila! The Counter App works!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sweet! Works well so far.&lt;/p&gt;
&lt;h2&gt;
  
  
  Going Reactive, Going Stateful
&lt;/h2&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%2Fidsb.tmgrup.com.tr%2Fly%2Fuploads%2Fimages%2F2021%2F08%2F30%2F140354.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%2Fidsb.tmgrup.com.tr%2Fly%2Fuploads%2Fimages%2F2021%2F08%2F30%2F140354.jpg" alt="Messi in his usual self, being "&gt;&lt;/a&gt;&lt;br&gt;
Now comes a thought, of making a &lt;code&gt;StatefulWidget&lt;/code&gt; version of &lt;code&gt;StatelessCounterBody&lt;/code&gt;, and we want to call it as &lt;code&gt;StatefulCounterBody&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Why would we want to do that? That's because now we want to make this widget reactive than static.&lt;/p&gt;

&lt;p&gt;And yes, &lt;code&gt;setState&lt;/code&gt; shall be used for internal rebuilding upon state changes for this widget in mind, because we do not want it to be reliant on other external means to have its state mutated (for example, expecting a certain store of a certain state management tool as its parameter and mutations are done with it).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;stateful_counter_body.dart&lt;/strong&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;StatefulCounterBody&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="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;initialValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;onValueIncrement&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;StatefulCounterBody&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&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;initialValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&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;onValueIncrement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&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="p"&gt;);&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;_StatefulCounterBodyState&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;_StatefulCounterBodyState&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;_StatefulCounterBodyState&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;StatefulCounterBody&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;late&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&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;initState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&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;initState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="n"&gt;_value&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;initialValue&lt;/span&gt;&lt;span class="p"&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;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;mainAxisAlignment:&lt;/span&gt; &lt;span class="n"&gt;MainAxisAlignment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;center&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Widget&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;[&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;'You have pushed the button this many times:'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;),&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;'&lt;/span&gt;&lt;span class="si"&gt;$_value&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="n"&gt;Theme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textTheme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;headline4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;padding:&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="mf"&gt;16.0&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
        &lt;span class="n"&gt;FloatingActionButton&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="n"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&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;onValueIncrement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_value&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="nl"&gt;tooltip:&lt;/span&gt; &lt;span class="s"&gt;'Increment'&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;Icon&lt;/span&gt;&lt;span class="p"&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="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;For the case of &lt;code&gt;StatefulCounterBody&lt;/code&gt;, we want it to react to the value changes all in itself. From the outside, the &lt;code&gt;initialValue&lt;/code&gt; is to be provided, as well as a callback called &lt;code&gt;onValueIncrement&lt;/code&gt;, where in itself returns the updated value upon incrementing.&lt;/p&gt;
&lt;h2&gt;
  
  
  Changed My Mind
&lt;/h2&gt;

&lt;p&gt;So now, we decided that we want to add another button at the home page, where upon click adds the &lt;code&gt;sum&lt;/code&gt; by 5.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;counter_store.dart&lt;/strong&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;'package:mobx/mobx.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;part&lt;/span&gt; &lt;span class="s"&gt;'counter_store.g.dart'&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;CounterStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_CounterStore&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;_$CounterStore&lt;/span&gt;&lt;span class="p"&gt;;&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;_CounterStore&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;Store&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@observable&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nd"&gt;@action&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Newly added!&lt;/span&gt;
  &lt;span class="nd"&gt;@action&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;incrementByFive&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;5&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;Hence, adding &lt;code&gt;incrementByFive()&lt;/code&gt; to the store.&lt;/p&gt;
&lt;h2&gt;
  
  
  Making Use Of That StatefulWidget
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;my_home_page.dart&lt;/strong&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;MyHomePage&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;counterStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CounterStore&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;appBar:&lt;/span&gt; &lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="p"&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="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Counter'&lt;/span&gt;&lt;span class="p"&gt;),&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;Center&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;Observer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&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;StatefulCounterBody&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nl"&gt;initialValue:&lt;/span&gt; &lt;span class="n"&gt;counterStore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nl"&gt;onValueIncrement:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="n"&gt;counterStore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&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="nl"&gt;floatingActionButton:&lt;/span&gt; &lt;span class="n"&gt;FloatingActionButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="n"&gt;counterStore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;incrementByFive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;tooltip:&lt;/span&gt; &lt;span class="s"&gt;'Add by 5'&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;Icon&lt;/span&gt;&lt;span class="p"&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="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;Button added, &lt;code&gt;StatefulCounterBody&lt;/code&gt; ready. Let's give it a go.&lt;br&gt;
&lt;a href="https://i.giphy.com/media/t87uW47nGLWK30in2J/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/t87uW47nGLWK30in2J/giphy.gif" alt="Nice"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nice! Now let's try the newly added button; bottom right.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/OG3jumGS8esXhEoDjK/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/OG3jumGS8esXhEoDjK/giphy.gif" alt="Oh no"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait. Why isn't that working?!&lt;/p&gt;
&lt;h2&gt;
  
  
  The Fact about StatefulWidgets
&lt;/h2&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%2Fwww.flutterclutter.dev%2Fwp-content%2Fuploads%2F2020%2F08%2Fstatelesswidget-vs-statefulwidget-diagram-1536x1231.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%2Fwww.flutterclutter.dev%2Fwp-content%2Fuploads%2F2020%2F08%2Fstatelesswidget-vs-statefulwidget-diagram-1536x1231.png" alt="Stateless and StatefulWidget diagrams"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Diagram by Flutter Clutter. Check out his article about &lt;a href="https://www.flutterclutter.dev/flutter/basics/statelesswidget-vs-statefulwidget/2020/1195/" rel="noopener noreferrer"&gt;StatelessWidget vs. StatefulWidget&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whenever a &lt;code&gt;StatefulWidget&lt;/code&gt; is constructed, the &lt;code&gt;State&lt;/code&gt; first gets created via &lt;code&gt;createState()&lt;/code&gt;, then the &lt;code&gt;StatefulWidget&lt;/code&gt; is built. As the state changes, while the &lt;code&gt;StatefulWidget&lt;/code&gt; gets discarded and rebuilt, (internally via &lt;code&gt;setState()&lt;/code&gt; or externally via &lt;code&gt;Observer&lt;/code&gt;, &lt;code&gt;BlocBuilder&lt;/code&gt;, etc.), the &lt;code&gt;State&lt;/code&gt; remains.&lt;/p&gt;

&lt;p&gt;For our case, as &lt;code&gt;counterStore.incrementByFive()&lt;/code&gt; was called and the &lt;code&gt;Observer&lt;/code&gt; tries to externally rebuild a new instance of &lt;code&gt;StatefulCounterBody&lt;/code&gt;, the instance was rebuilt, but the &lt;code&gt;State&lt;/code&gt; persisted.&lt;/p&gt;

&lt;p&gt;That is because we are yet to add something that informs the &lt;code&gt;StatefulWidget&lt;/code&gt; to look out for the differences between the old and the new instances that should affect the state.&lt;/p&gt;
&lt;h2&gt;
  
  
  Art Thou Updated?
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="nd"&gt;@override&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;didUpdateWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;covariant&lt;/span&gt; &lt;span class="n"&gt;StatefulCounterBody&lt;/span&gt; &lt;span class="n"&gt;oldWidget&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&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;didUpdateWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oldWidget&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oldWidget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;initialValue&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;initialValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_value&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;initialValue&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;Therefore, the lifecycle method we can make use of is &lt;code&gt;didUpdateWidget()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If there's a difference between the previous instance and the new instance, then it should update the state with that of the new instance accordingly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/pCA4UTQ2aIVUcIKWaI/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/pCA4UTQ2aIVUcIKWaI/giphy.gif" alt="Oh no"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Brilliant! It now works! :D&lt;/p&gt;
&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;If you have problems trying to externally rebuild a &lt;code&gt;StatefulWidget&lt;/code&gt; with &lt;code&gt;Observer&lt;/code&gt;, &lt;code&gt;BlocBuilder&lt;/code&gt; or by however rebuilding is done in other state management tools, then the widget has to know how to be aware of updating its &lt;code&gt;State&lt;/code&gt; accordingly if there's found to be differences between the old and the new instance by using the &lt;code&gt;didUpdateWidget()&lt;/code&gt; lifecycle method.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



</description>
      <category>flutter</category>
      <category>todayilearned</category>
      <category>programming</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
