bsev 1.0.2 bsev: ^1.0.2 copied to clipboard
Useful to aid in the use of BloC pattern with dependency injection
BSEV (BloC,Streams,Events,View) #
Set of packages and utilitarian functions that help in the use of BloC pattern with dependency injection.
With bsev you will use the Bloc pattern in a simple, reactive and organized way. Communication between the business logic and the view occurs entirely through two-way streams.
Usage #
To use this plugin, add bsev
as a dependency in your pubspec.yaml file.
We should initially create the class that represents our Streams
and Events
:
Streams
import 'package:bsev/bsev.dart';
class HomeStreams extends StreamsBase{
var count = BehaviorSubjectCreate<Int>(initValue: 0);
//var count = StreamCreate<Int>();
//var count = PublishSubjectCreate<Int>();
//var count = ReplaySubjectCreate<Int>();
@override
void dispose() {
count.close();
}
}
Events
import 'package:bsev/bsev.dart';
class IncrementEvent extends EventsBase{}
Now we can create our Bloc
, class that will be centralized the business rule.
Bloc
import 'package:bsev/bsev.dart';
class HomeBloc extends BlocBase<HomeStreams>{
//If you need to communicate with some instantiated BloC, regardless of whether part of your tree of widgets can use:
//dispatchToBloc<OtherBloc>(MsgEvent());
//If you need to send an event to the view:
//dispatchView(MyEvent());
// If you need send event to all BloCs
//dispatchAll(MyEvent());
@override
void initView() {
}
@override
void eventReceiver(EventsBase event) {
// called when the Bloc receives an event
if(event is IncrementEvent){
streams.count.set(streams.count.value + 1)
}
}
}
In our bloc we have 2 mandatory methods: initState and eventReceiver:
initView: In the first buildView this method is invoked;
eventReceiver: Invoked whenever the pad receives an event;
View
import 'package:bsev/bsev.dart';
class HomeView extends StatelessWidget{
@override
Widget build(BuildContext context) {
return Bsev<HomeBloc,HomeStreams>(
dataToBloc: "any data", //optional initial data to bloc
eventReceiver: (event, communication){ //optional
// performs action received by the bloc
},
builder: (context,communication){
return Scaffold(
appBar: AppBar(),
body: communication.streams.count.builder<int>((value) {
return Text(value.toString());
}),
floatingActionButton: FloatingActionButton(
onPressed: (){
communication.dispatcher(IncrementEvent());
}
),
);
}
);
}
}
As our Bloc
and our StreamsBase
will be injected automatically, we should configure it in the Injector in the main of our application:
MyApp(){
registerBloc<HomeBloc, HomeStreams>((i) => HomeBloc(), () => HomeStreams());
//Example of the register any things.
//registerDependency((i) => CryptoRepository(i.getDependency()));
//Example of the register any things Singleton.
//registerSingleton((i) => CryptoRepository(i.getDependency()));
//Example get dependency anywhere
//var dependency = getDependency<CryptoRepository>();
}
Questions about how to use the injector consult documentation.
More complex example is found here
Testing HomeBloc #
import 'package:flutter_test/flutter_test.dart';
void main() {
HomeBloc _homeBloc;
HomeStreams _homeStreams;
setUp(() {
_homeStreams = HomeStreams();
_homeBloc = HomeBloc()..streams = _homeStreams;
});
tearDown(() {
_homeBloc?.dispose();
});
test('initial streams', () {
expect(_homeStreams.count.value, 0);
});
test('increment value', () {
_homeBloc.eventReceiver(IncrementEvent());
expect(_homeStreams.count.value, 1);
});
test('increment value 3 times', () {
_homeBloc.eventReceiver(IncrementEvent());
_homeBloc.eventReceiver(IncrementEvent());
_homeBloc.eventReceiver(IncrementEvent());
expect(_homeStreams.count.value, 3);
});
}
Test example with asynchronous call: here
Used packages #
Packages | pub |
---|---|
rxdart | |
injector |
User cases #
Apps |
---|
FlutterNews |
DartLangBr |
Boleiro |