EEYatHo 앱 깎는 이야기

GetIt , Go Router, BloC 함께 사용시 BloC이 계속 생성되는 문제 본문

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 에서는 왜 정상작동 했는가?

'Flutter' 카테고리의 다른 글

Flutter ) webview_flutter image, file 첨부  (0) 2025.01.17
Flutter ) Bloc 사용법  (0) 2024.07.21
Comments