get_it 패턴은 Flutter 애플리케이션에서 의존성 주입(Dependency Injection)을 간단하고 효율적으로 관리하기 위해 사용되는 패턴입니다. get_it 패키지는 서비스 로케이터(Service Locator) 패턴을 구현하여, 애플리케이션의 상태와 서비스를 전역적으로 접근할 수 있게 합니다.
주요 개념
1. 서비스 로케이터(Service Locator):
• 의존성 주입의 한 형태로, 애플리케이션의 다양한 부분에서 공통된 서비스를 쉽게 가져올 수 있게 합니다.
• 서비스 로케이터를 통해 인스턴스를 전역적으로 관리하고 재사용할 수 있습니다.
2. 의존성 주입(Dependency Injection):
• 클래스 간의 의존성을 주입하여 코드의 재사용성과 테스트 용이성을 높입니다.
• 객체를 직접 생성하는 대신, 필요한 의존성을 외부에서 주입합니다.
주요 기능
• 등록 및 해제:
• 서비스를 등록하고 필요 시 해제할 수 있습니다.
• 싱글톤 및 팩토리:
• 싱글톤 인스턴스와 팩토리 인스턴스를 지원합니다.
• 전역 접근:
• 애플리케이션 어디서나 서비스에 접근할 수 있습니다.
예제
간단한 예제를 통해 get_it 패턴을 사용하는 방법을 살펴보겠습니다.
1. 패키지 추가
pubspec.yaml 파일에 get_it 패키지를 추가합니다.
get_it
2. 서비스 클래스 정의
class CounterService {
int _count = 0;
int get count => _count;
void increment() {
_count++;
}
void decrement() {
_count--;
}
}
3. 서비스 등록
애플리케이션의 초기화 단계에서 서비스를 등록합니다.
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'counter_service.dart';
void setupLocator() {
GetIt.I.registerLazySingleton(() => CounterService());
}
void main() {
setupLocator();
runApp(MyApp());
}
4. 서비스 사용
애플리케이션의 다양한 부분에서 서비스를 사용합니다.
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'counter_service.dart';
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: CounterPage(),
);
}
}
class CounterPage extends StatelessWidget {
final CounterService _counterService = GetIt.I<CounterService>();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Get It Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Counter: ${_counterService.count}',
style: TextStyle(fontSize: 24),
),
SizedBox(height: 20),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
FloatingActionButton(
onPressed: _counterService.increment,
child: Icon(Icons.add),
),
SizedBox(width: 20),
FloatingActionButton(
onPressed: _counterService.decrement,
child: Icon(Icons.remove),
),
],
),
],
),
),
);
}
}
1. 서비스 등록:
• GetIt.I.registerLazySingleton(() => CounterService());를 사용하여 서비스를 등록합니다. 이는 싱글톤 인스턴스를 생성합니다.
• registerFactory를 사용하면 요청할 때마다 새로운 인스턴스를 생성합니다.
2. 서비스 사용:
• GetIt.I<CounterService>()를 사용하여 등록된 서비스를 가져옵니다.
• 이를 통해 애플리케이션의 어디서나 동일한 서비스 인스턴스를 사용할 수 있습니다.
다른 예시 (실습)
파일구성
locator 패키지
- locator.dart
service 패키지
- album_service.dart
view 패키지
- album_getit_view.dart
메인 메소드
- locator 메소드 호출
album_service.dart
import 'dart:convert';
import '../model/album.dart';
import 'package:http/http.dart' as http;
abstract class AlbumService {
Future<List<Album>> fetchAlbums();
}
class AlbumServiceImplementation implements AlbumService {
@override
Future<List<Album>> fetchAlbums() async {
final reponse = await http.get(
Uri.parse("https://jsonplaceholder.typicode.com/albums")
);
final List<Album> result = jsonDecode(reponse.body)
.map<Album>((json) => Album.fromJson(json))
.toList();
return result;
}
}
locator.dart
import 'package:flutter_lecture/service/album_service.dart';
import 'package:get_it/get_it.dart';
GetIt locator = GetIt.instance;
initLocator() {
locator.registerLazySingleton<AlbumService>(() => AlbumServiceImplementation());
}
album_getit_view.dart
import 'package:flutter/material.dart';
import 'package:flutter_lecture/locator/locator.dart';
import 'package:flutter_lecture/model/albums.dart';
import 'package:flutter_lecture/bloc/album_bloc.dart';
import 'package:flutter_lecture/service/album_service.dart';
import '../model/album.dart';
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final AlbumService _service = locator<AlbumService>();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("test title"),
),
body: FutureBuilder(
future: _service.fetchAlbums(),
builder: (context, snapshot) {
if(snapshot.hasData) {
List<Album>? list = snapshot.data;
return ListView.builder(
itemCount: list?.length,
itemBuilder: (context, index) {
return Container(
padding: const EdgeInsets.all(10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("ID: ${list?[index].id.toString()}"),
Text("Title: ${list?[index].title}" )
],
),
);
}
);
} else if(snapshot.hasError){
return Center(
child: Text(snapshot.error.toString()),
);
} else {
return const Center(
child: CircularProgressIndicator(
strokeWidth: 2,
),
);
}
},
),
);
}
}
메인 메소드 :
void main() {
initLocator();
runApp(const MyApp());
}
장점
• 간단함:
• 의존성 주입을 간단하게 구현할 수 있습니다.
• 유연성:
• 다양한 유형의 서비스 인스턴스를 등록하고 관리할 수 있습니다.
• 테스트 용이성:
• 의존성을 쉽게 주입할 수 있어 단위 테스트를 쉽게 작성할 수 있습니다.
참고 문서
이 정보를 통해 Flutter 애플리케이션에서 get_it 패턴을 사용하여 의존성 주입을 효율적으로 관리할 수 있습니다. get_it 패턴을 활용하면 코드의 구조를 개선하고 유지보수성을 높일 수 있습니다.
'프론트엔드 > Flutter' 카테고리의 다른 글
flutter webview 사용방법 (0) | 2024.07.22 |
---|---|
flutter local notifications - 알림 (0) | 2024.07.22 |
flutter provider 패턴 (1) | 2024.07.22 |
flutter bloc 패턴 적용 (0) | 2024.07.22 |
flutter 리프레쉬 인디케이터 (0) | 2024.07.22 |