mirror of https://github.com/01-edu/public.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.8 KiB
95 lines
2.8 KiB
2 years ago
|
# Bloc Counter
|
||
|
|
||
|
### Introduction
|
||
|
|
||
|
Usually, when projects get bigger and more complex, managing all the widges, their states, and updating their children's states will become troublesome. To avoid possible complexity, we recommend using **Patterns**.
|
||
|
Patterns are built in a way that lets developers control the hierarchy of widgets much easier, and a popular one in the Flutter is - BLoC.
|
||
|
|
||
|
Implement simple counter app using Bloc Pattern.
|
||
|
When you start writing your own application, you will need to structure your app first.
|
||
|
|
||
|
<img src="https://github.com/alem-01/alem_public/blob/master/resources/blocCounter.02.png?raw=true" width="200"/>
|
||
|
|
||
|
### Objective
|
||
|
|
||
|
- Observe state changes with `BlocObserver`.
|
||
|
- `BlocProvider`, Flutter widget which provides a bloc to its children.
|
||
|
- `BlocBuilder`, Flutter widget that handles building the widget in response to new states.
|
||
|
|
||
|
In this subject you will implement Bloc pattern, which is created by Google.
|
||
|
BLoC pattern uses Reactive Programming to handle the flow of data within an app.
|
||
|
|
||
|
Bloc consist of 2 concepts :
|
||
|
|
||
|
- `Streams`
|
||
|
- `Sinks`
|
||
|
, which are provided by `StreamController`.
|
||
|
|
||
|
<pre>
|
||
|
<code>
|
||
|
💡 See this article <a href="https://medium.com/flutterpub/architecting-your-flutter-project-bd04e144a8f1"> Architect your Flutter project using BLoC pattern</a>, by Sagar Suri.
|
||
|
</code>
|
||
|
</pre>
|
||
|
|
||
|
<img src="https://github.com/alem-01/alem_public/blob/master/resources/blocCounter.01.png?raw=true"/>
|
||
|
|
||
|
<pre>
|
||
|
<code>
|
||
|
💡 Documentation <a href="https://bloclibrary.dev/#/gettingstarted">https://bloclibrary.dev/#/gettingstarted</a>.
|
||
|
</code>
|
||
|
</pre>
|
||
|
|
||
|
### Part 1
|
||
|
|
||
|
- Create new flutter app, so it will generate sample Counter App
|
||
|
- Add flutter_bloc as a dependecy of your app
|
||
|
- App structure should be similar to:
|
||
|
|
||
|
```bash
|
||
|
—lib
|
||
|
—bloc
|
||
|
—counter_bloc.dart
|
||
|
—counter_event.dart
|
||
|
-widgets
|
||
|
—yourwidgets.dart
|
||
|
—..
|
||
|
—main.dart
|
||
|
```
|
||
|
|
||
|
### Part 2
|
||
|
|
||
|
- add enum to bloc/couter_event.dart
|
||
|
|
||
|
```jsx
|
||
|
enum CounterEvent {
|
||
|
increment
|
||
|
}
|
||
|
```
|
||
|
|
||
|
- go to bloc/counter_bloc.dart and create `CounterBloc` class which extends from `CounterBloc`
|
||
|
|
||
|
> 💡 note: you can generate bloc files using vscode extension
|
||
|
|
||
|
- implement override of `mapEventToState` function in `CounterBloc` class, so it will be switching between different events, and return value as an int. In our case we only have case with increment state
|
||
|
|
||
|
### Part 3 (UI and getting data)
|
||
|
|
||
|
- Inside MyApp class wrap your home page with BlocProvider class.
|
||
|
|
||
|
```jsx
|
||
|
return MaterialApp(
|
||
|
home: BlocProvider<CounterBloc>(
|
||
|
create: (context) => CounterBloc(),
|
||
|
child: Home(),
|
||
|
),
|
||
|
);
|
||
|
```
|
||
|
|
||
|
- Inside Home class create instance of CounterBloc class
|
||
|
- Use BlocBuilder to state from CounterBloc
|
||
|
- Add "+" button to call CounterEvent.increment
|
||
|
|
||
|
### Bonus
|
||
|
|
||
|
- add button and event to handle decrementing counter
|