Building the Flutter E-Commerce app using ScopedModel
In this part, we’ll be utilizing ScopedModel to handle our app’s state. As discussed in the documents of the ScopedModel:
ScopedModel is a set of utilities that permit you to quickly pass an information Design from a parent Widget down to it’s descendants. In addition, it likewise re-renders all the children who use the model when the model is updated.To start using Scoped Design
, we require to include its dependency in our pubspec.yaml file: Then we produce our
ProductScopedModel class that extends Model from the bundle scoped_model: This where we'll define all our approaches associated with the items. The code for the very same
can be
discovered here. We'll also move are remote information fetching to this class from the ProductsListPage class. The approaches defined over here are: The _ getProductsByCategory()approach and the parseProductsFromReponse()approach are the exact same as we had earlier other than that the parseProductsFromReponse ()technique doesn't return a List now however calls notifyListeners ()rather. We
likewise have a bool variable called _ isLoading that is toggled to signify if our app has completed fetching & parsing the remote data.notifyListeners( )This approach is the
core of ScopedModel. This technique rebuilds the ScopedModelDescendant widget every time the design modifications. For this reason, we do not have to call setState anymore. Every time
the information in our model changes, we call notifyListeners( )in that technique as revealed above in the parseProductsFromResponse()technique. This would restore our ScopedModelDescendant widget immediately. "Where is ScopedModelDescendant?"First, we produce a ScopedModel widget. This will supply the design
to the kids that request it. We simply wrap our Scaffold widget with the ScopedModel widget inside the construct()approach of our ProductsListPage
()
: We merely covered our Scaffold in a ScopedModel widget and supplied a model i.e. ProductScopedModel() to it. Keep in mind that we created our
design outside our ScopedModel widget so that we can invoke our preliminary API call utilizing the design. Next, we create a ScopedModelDescendant.This widget will get the ProductScopedModel from the closest ScopedModel . It will hand that model to our home builder approach, and
rebuild any time the
ProductScopedModel changes (i.e. after
we notifyListeners in the Model)
widget till the time our design's isLoading getter returns real. It would return false when all remote information has been brought and parsed. That's when model.isLoading would end up being incorrect and we 'd have the ability to conjure up the _ buildListView(). We have actually separated out our ProductsListPageBody into a separate widget so that we return a ScopedModelDescendant widget from its construct
() method: Here, we display a CircularProgressIndicatormethod.Since we're being
notified when our design modifications, thanks to the
notifyChanges()approach, we do not need to utilize the FutureBuilder widget
which would upgrade itself as quickly as notifyListeners() gets called in our design: 2 crucial things to keep in mind here: If the model returns an empty item count, we show a Text widget with the message No items offered, for this reason informing
the user about the same.We no longer have a hardcoded itemCount for the ListView.builder. Our itemCount is model.getProductsCount ()+1. The
+1 is for
the SORTand REFINE Container
at the top. Likewise, note that we've eliminated the SizedBox
down in the list.Adding support for pagination: Our app loads 6 products at a time and as quickly as the list is scrolled to theat the
bottom and changed that with a Cushioning widget.Now we havea completely practical list of products. Tapping on
any among them would take us to that item's information page.We can improve thisby adding pagination to our list of items so that more
products are fetched from our remote information as the user scrollsSixth product, the next 6 are fetched.We include an if statement prior to we look for
other indices in the list to see if we have actually scrolled till the end of the available items. If
we have, we examine whether there are more products to be fetched using. If we do have more products, we increment the pageIndex, fetch the next 6 items as well as display a CircularProgressIndicator. We have a variable called currentProductCount, which we initialise to 0 for every
- new API
call.
Next, we increment this variable each time we effectively parse an item in the forEachtechnique. If we parse less
than 6 items, that indicates that we've got no more products on this page and thus we can stop making API requires bring more products. That's when we toggle our bool to false which is
then informed to the ScopedModelDescendant in
our ProductsListPage( )and for this reason this technique to bring
remote data again is not invoked.And there we have it, our app works onboth Android and iOS and a user can easily utilize it to place orders in real-time!
The whole code for Part 4 can be found here. The complete source code for this tutorial can be found here.
Leave a Reply