[flutter] 플러터에서 다른 라이브러리와의 호환성을 유지하기 위한 Injectable 사용 방법

플러터(Flutter)는 크로스 플랫폼 모바일 애플리케이션 개발을 위한 프레임워크로 많은 개발자들에게 사랑받고 있습니다. 하지만, 플러터로 애플리케이션을 개발하다 보면 다른 라이브러리와의 호환성 문제가 발생할 수 있습니다.

특히, 다른 라이브러리에서 사용하는 의존성 주입(Dependency Injection) 패턴을 플러터에서도 사용하려면 일부 작업이 필요합니다. 이때 injectable 라이브러리를 사용하면 플러터와 다른 라이브러리 간의 호환성을 유지할 수 있습니다.

1. Inject와 Injectable 애너테이션 추가

먼저, injectable 라이브러리를 사용하기 위해서는 해당 모듈의 의존성을 주입할 수 있도록 클래스에 @injectable 애너테이션을 추가해야 합니다. 또한 주입할 의존성을 가진 필드나 메소드에는 @inject 애너테이션을 추가해야 합니다.

import 'package:injectable/injectable.dart';

@injectable  // 해당 클래스를 주입 가능한 클래스로 정의
class MyRepository {
  // 의존성을 주입할 필드에는 @inject 애너테이션을 추가
  @inject
  MyApiClient? _apiClient;

  // 의존성을 주입할 메소드에도 @inject 애너테이션을 추가
  @inject
  void setApiClient(MyApiClient apiClient) {
    _apiClient = apiClient;
  }
}

2. Injectable 생성

다음으로, injectable 패키지를 사용하여 프로젝트의 의존성 컨테이너를 생성해야 합니다. 이때 get_it 패키지를 사용하여 의존성을 주입합니다.

import 'package:get_it/get_it.dart';
import 'package:injectable/injectable.dart';

// 의존성 컨테이너 생성
final GetIt getIt = GetIt.instance;

Future<void> configureDependencies() async {
  // `injectable` 패키지를 사용하여 의존성 자동 주입
  await configureInjection(getIt);
}

3. 의존성 주입

마지막으로, 의존성을 주입할 클래스를 사용하는 곳에서 의존성을 주입합니다.

import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';

class MyWidget extends StatelessWidget {
  final MyRepository _repository;

  // constructor를 통해 의존성을 주입
  MyWidget({required MyRepository repository})
      : _repository = repository;

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text('Hello'),
    );
  }
}

void main() async {
  // 의존성 컨테이너 설정
  await configureDependencies();

  // 의존성 주입된 클래스를 사용
  runApp(MyWidget(repository: getIt<MyRepository>()));
}

위의 예시에서는 getIt<MyRepository>()를 통해 MyRepository 클래스의 인스턴스를 주입했습니다. 이렇게 주입된 의존성을 사용하여 필요한 작업을 처리할 수 있습니다.

위의 방법을 사용하면 플러터와 다른 라이브러리 간의 호환성을 유지하면서 의존성을 쉽게 주입할 수 있습니다.

관련 문서: injectable 패키지