Moti Bartov - Tikal Mobile Group
Flutter State Management
Moti Bartov - Android Developer,
Flutter Developer
Tikal Mobile Group
Managing State in Flutter
UI = f(State)
Scaffold
Home
Page
13
Center Row
textView.text = “${counter}”
Scaffold
Home
Page
13
Center Row
State<HomePage>
_counter
setState(() {_counter++});
build()
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
body: Center(
child: Text( '$_counter',
style: Theme.of(context).textTheme.display1,
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
child: Icon(Icons.add),
)
} //build
}
Widget Tree And The Inherited Widget
LandingP
age
MaterialA
pp
Login
Page
Bottom
Nav
Page
Column
Tab
Time
Tab
Reports
Tab
Users
Repo
Repo
Repo Repo Repo
Auth
Auth
Auth Auth Auth
LandingP
age
MaterialA
pp
Login
Page
Bottom
Nav
Page
Column
Tab
Time
Tab
Reports
Tab
Users
Repo
Repo Repo Repo
Auth
Auth Auth Auth
Provider
Repo
Auth
BaseAuth auth = Provider.of<BaseAuth>(context);
AppRepo repo = Provider.of<AppRepo>(context);
● ChangeNotifier
● BLoC
○ StreamBuilder
○ BLoC Library
Change Notifier
class CounterNotifier with ChangeNotifier {
int _counterValue = 0;
int get counter => _counterValue;
void incrementCounter(){
_setCounter(_counterValue + 1);
}
void decrementCounter(){
_setCounter(_counterValue - 1);
}
void _setCounter(int value){
print("_setAndNotify: $value");
_counterValue = value;
notifyListeners();
}
}
Scaffold
Home
Page
13
Center Row
ChangeNotifierProvider<>
CounterChangeNotifier incrementCounter()
decrementCounter()
notifyListeners()
ChangeNotifierProvider(
create: (context) => CounterNotifier(),
child: HomePage(title: "ChangeNotifier Demo",)
);
Home
Page
ChangeNotifierProvider<>
CounterChangeNotifier
var changeNotifier = Provider.of<CounterNotifier>(context);
Text('${changeNotifier.counter}'
FloatingActionButton(
onPressed: () => changeNotifier.incrementCounter(),
tooltip: 'Increment',
child: Icon(Icons.add),
);
The BLoC
StreamController
Sink Stream< >
BLoC
Event StateSink Stream
Events StreamController
Listen
State StreamController
counter_event.dart
abstract class CounterEvent {}
class IncrementCounter extends CounterEvent{}
class DecrementCounter extends CounterEvent{}
counter_bloc.dart
class CounterBloc {
int _counterValue = 0;
//Events sink
final _counterEventController = StreamController<CounterEvent>();
StreamSink<CounterEvent> get eventSink => _counterEventController.sink;
//State Streams and sink
final _counterStateController = StreamController<int>();
StreamSink<int> get stateSink => _counterStateController.sink;
Stream<int> get stateStream => _counterStateController.stream;
CounterBloc(){
_counterEventController.stream.listen((event){
_handleEvent(event);
});
}
BLoC
Event
State
counter_event.dart
abstract class CounterEvent {}
class IncrementCounter extends CounterEvent{}
class DecrementCounter extends CounterEvent{}
void _handleEvent(CounterEvent event) {
if(event is IncrementCounter){
_counterStateController.add(++_counterValue);
} else if (event is DecrementCounter){
_counterStateController.add(--_counterValue);
}
}
BLoC
Event
State
Sink Stream
Events StreamController
State StreamController
StateStream
Provider/InheritedWidget
HomePage() extends Widget
StreamBuilder(
stream: bloc.stateStream,
builder: (context, snapshot) {
return Scaffold(...)
};
CounterBLoC
BLoC
var bloc = Provider.of<CounterBloc>(context)
BLoC
Event
State
BLoC
Event
State
BLoC
Event
State
abstract class MainFlutterBlocEvent {}
class IncrementCounter extends MainFlutterBlocEvent{}
class DecrementCounter extends MainFlutterBlocEvent{}
abstract class MainFlutterBlocState {}
class CounterState extends MainFlutterBlocState{
int counterState;
CounterState({this.counterState});
}
class MainFlutterBloc extends Bloc<MainFlutterBlocEvent, MainFlutterBlocState> {
@override
MainFlutterBlocState get initialState => CounterState(counterState: 0);
@override
Stream<MainFlutterBlocState> mapEventToState(
MainFlutterBlocEvent event,
) async* {
print("mapEventState: $event");
if(event is IncrementCounter){
yield CounterState(counterState: (state as CounterState).counterState + 1);
} else if(event is DecrementCounter){
yield CounterState(counterState: (state as CounterState).counterState - 1);
}
}
}
State Management - Summary
Thank You
Moti Bartov - Tikal Mobile Group

Flutter State Management - Moti Bartov, Tikal