App/Flutter

Flutter GetIt으로 Dependency Injection하기

Say simple 2024. 3. 22. 00:08
728x90
반응형

Flutter에는 GetIt이라는 의존성 주입 도구가 있다. GetIt은 서비스 로케이터 패턴으로 개발되었다.

서비스 로케이터

서비스나 의존성을 등록하고 필요할 때 코드의 어느 위치에서나 찾아 사용할 수 있는 패턴으로 인스턴스를 쉽게 등록하고 사용할 수 있는 장점이 있다.

인스턴스 사용 방법

  • Factory: 새 인스턴스를 생성해서 반환한다.
  • Singleton: 싱글톤 패턴으로 같은 인스턴스를 반환한다.
  • Lazy Singleton: 처음 호출될 때 인스턴스를 생성하여 반환한 후 해당 인스턴스를 재활용한다.

장점

  • 쉬운 의존성 주입: 생성한 get_it 인스턴스 안에 API, Dao, HiveBox 등을 쉽게 넣어 주입할 수 있다.
  • 분리된 인스턴스: 각각 다른 성격을 띄는 객체들을 다른 get_it 인스턴스에 주입할 수 있다.
  • 비동기: 비동기 팩토리 함수를 지원한다.

예제

의존성 설치

pubspec.yaml에 의존성 추가

#--------------- PACKAGES ------------------#
dependencies:
  ...
  get_it: ^7.6.0
  ...
#--------------- ./ PACKAGES END ------------------#

get_it 인스턴스 생성 및 인스턴스 등록

  • PostsApi 인스턴스 등록
  • PostsDao 인스턴스 등록
  • postsBox HiveBox 인스턴스 등록
import 'package:get_it/get_it.dart';

GetIt di = GetIt.instance;

Future<void> setup() async {
  di
    ..registerLazySingleton<PostsApi>(() => HttpPostsApi(client: Client()))
    ..registerLazySingleton<PostsDao>(
      () => HivePostsDao(authorsBox: di(), postsBox: di()),
    )
    

  // --- open and register posst box
  final postsBox = await Hive.openBox<PostsResponse>('postsBox');
  di.registerLazySingleton(() => postsBox);
}

main 함수에서 setup 함수 실행

runApp 전에 setup을 실행한다. 비동기 이기 때문에 await 키워드를 붙인다.

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  final dir = await getApplicationDocumentsDirectory();
  final dbPath = join(dir.path, '.db.post');
  await Hive.initFlutter(dbPath);

  // register custom types
  Hive
    ..registerAdapter(PostsResponseAdapter())
    ..registerAdapter(PostAdapter())
    
  await setup();

  runApp(const App());
}

원하는 위치에서 주입

di<NavigationService>()로 타입을 명시해 해당 객체를 불러온다.

class HomeScreen extends StatelessWidget {
  const HomeScreen({super.key});

  @override
  Widget build(BuildContext context) {
    final navigationService = di<NavigationService>();
    return Scaffold(
      appBar: AppBar(
        title: const Text('Posts'),
        actions: [
        ...
728x90
반응형