강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của kwangtaeseo9119
kwangtaeseo9119

câu hỏi đã được viết

Flutter trung cấp tập 3 - Hướng dẫn dependency injection

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

Viết

·

107

·

Đã chỉnh sửa

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 하지 못한 거 같은 느낌인데 이런 경우를 못 보셨는지요?

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

 

 

fluttermvvmprovider클린-아키텍처dependency

Câu trả lời 2

0

survivalcoding님의 프로필 이미지
survivalcoding
Người chia sẻ kiến thức

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

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

kwangtaeseo9119님의 프로필 이미지
kwangtaeseo9119
Người đặt câu hỏi

답변 감사합니다.

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

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

survivalcoding님의 프로필 이미지
survivalcoding
Người chia sẻ kiến thức

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

kwangtaeseo9119님의 프로필 이미지
kwangtaeseo9119
Người đặt câu hỏi

제가 뭘 잘못하고 있는거겠죠 ^^

다시 한번 해보겠습니다.

답변 감사합니다.

kwangtaeseo9119님의 프로필 이미지
kwangtaeseo9119
Người đặt câu hỏi

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

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

혹시나 해서 위처럼 순서를 바꿔서 해보니 되네요.. ^^;;

뭔가 build 시 꼬였던거 같기도 하고...

감사합니다.

survivalcoding님의 프로필 이미지
survivalcoding
Người chia sẻ kiến thức

해결이 되어서 다행이네요.
ViewModel 을 제외하고 모두 LazySingleton 이면 순서와 관계 없이 되어야 하는데 혹시나 UseCase 가 그냥 singleton 이라면 이 부분도 확인해 보세요.

0

안녕하세요, 인프런 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 관련된 평소의 문제와 해결방법에 대한 답변

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

kwangtaeseo9119님의 프로필 이미지
kwangtaeseo9119
Người đặt câu hỏi

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();
}

 

Hình ảnh hồ sơ của kwangtaeseo9119
kwangtaeseo9119

câu hỏi đã được viết

Đặt câu hỏi