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
반응형
'App > Flutter' 카테고리의 다른 글
Flutter Feature-first vs Layer-first (1) (0) | 2024.03.23 |
---|---|
Flutter SafeArea 알아보기 (0) | 2024.03.22 |
Flutter로 어떤 UI든 구현하는 방법 (0) | 2024.03.21 |
Flutter Bloc과 Cubit (0) | 2024.03.21 |
Flutter Operator와 Equatable로 객체 비교하기 (0) | 2024.03.21 |