처음에 Bloc패턴은 State 관리라고 해서, 값 저장해두고 Provider를 사용해 전역에서 사용하여 state를 구독하고있다가 변경사항이 생기면 업데이트 해주는줄알았다.
전역사용과 더불어 클래스의 확장(extends)을 통해 state의 타입을 정의할 수 있어서, 현재 이게 어떤 상태의 값이냐! 에 따라서 뷰를 다르게 보여주거나 액션을 취할 수 있다.
나는 blocs라는 폴더 내에, 담당하는 부분에 따라 나눠 주었다.
BlocBuilder<ResultBloc, ResultState>(
builder: (resultContext, resultState) {
if (resultState is ResultChange) {
return ...
}
},)
이게 효율적인 방법인지는 솔직히 플러터 입문한지 한달에 첫 프로젝트의 첫 Bloc패턴이라 이래저래 찾아가며 더 나은 플로우를 위하여 작업과 리팩토링을 동시에 하고있는 상황이다.
각 페이지에 접근할 때 마다 모든 값을 초기화 해야한다.
초기화 되어야 하는 Bloc들은 provider를 각 페이지 내에서 사용하며, create 시 initial과 repository를 주입시켜 주어 초기값으로 유지할 수 있도록 해주었다.
MultiBlocProvider(
providers: [
BlocProvider<FileBloc>(
create: (_) => FileBloc(FileRepository()),
... 다른 Bloc,
]
)
BlocBuild는 쪼개놓은 컴포넌트 내에서 필요에 따라 불러서 사용하였다.
state 변경에 따른 UI 업데이트가 필요할 때 사용
BlocBuilder<MyBloc,MyState>(
builder: (context, state) {
....
}
)
state가 0이었는데 + 버튼을 눌러 state가 1이 되었다.
UI에서 1로 변경이 되어야 한다.
이벤트를 가져오거나, state를 변경하지만 UI는 변경하지 않을 때
final myState = context.read<MyBloc>().state;
실시간으로 변경되는 값을 감지하지는 못하지만, 값을 변경해두었다가 사용가능하다.
나의 경우는 탭을 선택하면 탭에 해당하는 값을 저장해두었다가, 해당 값을 사용해야 하는부분에서 불러서 사용했다.
이또한 나~중에보면 냄새나는 코드일지언정!
기능 한개씩 할때마다 쾌감있는 도장뽀개기 느낌이랄까...
얼마만에 느끼는것인지
기존 웹 작업하는것과 큰 차이가 없는듯 하면서도 성장 기회가 부족했던 찰나에 공부할게 많아서 다시 커브가 올라가는 느낌이 들어 지금은 나름 뿌듯하다.
https://gr-st-dev.tistory.com/2895#google_vignette
https://blog.arong.info/flutter/2023/01/10/Flutter-BLoC-%ED%8C%A8%ED%84%B4-1.html
공부하며 정리&기록하는 ._. 씅로그