반응형

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());
}

 

 

장점

 

간단함:

의존성 주입을 간단하게 구현할 수 있습니다.

유연성:

다양한 유형의 서비스 인스턴스를 등록하고 관리할 수 있습니다.

테스트 용이성:

의존성을 쉽게 주입할 수 있어 단위 테스트를 쉽게 작성할 수 있습니다.

 

참고 문서

 

Get It 패키지 문서

Flutter 공식 의존성 주입 가이드

 

이 정보를 통해 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

+ Recent posts