본문 바로가기
Mobile APP/Flutter

[Flutter] Abstract class 를 get_it 에 넣어 사용하기

by 흐암졸령 2023. 2. 17.
반응형
import 'package:get_it/get_it.dart';

final GetIt inject = GetIt.instance;

void init() {
	inject.registerLazySingleton(() => UsecaseImpl());
}​
import 'package:get_it/get_it.dart';

final GetIt inject = GetIt.instance;

void init() {
	inject.registerLazySingleton(() => UsecaseImpl());
}

문제 상황

 현재까지는 실제 클래스를 get it 에다가 넣어서 사용하고 있었다. 그러나 widgetbook 을 사용하면서 실제 main.dart 파일과 widgetbook 에서 실행하는 main.dart 파일 각각의 di를 사용해야 하는 문제가 생겼다. 같은 get it class 를 공유하면서 실제 injection 하는 클래스의 구현이 달라야 하는 것이다. 따라서 추상클래스를 사용해 같은 코드로 부르지만, 실제 불러지는 클래스는 다르게 하기로 하였다.

 

해결 방법

 먼저 추상클래스와 이를 바탕으로 구현하는 클래스를 각각 만든다.

abstract class Usecase {
	int method(int id);
}

class UsecaseImpl implements Usecase {
    @override
    int method(int id) {
    	return id;
    }
}

 

 클래스의 내용과 이름 등은 모두 임의로 정하였다. 이렇게 클래스를 구현하였으니 getit 에 등록을 해야한다. 추상클래스를 사용하기 이전에는 다음과 같은 방법으로 등록을 한 후 사용하였다.

import 'package:get_it/get_it.dart';

final GetIt inject = GetIt.instance;

void init() {
	inject.registerLazySingleton(() => UsecaseImpl());
}
final _usecase = inject<UsecaseImpl>();

 

 추상 클래스를 사용하는 의의는 impl 의 실제 구현을 숨기기 위해서이다. 따라서 우리는 UsecaseImpl 을 보이지 않고 Usecase 만을 사용해야 한다. Usecase 는 추상 클래스이기 때문에 위 방법과 같이 클래스의 타입을 기반으로 inject 한 것을 찾을 수 없다. 따라서 get it 에서 제공하는 instanceName 으로 inject 를 해 주어야 한다.

 다음과 같이 등록한 후 사용하면 Usecase 만으로 원하는 구현 클래스를 사용할 수 있다.

 

import 'package:get_it/get_it.dart';

final GetIt inject = GetIt.instance;

void init() {
	inject.registerLazySingleton<Usecase>(
    	() => UsecaseImpl(),
    	instanceName: 'Usecase',
  	);
}
Usecase _usecase = inject.get<Usecase>(instanceName: 'Usecase');

 

Reference

 

Get_It Flutter Multiple Abstract Class Registration

We are using the package get_it:^7.1.3 for dependency injection. I want to register some classes with the same abstract class (like they were interfaces) and get them like: List<AbstractLass>

stackoverflow.com

 

반응형

댓글