context.go('/order-status')
context.read<OrderStatusBloc>().add(const FetchOrder());
를 호출 -> 최신 상태 반영 Xcontext.go('/order-status')
→ initState
실행 → FetchOrder
이벤트 호출 → UI가 정상 업데이트 된다.context.go('/order-status')
실행 후 initState
가 호출되지 않아 FetchOrder
이벤트가 실행 되지 않는다.OrderFetch
)를 반복 배출하면 flutter는 상태가 변경되지 않는다고 간주한다. 이로 인해, 두 번째 주문 이후에도 order_status_screen
은 emit(OrderFetch)
만 호출되므로 상태 전환이 이루어지지 않는다context.go
의 동작 방식context.go
는 기존 화면을 재사용하기 때문에, OrderStatusScreen
이 이미 생성되어 있다면 initState
를 호출하지 않는다.
첫 번째 화면 생성 시
PaymentScreen
└── OrderStatusScreen
└── initState() 호출
└── build() 호출
기존 화면 재사용
PaymentScreen
└── OrderStatusScreen
└── initState() 호출
└── build() 호출
그럼 initState
를 사용하지 않고 build
메서드에만 context.read<OrderStatusBloc>().add(const FetchOrder())
를 실행하면 되지 않을까?
initState
가 호출되지 않으면 초기 상태 전환(OrderStatusInitial
→ OrderFetch
)이 발생하지 않기 때문에 필요하다build
메서드의 역할
initState
는 초기 화면 생성 단계에서만 실행되기 때문에 build 메서드에도 context.read<OrderStatusBloc>().add(const FetchOrder())
를 넣어준다emit(OrderStatusInitial())
를 추가해 상태를 초기화한 뒤 OrderFetch
상태를 배출initState
와 상태 전환 문제 해결 emit(OrderStatusInitial())
initState
와 build
메서드
context.go('/order-status')
로 화면 전환 initState
에서 이벤트를 추가하여 정상적으로 상태 전환(OrderStatusInitial
→ OrderFetch
)이 이루어진다.build
메서드에서 이벤트를 추가하여 화면이 재사용되어도 상태 업데이트를 보장한다.