Loading...
Loading...
Flutter 프로젝트에서 get_it 기반 의존성 주입 설정 방법. `diSetup()` 함수 작성, DataSource/Repository/UseCase/ViewModel 등록 순서, 싱글톤 vs 팩토리 선택, Root 위젯에서 `getIt<T>()` 호출 패턴을 다룹니다. "DI 설정", "get_it", "registerSingleton", "registerFactory", "의존성 주입", "ViewModel 등록", "diSetup", "getIt 인스턴스" 같은 표현이 나오면 반드시 이 스킬을 사용하세요.
npx skill4agent add junsuk5/survival-flutter-skills flutter-di-get-itlib/core/di/di_setup.dartdiSetup()main()runApp()diSetup()getIt<T>()getItregisterFactory// lib/core/di/di_setup.dart
final getIt = GetIt.instance;
void diSetup() {
// 1) data source
// 2) repository
// 3) use case
// 4) view model
}// lib/main.dart
void main() {
diSetup();
runApp(const MyApp());
}getIt()getIt.registerSingleton<RecipeDataSource>(RemoteRecipeDataSourceImpl());
getIt.registerSingleton<LocalStorage>(DefaultLocalStorage());getIt()getIt<Foo>()getIt.registerSingleton<RecipeRepository>(
MockRecipeRepositoryImpl(
recipeDataSource: getIt(),
),
);
getIt.registerSingleton<BookmarkRepository>(MockBookmarkRepositoryImpl());getIt.registerSingleton(
GetSavedRecipesUseCase(
recipeRepository: getIt(),
bookmarkRepository: getIt(),
),
);registerFactorygetIt.registerFactory<IngredientViewModel>(
() => IngredientViewModel(
ingredientRepository: getIt(),
procedureRepository: getIt(),
getDishesByCategoryUseCase: getIt(),
clipboardService: getIt(),
),
);class SavedRecipesRoot extends StatelessWidget {
const SavedRecipesRoot({super.key});
Widget build(BuildContext context) {
final viewModel = getIt<SavedRecipesViewModel>();
return ListenableBuilder(
listenable: viewModel,
builder: (context, _) => SavedRecipesScreen(
recipes: viewModel.state.recipes,
onAction: viewModel.onAction,
),
);
}
}getIt<>()*Rootbuild()stateonAction| 등록 함수 | 언제 쓰나 | 예 |
|---|---|---|
| 앱 수명 동안 한 인스턴스만 필요. 이미 생성한 객체를 바로 넣을 때 | Repository, DataSource, UseCase, HttpClient |
| 최초 접근 시점까지 생성을 늦추고 싶을 때 | 초기화 비용이 큰 객체 |
| 호출할 때마다 새 인스턴스 | ViewModel |
lib/core/di/di_setup.dartregisterSingletonregisterFactorygetIt.registerSingleton<HttpClient>(HttpClientFactory.create(getIt()));domaindata/data_source/registerSingleton<Interface>registerFactorygetIt<ViewModelType>()getIt<T>()registerSingletondiSetup()getIt.register*getItgetIt<MockRecipeRepositoryImpl>()