BlocBuilder는 bloc
과 builder
기능이 필요한 Flutter 위젯입니다. 'BlocBuilder'는 새 상태에 대한 응답으로 위젯 빌드를 처리합니다. BlocBuilder
는 StreamBuilder
와 매우 유사하지만 필요한 상용구 코드의 양을 줄이기 위한 더 간단한 API가 있습니다. builder
함수는 잠재적으로 여러 번 호출될 수 있으며 상태에 대한 응답으로 위젯을 반환하는 순수 함수여야 합니다.
탐색, 대화 상자 표시 등과 같은 상태 변경에 대한 응답으로 무엇이든 "수행"하려면 BlocListener
를 참조하세요.
bloc
매개변수가 생략되면 BlocBuilder
는 BlocProvider
와 현재 BuildContext
를 사용하여 자동으로 조회를 수행합니다.
BlocBuilder<BlocA, BlocAState>(
builder: (context, state) {
// return widget here based on BlocA's state
}
)
builder
함수가 호출되는 시기를 세밀하게 제어하기 위해 선택적 buildWhen
을 제공할 수 있습니다. buildWhen
은 이전 블록 상태와 현재 블록 상태를 가져와서 부울 값을 반환합니다. buildWhen
이 true를 반환하면 builder
가 state
와 함께 호출되고 위젯이 다시 빌드됩니다. buildWhen
이 false를 반환하면 builder
가 state
와 함께 호출되지 않고 다시 빌드가 발생하지 않습니다.
BlocBuilder<BlocA, BlocAState>(
buildWhen: (previousState, state) {
// return true/false to determine whether or not
// to rebuild the widget with state
},
builder: (context, state) {
// return widget here based on BlocA's state
}
)
BlocSelector는 'BlocBuilder'와 유사하지만 개발자가 현재 블록 상태를 기반으로 새 값을 선택하여 업데이트를 필터링할 수 있는 Flutter 위젯입니다. 선택한 값이 변경되지 않으면 불필요한 빌드가 방지됩니다. 'BlocSelector'가 'builder'를 다시 호출해야 하는지 여부를 정확하게 결정하려면 선택한 값이 변경 불가능해야 합니다.
BlocSelector<BlocA, BlocAState, SelectedState>(
selector: (state) {
// return selected state based on the provided state.
},
builder: (context, state) {
// return widget here based on the selected state.
},
)
selector 에서는 변화가 감지되길 원하는 state를 리턴하고, builder 에서는 selector에서 반환된 state를 기반으로 리빌드 됩니다. 한 블로그에서 BlocBuilder의 buildWhen파라미터와의 차이점이 무엇이냐 라는 질문에대한 글을 볼수 있었는데, bloc에 올라온 이슈에 대한 답글로서
buildWhen 파라미터는 정확히 해당 state에 대해서만 build된다는 보장이 없기때문에 더 강력하게 조건화 하기위해 blocSelector을 사용하라
라는 답변이 달렸습니다. 명확한 이유는 알수없지만 buildWhen이 state에 대한 build를 완벽하게 보장해주지 못하기때문에 추후 개발에서는 blocSelector을 이용해 명확하게 해주는것이 더 좋아보입니다.