SlideShare a Scribd company logo
Reactive Programming
Introduction to the notion of BLoC
Didier Boelens – Flutter LDN – 21 JAN 2019
This is Reactive Programming
• Think of a way of writing your application where parts
• do not care about the others (or to the strict minimum)
• only know what they are asked to do
• Grab data from a bag
• Deliver data to a bag
• Might not know where precisely these bags are located
• Do not know what will happen to the data they deliver
• Do not know if the data they deliver will be used (as such, at all, when and by whom)
• Do not know where the data they grab comes from
• could be moved or interchanged with no or very little changes to the code
• Think of an application which mainly responds to events
Reactive Programming?
Very simplified:
“It is programming with Asynchronous Data Streams”
or
“Do something (= React) when an Event is triggered”
Short refresh on the notion of Streams
Stream
"Sequence of Events, ordered in time"
sink (where we INJECT)
stream (where we LISTEN)
StreamController
StreamController<T> controller =
StreamController<T>.broadcast();
controller.sink.add(
…some data to inject…
);
controller.stream
.listen(
…
);
StreamBuilder<T>(
stream: controller.stream,
initialData: some_initial_data,
builder: (BuildContext context,
AsyncSnapshot<T> snapshot){
….
},
);
What can be conveyed by a Stream?
ANYTHING
• Value
• Object
• Collection
• Map
• Error
• Other Stream
• …
2 main types of Streams
• Single-subscription
• Only accepts a single listener during its whole lifetime.
• Not possible to listen twice
• Broadcast
• Allows any number of listeners
• Possible to add a new listener at any moment
• New listener will start receiving events as of its subscription
StreamBuilder
StreamBuilder<T>(
stream: the_stream_to_listen_to,
initialData: some_initial_data,
builder: (BuildContext context, AsyncSnapshot<T> snapshot){
if (snapshot.hasData){
return … theWidget to be built based on snapshot.data …
}
return … theWidget to be built if no data is available …
},
);
BIG ADVANTAGE
ONLYTHISWidget
is rebuilt
when necessary
INDEPENDENTLY
of the others
Notion of BLoC
Business Logic Component
"Kind of placeholder"
• Where to handle some Business Logic
• Accessible through Streams
• Independent
Main idea
BLoC
sinks
streams
What the BLoC does and how it processes the inputs
is none of the concern of anyone !
Advantages
• INTERCHANGEABILITY
You can update or replace the BLoC without impacts
(condition: keep interface)
• TESTABILITY
You can test the BLoC without any application dependency
• REUSABILITY
Should be platform agnostic
Personal Note
• In theory, only exposes Sinks and Streams
• However nothing really prevents from also exposing
• Getters / Setters
• Methods
Example of complex flow
Use Case - User Authentication
• Application Starts
• If user not authenticated
• Redirect to Authentication Screen
• User may decide to Register
• Redirection to Registration Screen
• Once authenticated or newly registered
• Redirection to Home Screen
• During authentication or registration
• Negociation with Server
• Success or failure => redirection, error message, …
• If user is authenticated
• Redirection to Home Screen
• Application runs
• If user logs out (from anywhere)
• Automatic redirection to Authentication Screen
Authentication
BLoC
Decision
Authentication
Registration
Home
Other
SERVER
Negotiate
Solution based on BLoC
Authentication
Status
Authentication
How ?
Authentication BLoC
Log In
Register
Log Out
Authentication Status
Action Status
Decision
Authentication
Registration
Other
Authentication
Registration
[ … ]
[ … ]
sinks
streams
SERVER
How to instantiate a BLoC ?
Rule
To be accessible, must be either
In an ANCESTOR
= accessible through a Widget
higher in the WidgetsTree
Needs a Provider
directly
INSTANTIATED
Bloc bloc;
@override
void initState(){
super.initState();
bloc = Bloc();
}
BLoC Provider
BlocProvider
BLoC
BlocProvider
Provision Retrieval
BlocProvider<Bloc>(
bloc: Bloc(),
child: widget tree,
);
Bloc bloc =
BlocProvider.of<Bloc>(context);
InheritedWidget InheritedWidget
BLoC
Where to position a BLoC ?
Case 1: Accessible from different Screens
BLoC
MaterialApp
Screen A
Screen B
or BLoC
(singleton)
Recommended for:
• User authentication
• Translations
• ShoppingCart
• …
Provider
Case 2: Accessible to a WidgetsTree
MaterialApp
Screen
BLoC
Widget A
Widget B
MaterialApp
BLoC
Screen
Widget A
Widget B
orProvider
Provider
Case 3: Accessible to a specificWidget instance
Widget
BLoC
Recommended for:
• Items part of a Set
• ShoppingCart Item
• Selected Item
• …
Practical Examples
Practical Example 1
When the finger moves over one of these cells, the
corresponding cell "CODE" is added to the "security
pattern"
As long as the finger remains on the screen, each time a
new cell is hovered, the pattern is drawn
When a cell is part of the pattern, its center is
highlighted
Of course ! None of theseWidgets knows anything about the LOGIC
Architecture
Each CELL is a Widget
A layer onTOP to
draw the pattern
MaterialApp
Screen
PatternWidget
Stack
Cell
BLoC
Cell
BLoC
Cell
CellBLoC
Pattern
Drawer
Pattern
BLoC
Provider
"1","2"…
Design
PatternBLoC
sinks
streams
SelectedCells[]addCell
Cell
CellBLoC
Each Cell only knows
• Its cell number
CellBloc tells Cell when
THAT Cell is part of the
pattern
When a Cell is part of
the pattern
it changes its center
color
PatternDrawer
Responsible for
drawing the pattern
based on the
Selected Cells.
PatternWidget
Responsible for
handling the
Gestures
CellBLoC
sinks
SelectedCells[]
streams
isSelected
Flow
Demo
Practical Example 2
Each bar corresponds to a note. When played, the bar is max.
Then decreases progressively when no such note is played.
Each track is only responsible for “launching” a music note icon
(sliding animation) when a note ofTHAT track is played.
Each note “sliding animation” is only responsible for moving
from right to left and notify about its position
Each track can be turned on/off via these buttons
Buttons to control the music play (start, stop, reset)
Of course ! None of theseWidgets knows anything about the LOGIC
TracksPlayerBLoC
Design – Main BLoCs
sinks
streams
Start
Stop
Reset
Notes
Only responsible for:
• Reading a music score
• Streaming the notes
• Tempo
NotePlayerBLoC
sinks
streams
Note +
position
Playing Note
Only responsible for:
• Playing a note
• Handling the tracks
sound on/off
Tracks on/off
Design –Widgets
BarNote
BarBLoC
Each BarNote only knows
• The Note (A,B,C,D,E,F,G)
it refers to
BarBloc tells BarNote when
its note is played
When a note is played, the
AnimationController is reset
to MAX and started
Track
TrackBLoC
EachTrack only knows
• Its track number
(0, 1, 2)
TrackBloc tellsTrack when
a note is played
When a note is played, a new
NoteAnimation overlay is
instantiated
TrackOnOff
TrackOnOffBLoC
EachTrackOnOff only knows
• TheTrack index it refers to
(0,1,2)
TrackOnOffBloc tellsTrackOnOff
About the status of theTrack on/off
Architecture
TracksPlayer
BLoC
MaterialApp
NotePlayer
BLoC
Track
TrackBLoC
Track
TrackBLoC
Track
TrackBLoC
TrackOnOff
TrackOnOffBLoC
TrackOnOff
TrackOnOffBLoC
TrackOnOff
TrackOnOffBLoC
BarNote
BarBLoC
BarNote
BarBLoC
BarNote
BarBLoC
BarNote
BarBLoC
BarNote
BarBLoC
BarNote
BarBLoC
BarNote
BarBLoC
"A","B","C",…
0, 1, 2
0, 1, 2
Page
NoteAnimation
Provider
Provider
Flow
Demo
Who am I ?
Didier Boelens
• Pseudo: boeledi
• GitHub: https://github.com/boeledi
• Twitter: @DidierBoelens
• Medium: https://medium.com/flutter-community
• Blog: http://www.didierboelens.com
• Packages: flutter_range_slider, flutter_reactive_button

More Related Content

What's hot (20)

PDF
Flutter State Management - Moti Bartov, Tikal
DroidConTLV
 
PDF
Introduction to flutter
Wan Muzaffar Wan Hashim
 
PPTX
Flutter presentation.pptx
FalgunSorathiya
 
PDF
Flutter state management from zero to hero
Ahmed Abu Eldahab
 
PDF
Building beautiful apps with Google flutter
Ahmed Abu Eldahab
 
PPTX
Introduction to spring boot
Santosh Kumar Kar
 
PPTX
Intro to React
Justin Reock
 
PDF
Pune Flutter Presents - Flutter 101
Arif Amirani
 
PPTX
Flutter
Mohit Sharma
 
PPTX
Introduction to Android and Android Studio
Suyash Srijan
 
PPTX
Flutter
Himanshu Singh
 
PPTX
Dart and Flutter Basics.pptx
DSCVSSUT
 
PPTX
Angular modules in depth
Christoffer Noring
 
PDF
Flutter beyond hello world
Ahmed Abu Eldahab
 
PDF
The magic of flutter
Shady Selim
 
PDF
Introduction to fragments in android
Prawesh Shrestha
 
PPTX
Flutter Intro
Vladimir Parfenov
 
PDF
Chef vs Puppet vs Ansible vs SaltStack | Configuration Management Tools Compa...
Edureka!
 
PPTX
Node js Introduction
sanskriti agarwal
 
Flutter State Management - Moti Bartov, Tikal
DroidConTLV
 
Introduction to flutter
Wan Muzaffar Wan Hashim
 
Flutter presentation.pptx
FalgunSorathiya
 
Flutter state management from zero to hero
Ahmed Abu Eldahab
 
Building beautiful apps with Google flutter
Ahmed Abu Eldahab
 
Introduction to spring boot
Santosh Kumar Kar
 
Intro to React
Justin Reock
 
Pune Flutter Presents - Flutter 101
Arif Amirani
 
Flutter
Mohit Sharma
 
Introduction to Android and Android Studio
Suyash Srijan
 
Dart and Flutter Basics.pptx
DSCVSSUT
 
Angular modules in depth
Christoffer Noring
 
Flutter beyond hello world
Ahmed Abu Eldahab
 
The magic of flutter
Shady Selim
 
Introduction to fragments in android
Prawesh Shrestha
 
Flutter Intro
Vladimir Parfenov
 
Chef vs Puppet vs Ansible vs SaltStack | Configuration Management Tools Compa...
Edureka!
 
Node js Introduction
sanskriti agarwal
 

Similar to Bloc Pattern - Practical Use Cases - Flutter London - 21JAN2019 (20)

PDF
How to Use Flutter BLoC Architecture to Build High-Performance Apps.pdf
akel ahmed
 
PDF
BLoC - Be Reactive in flutter
Giacomo Ranieri
 
PPTX
Application Developmet lecture for backend
SobicaNoor
 
PDF
The battle between the states (all about flutter stateless & stateful widgets...
Katy Slemon
 
PDF
Reactor 3.0, a reactive foundation for java 8 and Spring
Stéphane Maldini
 
PDF
Intro To Reactive Programming
Rossen Stoyanchev
 
PDF
Intro to Reactive Programming
Stéphane Maldini
 
PDF
iOS 개발자의 Flutter 체험기
Wanbok Choi
 
PDF
Basic Introduction Flutter Framework.pdf
PhanithLIM
 
PPTX
Mobile Application Development class 006
Dr. Mazin Mohamed alkathiri
 
PDF
Spring Framework 5.0による Reactive Web Application #JavaDayTokyo
Toshiaki Maki
 
PPTX
Lecture -Introduction to Flutter and Dart.pptx
FarhanGhafoor7
 
PDF
Reduxing UI: Borrowing the Best of Web to Make Android Better
Christina Lee
 
PDF
Reactive Applications in Java
Alexander Mrynskyi
 
PDF
DZone_RC_RxJS
Luis Atencio
 
PPTX
Flutter vs ReactNative
Sumit Sahoo
 
PPTX
FlutterArchitecture FlutterArchitecture.ppt
KevinNemo
 
PPTX
FlutterArchitecture FlutterDevelopement (1).pptx
hw813301
 
PPTX
TechCon Day - 5 App Dev
GoogleDeveloperStude13
 
PDF
Buy ebook Functional Reactive Programming 1st Edition Stephen Blackheath chea...
wongazarok
 
How to Use Flutter BLoC Architecture to Build High-Performance Apps.pdf
akel ahmed
 
BLoC - Be Reactive in flutter
Giacomo Ranieri
 
Application Developmet lecture for backend
SobicaNoor
 
The battle between the states (all about flutter stateless & stateful widgets...
Katy Slemon
 
Reactor 3.0, a reactive foundation for java 8 and Spring
Stéphane Maldini
 
Intro To Reactive Programming
Rossen Stoyanchev
 
Intro to Reactive Programming
Stéphane Maldini
 
iOS 개발자의 Flutter 체험기
Wanbok Choi
 
Basic Introduction Flutter Framework.pdf
PhanithLIM
 
Mobile Application Development class 006
Dr. Mazin Mohamed alkathiri
 
Spring Framework 5.0による Reactive Web Application #JavaDayTokyo
Toshiaki Maki
 
Lecture -Introduction to Flutter and Dart.pptx
FarhanGhafoor7
 
Reduxing UI: Borrowing the Best of Web to Make Android Better
Christina Lee
 
Reactive Applications in Java
Alexander Mrynskyi
 
DZone_RC_RxJS
Luis Atencio
 
Flutter vs ReactNative
Sumit Sahoo
 
FlutterArchitecture FlutterArchitecture.ppt
KevinNemo
 
FlutterArchitecture FlutterDevelopement (1).pptx
hw813301
 
TechCon Day - 5 App Dev
GoogleDeveloperStude13
 
Buy ebook Functional Reactive Programming 1st Edition Stephen Blackheath chea...
wongazarok
 
Ad

Recently uploaded (20)

PDF
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PDF
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
PDF
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
PDF
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PDF
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
PDF
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PPTX
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
PDF
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
PDF
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PDF
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PDF
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
Ad

Bloc Pattern - Practical Use Cases - Flutter London - 21JAN2019

  • 1. Reactive Programming Introduction to the notion of BLoC Didier Boelens – Flutter LDN – 21 JAN 2019
  • 2. This is Reactive Programming • Think of a way of writing your application where parts • do not care about the others (or to the strict minimum) • only know what they are asked to do • Grab data from a bag • Deliver data to a bag • Might not know where precisely these bags are located • Do not know what will happen to the data they deliver • Do not know if the data they deliver will be used (as such, at all, when and by whom) • Do not know where the data they grab comes from • could be moved or interchanged with no or very little changes to the code • Think of an application which mainly responds to events
  • 3. Reactive Programming? Very simplified: “It is programming with Asynchronous Data Streams” or “Do something (= React) when an Event is triggered”
  • 4. Short refresh on the notion of Streams
  • 5. Stream "Sequence of Events, ordered in time" sink (where we INJECT) stream (where we LISTEN) StreamController StreamController<T> controller = StreamController<T>.broadcast(); controller.sink.add( …some data to inject… ); controller.stream .listen( … ); StreamBuilder<T>( stream: controller.stream, initialData: some_initial_data, builder: (BuildContext context, AsyncSnapshot<T> snapshot){ …. }, );
  • 6. What can be conveyed by a Stream? ANYTHING • Value • Object • Collection • Map • Error • Other Stream • …
  • 7. 2 main types of Streams • Single-subscription • Only accepts a single listener during its whole lifetime. • Not possible to listen twice • Broadcast • Allows any number of listeners • Possible to add a new listener at any moment • New listener will start receiving events as of its subscription
  • 8. StreamBuilder StreamBuilder<T>( stream: the_stream_to_listen_to, initialData: some_initial_data, builder: (BuildContext context, AsyncSnapshot<T> snapshot){ if (snapshot.hasData){ return … theWidget to be built based on snapshot.data … } return … theWidget to be built if no data is available … }, ); BIG ADVANTAGE ONLYTHISWidget is rebuilt when necessary INDEPENDENTLY of the others
  • 10. Business Logic Component "Kind of placeholder" • Where to handle some Business Logic • Accessible through Streams • Independent
  • 11. Main idea BLoC sinks streams What the BLoC does and how it processes the inputs is none of the concern of anyone !
  • 12. Advantages • INTERCHANGEABILITY You can update or replace the BLoC without impacts (condition: keep interface) • TESTABILITY You can test the BLoC without any application dependency • REUSABILITY Should be platform agnostic
  • 13. Personal Note • In theory, only exposes Sinks and Streams • However nothing really prevents from also exposing • Getters / Setters • Methods
  • 15. Use Case - User Authentication • Application Starts • If user not authenticated • Redirect to Authentication Screen • User may decide to Register • Redirection to Registration Screen • Once authenticated or newly registered • Redirection to Home Screen • During authentication or registration • Negociation with Server • Success or failure => redirection, error message, … • If user is authenticated • Redirection to Home Screen • Application runs • If user logs out (from anywhere) • Automatic redirection to Authentication Screen
  • 17. How ? Authentication BLoC Log In Register Log Out Authentication Status Action Status Decision Authentication Registration Other Authentication Registration [ … ] [ … ] sinks streams SERVER
  • 18. How to instantiate a BLoC ?
  • 19. Rule To be accessible, must be either In an ANCESTOR = accessible through a Widget higher in the WidgetsTree Needs a Provider directly INSTANTIATED Bloc bloc; @override void initState(){ super.initState(); bloc = Bloc(); }
  • 20. BLoC Provider BlocProvider BLoC BlocProvider Provision Retrieval BlocProvider<Bloc>( bloc: Bloc(), child: widget tree, ); Bloc bloc = BlocProvider.of<Bloc>(context); InheritedWidget InheritedWidget BLoC
  • 21. Where to position a BLoC ?
  • 22. Case 1: Accessible from different Screens BLoC MaterialApp Screen A Screen B or BLoC (singleton) Recommended for: • User authentication • Translations • ShoppingCart • … Provider
  • 23. Case 2: Accessible to a WidgetsTree MaterialApp Screen BLoC Widget A Widget B MaterialApp BLoC Screen Widget A Widget B orProvider Provider
  • 24. Case 3: Accessible to a specificWidget instance Widget BLoC Recommended for: • Items part of a Set • ShoppingCart Item • Selected Item • …
  • 26. Practical Example 1 When the finger moves over one of these cells, the corresponding cell "CODE" is added to the "security pattern" As long as the finger remains on the screen, each time a new cell is hovered, the pattern is drawn When a cell is part of the pattern, its center is highlighted Of course ! None of theseWidgets knows anything about the LOGIC
  • 27. Architecture Each CELL is a Widget A layer onTOP to draw the pattern MaterialApp Screen PatternWidget Stack Cell BLoC Cell BLoC Cell CellBLoC Pattern Drawer Pattern BLoC Provider "1","2"…
  • 28. Design PatternBLoC sinks streams SelectedCells[]addCell Cell CellBLoC Each Cell only knows • Its cell number CellBloc tells Cell when THAT Cell is part of the pattern When a Cell is part of the pattern it changes its center color PatternDrawer Responsible for drawing the pattern based on the Selected Cells. PatternWidget Responsible for handling the Gestures CellBLoC sinks SelectedCells[] streams isSelected
  • 29. Flow
  • 30. Demo
  • 31. Practical Example 2 Each bar corresponds to a note. When played, the bar is max. Then decreases progressively when no such note is played. Each track is only responsible for “launching” a music note icon (sliding animation) when a note ofTHAT track is played. Each note “sliding animation” is only responsible for moving from right to left and notify about its position Each track can be turned on/off via these buttons Buttons to control the music play (start, stop, reset) Of course ! None of theseWidgets knows anything about the LOGIC
  • 32. TracksPlayerBLoC Design – Main BLoCs sinks streams Start Stop Reset Notes Only responsible for: • Reading a music score • Streaming the notes • Tempo NotePlayerBLoC sinks streams Note + position Playing Note Only responsible for: • Playing a note • Handling the tracks sound on/off Tracks on/off
  • 33. Design –Widgets BarNote BarBLoC Each BarNote only knows • The Note (A,B,C,D,E,F,G) it refers to BarBloc tells BarNote when its note is played When a note is played, the AnimationController is reset to MAX and started Track TrackBLoC EachTrack only knows • Its track number (0, 1, 2) TrackBloc tellsTrack when a note is played When a note is played, a new NoteAnimation overlay is instantiated TrackOnOff TrackOnOffBLoC EachTrackOnOff only knows • TheTrack index it refers to (0,1,2) TrackOnOffBloc tellsTrackOnOff About the status of theTrack on/off
  • 35. Flow
  • 36. Demo
  • 37. Who am I ? Didier Boelens • Pseudo: boeledi • GitHub: https://github.com/boeledi • Twitter: @DidierBoelens • Medium: https://medium.com/flutter-community • Blog: http://www.didierboelens.com • Packages: flutter_range_slider, flutter_reactive_button