My pubspec.yml:
bloc: ^4.0.0
flutter_bloc: ^4.0.0
equatable: ^1.2.5
I created my CounterBloc:
class CounterBloc extends Bloc<CounterEvent, int> {
@override
int get initialState => 0;
@override
Stream<int> mapEventToState(event) async* {
if (event.status == EventStatus.INCREMENT) {
yield state + event.value;
} else if (event.status == EventStatus.DECREMENT) {
yield state - event.value;
}
}
}
enum EventStatus { INCREMENT, DECREMENT }
class CounterEvent {
final int value;
final EventStatus status;
const CounterEvent({this.value, this.status});
}
void main() => runApp(CounterApp());
class CounterApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'BLoC Demo',
home: BlocProvider<CounterBloc>(
create: (context) => CounterBloc(),
lazy: false,
child: TestBlocWidget(),
),
);
}
}
class TestBlocWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
final counterBloc = BlocProvider.of<CounterBloc>(context);
return Scaffold(
body: Center(
child: BlocBuilder<CounterBloc, int>(
builder: (ctx, state) {
return Text(
'count: $state',
style: TextStyle(fontSize: 28),
);
},
),
),
floatingActionButton: Align(
alignment: Alignment.bottomRight,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
FloatingActionButton(
onPressed: () async {
print("test 0 = " + counterBloc.state.toString());
counterBloc.add(CounterEvent(value: 1, status: EventStatus.INCREMENT));
print("test 1 = " + counterBloc.state.toString());
},
child: Icon(Icons.add_circle),
),
FloatingActionButton(
onPressed: () {
print("test 2 = " + counterBloc.state.toString());
counterBloc
.add(CounterEvent(value: 1, status: EventStatus.DECREMENT));
print("test 3 = " + counterBloc.state.toString());
},
child: Icon(Icons.remove_circle),
),
],
),
),
);
}
}
Then my question is:
Inside FloatingActionButton, I increment value to my state; But I print before increment and after increment and the state is the same value; test 0 = 0; test 1 = 0; Why? In the screen reflect my value, but not immediately in my prints inside FloatingActionButton;
After I tested this:
FloatingActionButton(
onPressed: () async {
print("test 0 = " + counterBloc.state.toString());
counterBloc
.add(CounterEvent(value: 1, status: EventStatus.INCREMENT));
await Future.delayed(Duration(milliseconds: 0));
print("test 1 = " + counterBloc.state.toString());
},
child: Icon(Icons.add_circle),
),
```
Note: I put "await Future.delayed", after my CounterBloc, with value 0 in my FloatingActionButton;
Works;
test 0 = 0;
test 1 = 1;