Hi Guys, Welcome to Proto Coders Point, In this Flutter Tutorial we gonna Learn basic of Flutter BLoC Pattern, Basically we will build a simple app that can perform Increment & Decrement operations.
FINAL RESULT
What is a Bloc?
A BLoC we can simply understand with the help of below Diagram.
Business logic Component is basically a Box where Events cames from one side & the State comes out with the required data from other side.
Check out the tutorial atricle on Introduction of Flutter Bloc pattern
https://protocoderspoint.com/introduction-to-flutter-bloc-pattern-tutorial/
Flutter is really an awesome framework because it allows fully freedom to the app developer in how to manage the state, If i say BLoC (Business Logic Component) pattern is the prefect tool that fits for Flutter application and that is the reason i am here with Flutter BLoC pattern tutorial.
Flutter BLoC Pattern Tutorial – Inc & Dec Example
So Basically in our Flutter Bloc pattern example, there are 2 kinds of events that will be performed by the used i.e 1. Increment Event 2. Decrement Event.
Video Tutorial on Flutter BLoC Pattern
Step 1: Create a dart file (Event_Counter)
Now, Create a dart file inside lib folder of your flutter project & name it as
This File will handle event.
Event_Counter.dart
abstract class EventCounter{} //abstract class to find out which Event was occurred class IncrementEvent extends EventCounter{} class DecrementEvent extends EventCounter{}
Step 2: Create a Flutter BLoC Class
then, Now Create a Flutter BLoC Class dart file under lib directory and name it as BlocCounter.dart
import 'dart:async'; import 'EventCounter.dart'; // async enable class Bloc_Counter{ int _counter = 0; //StreamCountroller handle input and output final _counterStateController = StreamController<int>(); // Sink in Flutter can be easily stated, In Simple Words Sink = Import StreamSink<int> get _inCounter =>_counterStateController.sink; // Stream in Flutter can be easily stated, In Simple Words Stream = Output Stream<int> get counter =>_counterStateController.stream; //event controller to trigger which event has occurred final _counterEventController = StreamController<EventCounter>(); Sink<EventCounter> get counterEventSink =>_counterEventController.sink; Bloc_Counter(){ _counterEventController.stream.listen((_mapEventtoState)); } void _mapEventtoState(EventCounter event){ // depending on event either increment or decrement the counter variable if(event is IncrementEvent) _counter++; else _counter--; _inCounter.add(_counter); } // Dispose the Controller, Very important step, Otherwise you may get memory leak void dispose(){ _counterStateController.close(); _counterEventController.close(); } }
Brief information of what is going on the above Flutter Bloc pattern code.
async allows us to use Flutter Feature like StreamController, Stream, Future and Sink.
Sink in Flutter can be easily stated, In Simple Words Sink = Import.
Stream in Flutter can be easily stated, In Simple Words Stream = Output.
Event controller to trigger which event has occurred
and every Controller must be disposed when application is not in use, otherwise it may lead to memory leak.
Step 3: UI Design
Then, open main.dart file and copy paste below lines of code
import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc_example/Bloc_Counter.dart'; import 'package:flutter_bloc_example/EventCounter.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', debugShowCheckedModeBanner: false, theme: ThemeData( primaryColor: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), home: MyHomePage(), ); } } class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { final _bloc = Bloc_Counter(); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Flutter Bloc Example"), ), body: Center( child: StreamBuilder( stream: _bloc.counter, initialData: 0, builder: (BuildContext context,AsyncSnapshot<int> snapshot){ return Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Image.network("https://raw.githubusercontent.com/felangel/bloc/master/docs/assets/flutter_bloc_logo_full.png",width: 250,height: 200,), Text("Flutter Bloc Example", style: TextStyle(fontStyle: FontStyle.italic,fontSize: 25),), Text("Press Below Button "), Text( '${snapshot.data}', style: TextStyle(fontSize: 30) ), ], ); }, ), ), floatingActionButton: Row( mainAxisAlignment: MainAxisAlignment.end, children: <Widget>[ FloatingActionButton( child: Icon(Icons.add), backgroundColor: Colors.green, onPressed: (){ print("Increment"); //class bloc class by passing IncrementEvent _bloc.counterEventSink.add(IncrementEvent()); }, ), SizedBox( width: 20, ), FloatingActionButton( child: Icon(Icons.remove), backgroundColor: Colors.red, onPressed: (){ print("Decrement"); //class bloc class by passing DecrementEvent _bloc.counterEventSink.add(DecrementEvent()); }, ) ], ), ); } @override void dispose() { super.dispose(); //dispose all the controller _bloc.dispose(); } }
Thus, your Flutter Application is ready with Flutter Bloc Feature.
Guys, if you have any confusion just check out my Project Structure below.
Conclusion
In this article we learnt How to Build and Flutter App, that can perform Increment and Decrement operation by using Flutter Business Logic Component to perform the event and change the Flutter application UI state as per .
[…] Flutter BLoC Pattern Tutorial – Inc & Dec Example […]