Flutter
GetIt , Go Router, BloC 함께 사용시 BloC이 계속 생성되는 문제
EEYatHo
2024. 12. 10. 17:14
개요
- GetIt, Go Router, BloC 사용
- FirstParty인 pushNamed를 사용할 때는 문제 없었으나, Go Router으로 마이그레이션 후 버그 발생
- A 페이지에 진입, 다른 페이지 이동, A 페이지로 pop 할 때 자꾸 A BloC이 생성됨
문제 현상
전역 / 싱글톤 BloC을 최대한 피하고자 A 페이지와 A BloC의 생명 주기를 같게하려 했었음
- GetIt registerFactoryParam으로 A BloC 등록
- Go Router코드
- BloC을 미리 생성하여 A 페이지로 이동하는 코드에 넣어줌으로써
GoRoute(
path: "a",
builder: (context, state) {
return BlocProvider.value(
value: getIt<ABloC>(),
child: const APage(),
);
},
),
- A 페이지에 진입시 A BloC 생성 (ok)
- A 페이지에서 서브페이지인 B 페이지로 이동할 때 A BloC 생성(?)
- B 페이지에서 pop하여 A 페이지로 이동할 때도 A BloC 생성 (???)
- B 에서 A 로 돌아왔을 때 A의 상태값도 이상함
솔루션
BlocProvider value를 사용하지 말고 create를 사용했더니 문제는 해결
GoRoute(
path: "a",
builder: (context, state) {
return BlocProvider(
create: () => getIt<ABloC>(),
child: const APage(),
);
},
),
다만 의문점 존재..
- create는, BlocProvider 본인이 BloC을 생성하고 BloC과 생명주기를 같이하는데,
- value는 BlocProvider가 BloC의 생명주기에 관여하지 않아서 BloC이 자꾸 dispose 된다 까지 이해 ok
- 왜 서브화면 진입이나 pop할 때 자꾸 Create 하는가?
- dispose 되는 거라면 왜 Observer의 onClose에 잡히지 않는가?
- pushNamed 에서는 왜 정상작동 했는가?
반응형