Before learning what is Fluter BLoC. Have a look at architecture 1 application using BLoC Pattern.
1. What is BLoC Parttern.
If you have been an Android developer, you are probably familiar with two famous architectures, MVP and MVVM, which have been used a lot in recent years. If you look at the diagram above, you can also imagine that BLoC Parttern is almost completely similar to the two architectures mentioned above.
The above diagram shows how data flow from UI to Data layer and vice versa. BLOC does not have any association with Widgets on UI and UI only listens for changes coming from BLOC class.
BLoC is a state management system for Fultter recommended by Google developers . It helps programmers manage the state and data flow in your application. So what does BLoC use to help us do these things?
The answer is “STREAMS” or “REACTIVE” . Generally data is transferred from BLOC to UI or vice versa from UI to BLOC as STREAMS .
Here I will build a small project to get data from the server and display it in the form of a list to help you better understand the mechanism of BLOC.
2. Use BLoC Parttern
In the project creation part, I will not talk in detail here.
- blocs package is where will contain the BLOC implementation code of the application.
- the models package is the place for the models class corresponding to the Json file retrieved from the server.
- resources package where the classes perform the functionality to interact with the server.
- ui package contains UI classes to display on the screen for users.
In addition, here I need to use more RxDart library. Open and add the file pubspec.yaml
1 2 3 4 5 6 7 8 9 10 | dependencies: flutter: sdk: flutter # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.2 rxdart: ^0.18.0 http: ^0.12.0+1 |
Synchronize the library with the Terminal command
1 2 | flutter packages get |
After this step you need to make sure you have operated with moviedb . If you do not know this famous database, you can refer to it here
If you do, then the api we need to use is here
http://api.themoviedb.org/3/movie/popular?api_key=your_api_key ”
Enter Api_key and test with Postman, we will get a Json string as follows.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <span class="token punctuation">{</span> <span class="token string">"page"</span> <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"total_results"</span> <span class="token punctuation">:</span> <span class="token number">19772</span> <span class="token punctuation">,</span> <span class="token string">"total_pages"</span> <span class="token punctuation">:</span> <span class="token number">989</span> <span class="token punctuation">,</span> <span class="token string">"results"</span> <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token string">"vote_count"</span> <span class="token punctuation">:</span> <span class="token number">6503</span> <span class="token punctuation">,</span> <span class="token string">"id"</span> <span class="token punctuation">:</span> <span class="token number">299536</span> <span class="token punctuation">,</span> <span class="token string">"video"</span> <span class="token punctuation">:</span> <span class="token boolean">false</span> <span class="token punctuation">,</span> <span class="token string">"vote_average"</span> <span class="token punctuation">:</span> <span class="token number">8.3</span> <span class="token punctuation">,</span> <span class="token string">"title"</span> <span class="token punctuation">:</span> <span class="token string">"Avengers: Infinity War"</span> <span class="token punctuation">,</span> <span class="token string">"popularity"</span> <span class="token punctuation">:</span> <span class="token number">350.154</span> <span class="token punctuation">,</span> <span class="token string">"poster_path"</span> <span class="token punctuation">:</span> <span class="token string">"/7WsyChQLEftFiDOVTGkv3hFpyyt.jpg"</span> <span class="token punctuation">,</span> <span class="token string">"original_language"</span> <span class="token punctuation">:</span> <span class="token string">"en"</span> <span class="token punctuation">,</span> <span class="token string">"original_title"</span> <span class="token punctuation">:</span> <span class="token string">"Avengers: Infinity War"</span> <span class="token punctuation">,</span> <span class="token string">"genre_ids"</span> <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">12</span> <span class="token punctuation">,</span> <span class="token number">878</span> <span class="token punctuation">,</span> <span class="token number">14</span> <span class="token punctuation">,</span> <span class="token number">28</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token string">"backdrop_path"</span> <span class="token punctuation">:</span> <span class="token string">"/bOGkgRGdhrBYJSLpXaxhXVstddV.jpg"</span> <span class="token punctuation">,</span> <span class="token string">"adult"</span> <span class="token punctuation">:</span> <span class="token boolean">false</span> <span class="token punctuation">,</span> <span class="token string">"overview"</span> <span class="token punctuation">:</span> <span class="token string">"As the Avengers and their allies have continued to protect the world from threats too large for any one hero to handle, a new danger has emerged from the cosmic shadows: Thanos. ..."</span> <span class="token punctuation">,</span> <span class="token string">"release_date"</span> <span class="token punctuation">:</span> <span class="token string">"2018-04-25"</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> |
Back to the models package we need to create new classes to convert data from String => Object
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | <span class="token keyword">class</span> <span class="token class-name">ItemModel</span> <span class="token punctuation">{</span> int _page <span class="token punctuation">;</span> int _total_results <span class="token punctuation">;</span> int _total_pages <span class="token punctuation">;</span> List <span class="token operator"><</span> _Result <span class="token operator">></span> _results <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> ItemModel <span class="token punctuation">.</span> <span class="token function">fromJson</span> <span class="token punctuation">(</span> Map <span class="token operator"><</span> String <span class="token punctuation">,</span> <span class="token keyword">dynamic</span> <span class="token operator">></span> parsedJson <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">print</span> <span class="token punctuation">(</span> parsedJson <span class="token punctuation">[</span> <span class="token string">'results'</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> length <span class="token punctuation">)</span> <span class="token punctuation">;</span> _page <span class="token operator">=</span> parsedJson <span class="token punctuation">[</span> <span class="token string">'page'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> _total_results <span class="token operator">=</span> parsedJson <span class="token punctuation">[</span> <span class="token string">'total_results'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> _total_pages <span class="token operator">=</span> parsedJson <span class="token punctuation">[</span> <span class="token string">'total_pages'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> List <span class="token operator"><</span> _Result <span class="token operator">></span> temp <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> int i <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">;</span> i <span class="token operator"><</span> parsedJson <span class="token punctuation">[</span> <span class="token string">'results'</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> length <span class="token punctuation">;</span> i <span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> _Result result <span class="token operator">=</span> <span class="token function">_Result</span> <span class="token punctuation">(</span> parsedJson <span class="token punctuation">[</span> <span class="token string">'results'</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> i <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> temp <span class="token punctuation">.</span> <span class="token function">add</span> <span class="token punctuation">(</span> result <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> _results <span class="token operator">=</span> temp <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// get set </span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">_Result</span> <span class="token punctuation">{</span> int _vote_count <span class="token punctuation">;</span> int _id <span class="token punctuation">;</span> bool _video <span class="token punctuation">;</span> <span class="token keyword">var</span> _vote_average <span class="token punctuation">;</span> String _title <span class="token punctuation">;</span> double _popularity <span class="token punctuation">;</span> String _poster_path <span class="token punctuation">;</span> String _original_language <span class="token punctuation">;</span> String _original_title <span class="token punctuation">;</span> List <span class="token operator"><</span> int <span class="token operator">></span> _genre_ids <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> String _backdrop_path <span class="token punctuation">;</span> bool _adult <span class="token punctuation">;</span> String _overview <span class="token punctuation">;</span> String _release_date <span class="token punctuation">;</span> <span class="token function">_Result</span> <span class="token punctuation">(</span> result <span class="token punctuation">)</span> <span class="token punctuation">{</span> _vote_count <span class="token operator">=</span> result <span class="token punctuation">[</span> <span class="token string">'vote_count'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> _id <span class="token operator">=</span> result <span class="token punctuation">[</span> <span class="token string">'id'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> _video <span class="token operator">=</span> result <span class="token punctuation">[</span> <span class="token string">'video'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> _vote_average <span class="token operator">=</span> result <span class="token punctuation">[</span> <span class="token string">'vote_average'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> _title <span class="token operator">=</span> result <span class="token punctuation">[</span> <span class="token string">'title'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> _popularity <span class="token operator">=</span> result <span class="token punctuation">[</span> <span class="token string">'popularity'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> _poster_path <span class="token operator">=</span> result <span class="token punctuation">[</span> <span class="token string">'poster_path'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> _original_language <span class="token operator">=</span> result <span class="token punctuation">[</span> <span class="token string">'original_language'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> _original_title <span class="token operator">=</span> result <span class="token punctuation">[</span> <span class="token string">'original_title'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> int i <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">;</span> i <span class="token operator"><</span> result <span class="token punctuation">[</span> <span class="token string">'genre_ids'</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> length <span class="token punctuation">;</span> i <span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> _genre_ids <span class="token punctuation">.</span> <span class="token function">add</span> <span class="token punctuation">(</span> result <span class="token punctuation">[</span> <span class="token string">'genre_ids'</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> i <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> _backdrop_path <span class="token operator">=</span> result <span class="token punctuation">[</span> <span class="token string">'backdrop_path'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> _adult <span class="token operator">=</span> result <span class="token punctuation">[</span> <span class="token string">'adult'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> _overview <span class="token operator">=</span> result <span class="token punctuation">[</span> <span class="token string">'overview'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> _release_date <span class="token operator">=</span> result <span class="token punctuation">[</span> <span class="token string">'release_date'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// get set </span> <span class="token punctuation">}</span> |
Here you pay attention and the function ItemModel.fromJson () it will perform the data conversion from Json => Object with the correct keys.
Now we will be interested in how to get data from the Server and Convert to Object for use. You come back to the resources package , create a movie_api_provider.dart file . and put the following lines of code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <span class="token keyword">class</span> <span class="token class-name">MovieApiProvider</span> <span class="token punctuation">{</span> Client client <span class="token operator">=</span> <span class="token function">Client</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">final</span> _apiKey <span class="token operator">=</span> <span class="token string">'your_api_key'</span> <span class="token punctuation">;</span> Future <span class="token operator"><</span> ItemModel <span class="token operator">></span> <span class="token function">fetchMovieList</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">async</span> <span class="token punctuation">{</span> <span class="token function">print</span> <span class="token punctuation">(</span> <span class="token string">"entered"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">final</span> response <span class="token operator">=</span> <span class="token keyword">await</span> client <span class="token punctuation">.</span> <span class="token keyword">get</span> <span class="token punctuation">(</span> <span class="token string">"http://api.themoviedb.org/3/movie/popular?api_key=$_apiKey"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">print</span> <span class="token punctuation">(</span> response <span class="token punctuation">.</span> body <span class="token punctuation">.</span> <span class="token function">toString</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> response <span class="token punctuation">.</span> statusCode <span class="token operator">==</span> <span class="token number">200</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// If the call to the server was successful, parse the JSON</span> <span class="token keyword">return</span> ItemModel <span class="token punctuation">.</span> <span class="token function">fromJson</span> <span class="token punctuation">(</span> json <span class="token punctuation">.</span> <span class="token function">decode</span> <span class="token punctuation">(</span> response <span class="token punctuation">.</span> body <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment">// If that call was not successful, throw an error.</span> <span class="token keyword">throw</span> <span class="token function">Exception</span> <span class="token punctuation">(</span> <span class="token string">'Failed to load post'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Func fetchMovieList () will do the job you want. But note that it throws an exception if the data retrieval and conversion job fails.
1 2 3 4 5 6 | <span class="token keyword">class</span> <span class="token class-name">Repository</span> <span class="token punctuation">{</span> <span class="token keyword">final</span> moviesApiProvider <span class="token operator">=</span> <span class="token function">MovieApiProvider</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> Future <span class="token operator"><</span> ItemModel <span class="token operator">></span> <span class="token function">fetchAllMovies</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> moviesApiProvider <span class="token punctuation">.</span> <span class="token function">fetchMovieList</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Initialize the Repository to contain the methods provided by MovieApi . Here we only demo 1 api so it is quite redundant, but imagine that in your application there are many Api from many different sources and you need to gather them under a certain Title like UserRepository or MovieRepository . it has quite a lot of effect.
Now comes the most important part of the article. You guys are back with the blocs package
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token keyword">class</span> <span class="token class-name">MoviesBloc</span> <span class="token punctuation">{</span> <span class="token keyword">final</span> _repository <span class="token operator">=</span> <span class="token function">Repository</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">final</span> _moviesFetcher <span class="token operator">=</span> PublishSubject <span class="token operator"><</span> ItemModel <span class="token operator">></span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> Observable <span class="token operator"><</span> ItemModel <span class="token operator">></span> <span class="token keyword">get</span> allMovies <span class="token operator">=</span> <span class="token operator">></span> _moviesFetcher <span class="token punctuation">.</span> stream <span class="token punctuation">;</span> <span class="token function">fetchAllMovies</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">async</span> <span class="token punctuation">{</span> ItemModel itemModel <span class="token operator">=</span> <span class="token keyword">await</span> _repository <span class="token punctuation">.</span> <span class="token function">fetchAllMovies</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> _moviesFetcher <span class="token punctuation">.</span> sink <span class="token punctuation">.</span> <span class="token function">add</span> <span class="token punctuation">(</span> itemModel <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">dispose</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> _moviesFetcher <span class="token punctuation">.</span> <span class="token function">close</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">final</span> bloc <span class="token operator">=</span> <span class="token function">MoviesBloc</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Here, I do not create a PublishSubject, it is responsible for adding data that it receives from the Repository as ItemModel and passing data to the UI as a stream . To do the above work, I create a function fetchAllMovies () with the return type of 1 Observable . (If you do not understand what Observable is, you can refer to RxDart and Observable here )
Looking down the last line, I created a variable to be able to access MoviesBloc .
Now for the last part. Is how to display the data retrieved from the server at the top on the application screen. In the ui package you add a file movie_list.dart
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <span class="token keyword">class</span> <span class="token class-name">MovieList</span> <span class="token keyword">extends</span> <span class="token class-name">StatelessWidget</span> <span class="token punctuation">{</span> <span class="token metadata symbol">@override</span> Widget <span class="token function">build</span> <span class="token punctuation">(</span> BuildContext context <span class="token punctuation">)</span> <span class="token punctuation">{</span> bloc <span class="token punctuation">.</span> <span class="token function">fetchAllMovies</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">Scaffold</span> <span class="token punctuation">(</span> appBar <span class="token punctuation">:</span> <span class="token function">AppBar</span> <span class="token punctuation">(</span> title <span class="token punctuation">:</span> <span class="token function">Text</span> <span class="token punctuation">(</span> <span class="token string">'Popular Movies'</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> body <span class="token punctuation">:</span> <span class="token function">StreamBuilder</span> <span class="token punctuation">(</span> stream <span class="token punctuation">:</span> bloc <span class="token punctuation">.</span> allMovies <span class="token punctuation">,</span> builder <span class="token punctuation">:</span> <span class="token punctuation">(</span> context <span class="token punctuation">,</span> AsyncSnapshot <span class="token operator"><</span> ItemModel <span class="token operator">></span> snapshot <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> snapshot <span class="token punctuation">.</span> hasData <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">buildList</span> <span class="token punctuation">(</span> snapshot <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> snapshot <span class="token punctuation">.</span> hasError <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">Text</span> <span class="token punctuation">(</span> snapshot <span class="token punctuation">.</span> error <span class="token punctuation">.</span> <span class="token function">toString</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token function">Center</span> <span class="token punctuation">(</span> child <span class="token punctuation">:</span> <span class="token function">CircularProgressIndicator</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> Widget <span class="token function">buildList</span> <span class="token punctuation">(</span> AsyncSnapshot <span class="token operator"><</span> ItemModel <span class="token operator">></span> snapshot <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> GridView <span class="token punctuation">.</span> <span class="token function">builder</span> <span class="token punctuation">(</span> itemCount <span class="token punctuation">:</span> snapshot <span class="token punctuation">.</span> data <span class="token punctuation">.</span> results <span class="token punctuation">.</span> length <span class="token punctuation">,</span> gridDelegate <span class="token punctuation">:</span> <span class="token keyword">new</span> <span class="token class-name">SliverGridDelegateWithFixedCrossAxisCount</span> <span class="token punctuation">(</span> crossAxisCount <span class="token punctuation">:</span> <span class="token number">2</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> itemBuilder <span class="token punctuation">:</span> <span class="token punctuation">(</span> BuildContext context <span class="token punctuation">,</span> int index <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> Image <span class="token punctuation">.</span> <span class="token function">network</span> <span class="token punctuation">(</span> 'https <span class="token punctuation">:</span> <span class="token operator">/</span> <span class="token operator">/</span> image <span class="token punctuation">.</span> tmdb <span class="token punctuation">.</span> org <span class="token operator">/</span> t <span class="token operator">/</span> p <span class="token operator">/</span> w185$ <span class="token punctuation">{</span> snapshot <span class="token punctuation">.</span> data <span class="token punctuation">.</span> results <span class="token punctuation">[</span> index <span class="token punctuation">]</span> <span class="token punctuation">.</span> poster_path <span class="token punctuation">}</span> ' <span class="token punctuation">,</span> fit <span class="token punctuation">:</span> BoxFit <span class="token punctuation">.</span> cover <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
The interesting thing here is that I don’t use StatefulWidget . But instead I use StreamBuilder to do the same job StatefulWidget is to update UI for users.
As above, I have an introduction. The MoviesBloc class will transmit data from the Network with UI in the form of a STREAMS, so to receive the data stream from MoviesBloc , the UI Class needs to use a StreamBuilder to listen to the changes of data and update the user interface. be suitable.
Here StreamBuilder is listening for changes in the data stream returned in the bloc.fetchAllMovies () method . So when data arrives, StreamBuilder will show the user what it got. As you have noticed, the snapshot.data will be the place to receive and keep the ItemModel object and the rest of the work for the programmer is to just get data from it and display the update to the UI.
Above, I have briefly introduced to you the thought, method and operation of BLoC Parttern , STREAMS . This is how you implementation
the most basic BLoC Parttern or I just call it implementation bằng tay
.
Also you can learn quite a lot of libraries to implement BLoC Parttern support like flutter_bloc
. But to use proficiently the above libraries, you need to understand BLoC Parttern , STREAMS. Hope the above article will help you.