미리 만든 위젯을 넣는 게 아니라, **"필요한 순간에 위젯을 만들어 내는 함수"**를 넘기는 패턴이다. React의 render prop(자식을 함수로 받아 그리는 것)과 가장 비슷하다.
Builder(builder: (context) => Text("...")) // context가 필요한 순간에 만들어 냄
go_router의 GoRoute에서 둘 중 하나를 쓴다:
| 언제 | 반환 | |
|---|---|---|
builder |
보통 (기본) | 그냥 화면 위젯 |
pageBuilder |
화면 전환 애니메이션을 직접 지정할 때 | Page 객체(전환 방식 포함) |
// builder: 그냥 화면만
GoRoute(builder: (c, s) => DetailPage())
// pageBuilder: 아래→위 슬라이드 같은 전환을 직접 정의
GoRoute(pageBuilder: (c, s) => CustomTransitionPage(
child: DetailPage(),
transitionsBuilder: (c, anim, _, child) => SlideTransition(...),
))
즉 기본 전환이면 builder, 전환 애니메이션을 커스텀하면 pageBuilder.
이것들은 다 "어떤 상황이 되면 그에 맞게 화면을 만들어 주는" 빌더다:
| 위젯 | 언제 다시 그리나 | React 비유 |
|---|---|---|
| FutureBuilder | 비동기(Future) 결과 도착 시 | React Query 구독 |
| StreamBuilder | 스트림 값이 올 때마다 | 구독 기반 렌더 |
| ValueListenableBuilder | ValueNotifier 값 바될 때 | useState 변경 시 |
| LayoutBuilder | 부모 크기가 정해질 때 (반응형) | ResizeObserver |
| Consumer (Riverpod) | 구독한 provider 값 바될 때 | useSelector 부분 구독 |
공통점: "지금 당장"이 아니라 "특정 조건이 되는 순간"에 화면 일부를 다시 그리기 위해 함수(builder)를 미리 건네둔다. 그래서 필요한 부분만 다시 그려 성능에 유리하다.