-
bloc패턴 -rxdart를 활용한 약식flutter 2021. 7. 3. 23:52
state클래스와 BlocBuilder나 BlocProvider를 사용하지않고, 간소화되서 구현한 코드이다.
MainBloc에 event가 들어오면 MainBloc의 생성자쪽의 스트림컨트롤러가 이벤트를 구독하고,
해당 로직으로 나눠준다.
class MainBloc extends MainBlocBase {
Sink get addEvent => _addEvent;
final _addEvent = StreamController();
MainBloc(repo) : super(repository) {
// MainBloc의 constructor,
_addEvent.stream.listen((action) {
// _addEvent가 다른곳에서 MainBloc에 던지는 이벤트를 관찰하고,// switch문에서 이벤트를 분기시켜 로직을 실행함.
switch (action.runtimeType) {case SetFilterEvent:
setFilterEvent(action);
break;case MakePostEvent :
makePostEvent(action);
break;
default:
assert(false);
}
})
}// 생성자에서 MakePostEvent이벤트를 감지하면 이부분을 실행하게된다.
// 바디의 내용은 그냥 비즈니스 로직이라 별로 큰의미는없음...
makePostEvent(MakePostEvent? postEvent) async {// 비즈니스로직 블라블라..
Post post = Post.makePost(
title: textSubscription!.value.text,
);
postModelSub.sink.add(post);
}
}setFilterEvent(){
// 비즈니스로직 블라블라..
}
// MainBloc 이 상속하고있는 부모 클래스인데, 큰의미는 없고 이곳에 필요한 변수들을 넣어놈
// 현업에서 사용한 코드를 요약한 것인데, 실제로는 여러가지 필요한 걸 많이 넣어놨다.
// 간소화한 구조이고.. 본인의 필요에 따라 mixin 클래스를 같이 쓰는것도 좋다.
class MainBlocBase {
final Repository? repository;
final textSubscription = BehaviorSubject<TextEditingController>();final postModelSub = BehaviorSubject<Post>();
CommunityBlocBase(this.repository) {
}
// 이벤트들
class setFilterEvent {
String? category;
SetFilterEvent({this.category});
}
class MakePostEvent {
String? title;
MakePostEvent(
{this.title}) {}
}
타클래스에서 MainBloc에 이벤트를 던질때는_mainBloc.addEvent.add(new MakePostEvent(// 블라블라..));
이런식으로 던진다.
'flutter' 카테고리의 다른 글
Equatable의 사용과 Bloc (0) 2021.07.18 bloc 패턴 - flutter_bloc 패키지 사용 (0) 2021.07.16 flutter bloc 패턴, rxdart.. (0) 2021.07.03 TabBarView PageView에서 위젯 리빌드 방지 (0) 2021.05.03 null safety (0) 2021.05.02