인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

서광태님의 프로필 이미지

작성한 질문수

Flutter 중급 3편 - 의존성 주입 가이드

DI 에 대해 문의 좀 드립니다.

작성

·

26

·

수정됨

0

di 관련해서 문의 좀 드리겠습니다.

선생님 강의를 듣고 get_it, injectable 패키지를 사용해서  di 를 실 프로젝트에도 적용 하고 있습니다.

여러 singleton 으로 생성 한 여러 usecace들을 한군데 모아 둔 usecases(OrderDetailUseCases) 를 만들어 viewModel 에 주입해서 사용하는 것을 보고 실 프로젝트에도 사용하고 있습니다.

아래 처럼요.

@singleton
class OrderDetailUseCases {
  final GetOrderDetailUseCase getDetail;
  final GetGoodsForBasketUseCase getGoodsForBasket;
  final DeleteOrderUseCase deleteOrder;


  OrderDetailUseCases(
    this.getDetail,
    this.getGoodsForBasket,
    this.deleteOrder,
  );
}

 

그런데 나중에 새로운 usecase(AddOrderUseCase) 가 생겨서 위 OrderDetailUseCases 에 추가하면

아래와 같은 오류가 뜹니다.

Bad state: GetIt: Object/factory with type OrderDetailUseCases is not registered inside GetIt.

(Did you accidentally do GetIt sl=GetIt.instance(); instead of GetIt sl=GetIt.instance;

Did you forget to register it?)

 

기존에 추가 했던 getDetail, getGooodsForBasket usecase 는 잘 사용하고 있습니다

분명 build runner 명령어를 실행 해 줬음에도 불구하구요.

그래서 DeleteOrderUseCase 는 따로 가져와 viewModel 에 전달해주고 있습니다. 아래처럼요.

final orderDetailViewModelProvier =
    StateNotifierProvider<OrderDetailViewModel, OrderDetailState>((ref) {
  final useCases = getIt<OrderDetailUseCases>();
  final deleteOrderUc = getIt<DeleteOrderUseCase>();
  return OrderDetailViewModel(
    useCases,
    deleteOrderUc,
  );
});

전 하나의 useCases 에 다 넣고 싶거든요..ㅡ,.ㅡ

이게 패키지가 좀 stable 하지 못한 거 같은 느낌인데 이런 경우를 못 보셨는지요?

경우가 있다면 어떻게 해법이 있는지 들어보고 싶습니다.

 

 

답변 2

0

오준석님의 프로필 이미지
오준석
지식공유자

객체 생성 순서가 중요한 경우가 있어서 그럴 수도 있을 것 같습니다.

singleton 대신 LazySingleton 으로 변경해 보시겠어요?

서광태님의 프로필 이미지
서광태
질문자

답변 감사합니다.

LazySingleton 으로 바꿔도 봤으나 동일 하더라구요..

순서때문인가 싶어 각 기능을 하는 usecase 를 먼저 빌드 시켜 놓고, 이것들을 모아둔 usecases 를 나중에 빌드해도 동일하더라구요.

오준석님의 프로필 이미지
오준석
지식공유자

singleton 들을 모두 LasySingleton으로 고치면 코드 작성 순서와 상관없이 되어야 하는데 이상하군요.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

의존성 주입에 관련된 문제를 겪으시는 것 같군요. get_itinjectable을 사용할 때, 새로운 UseCase를 추가할 때 문제를 해결하는 방법에 대해 설명드리겠습니다.

  1. 코드 확인: OrderDetailUseCases 클래스에 새로운 UseCase를 추가한 후, 해당 컴파일 에러가 발생하셨다면, 먼저 injectable로 생성된 파일이 올바르게 업데이트 되었는지 확인해보세요. 특히 di_setup_config.dart와 같은 파일들이 자동으로 생성되지만, 종종 수동으로 삭제 후 다시 생성해야 할 때가 있습니다.

  2. build_runner 사용: flutter pub run build_runner build --delete-conflicting-outputs 명령어를 사용하여 build_runner를 실행해보세요. 이 명령어는 기존에 충돌이 있는 파일을 삭제하고 다시 생성하므로, 문제가 해결될 수 있습니다.

  3. 잘못된 등록 체크: 새로운 UseCase가 잘못 등록되어 있거나 누락된 경우, GetIt에 올바로 등록되었는지 확인해보세요. OrderDetailUseCases가 제대로 등록되었다면, 다른 UseCase들과 함께 사용될 수 있을 것입니다.

  4. 테스트: 수동으로 GetIt 인스턴스를 초기화하는 부분이 있다면, OrderDetailUseCases의 인스턴스 생성 시, 모든 의존성이 해결되었는지 확인하는 것도 방법입니다.

비슷한 문의에 대해 도움을 받을 수 있는 기존 답변들을 아래에 소개드립니다:
- Bad state 에러: 갑작스러운 오류와 빌드 문제 해결에 관한 답변
- usecase 질문 드립니다.: UseCase와 DI 관련된 평소의 문제와 해결방법에 대한 답변

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

서광태님의 프로필 이미지
서광태
질문자

1.코드 확인: 빌드시 오류가 나진 않습니다. 실행 시 오류가 납니다.

2.build_runner 사용: flutter pub run build_runner build --delete-conflicting-outputs 를 사용해도 동일하게 오류가 납니다.

  1. 잘못된 등록 체크: di_setup.config.dart 에는 등록 되어 있습니다.

  2. 테스트 : 초기화 부분은 코드는 아래와 같습니다.

inal getIt = GetIt.instance;


@InjectableInit()
Future configureDependencies() async{
   await getIt.init();
}