분류, 패키지 및 저장소 검색

패키지 상세v9.3.0

get_it

인터페이스와 구체적인 구현을 분리하고 앱 내 어디서든 구체적인 구현에 접근할 수 있도록 해주는 간단하고 직접적인 서비스 로케이터입니다.

AndroidiOSWebmacOSWindowsLinux
30일 다운로드
245만
좋아요
4.7천
Pub 점수
160

패키지 설치

flutter pub add get_it

패키지 개요

공개 정보를 바탕으로 생성한 선택 가이드입니다.

GetIt은 Dart와 Flutter용 가벼우면서도 간단한 서비스 로케이터로, 인터페이스와 그 구현체를 분리함으로써 종속성 주입을 가능하게 합니다. 개발자는 앱 전체에서 최소한의 반복 코드로 서비스를 등록하고 검색할 수 있습니다. GetIt은 지연 인스턴스화, 팩토리 등록 및 모킹을 통한 간편한 테스트를 지원합니다. 앱의 다양한 부분에서 리포지토리, API 또는 상태 관리자와 같은 공유 종속성을 관리하는 데 이상적입니다.

사용 사례

  • 여러 위젯에 걸쳐 공유 서비스 관리
  • 모의 종속성으로 테스트
  • 리포지터리 및 API 클라이언트 주입
  • 상태 관리 설정 간소화
  • 사용자 인터페이스를 비즈니스 로직에서 분리

주요 기능

  • 간단한 API, 최소 설정
  • 지연 및 즉시 인스턴스화를 지원합니다
  • 공장 및 싱글턴 등록
  • 단위 테스트를 위해 쉽게 모킹할 수 있음
  • 경량이고 빠름

적합한 대상

  • 작은부터 중간 규모의 Flutter 앱
  • 의존성 주입에 익숙하지 않은 개발자
  • 빠른 DI 통합이 필요한 프로젝트
  • 복잡성보다 단순성을 우선시하는 팀
  • 테스트 가능한 서비스 계층이 필요한 앱

고려 사항

  • 복잡한 DI 요구 사항을 가진 대규모 기업 앱에는 적합하지 않습니다
  • 주의 깊게 관리하지 않으면 수동 등록으로 인해 런타임 오류가 발생할 수 있습니다
  • 고급 DI 프레임워크와 비교하여 내장된 수명 주기 관리 기능이 제한적

원본 README

연결된 소스 저장소의 README 원문 스냅샷입니다. 최신 내용은 저장소에서 확인하세요.

get_it logo
Buy Me A Coffee
Sponsor

get_it codecov

📚 Complete documentation available at flutter-it.dev Check out the comprehensive docs with detailed guides, examples, and best practices!

A blazing-fast service locator for Dart and Flutter that makes dependency management simple.

As your app grows, you need a way to access services, models, and business logic from anywhere without tightly coupling your code to widget trees. get_it is a simple, type-safe service locator that gives you O(1) access to your objects from anywhere in your app—no BuildContext required, no code generation, no magic.

Think of it as a smart container that holds your app's important objects. Register them once at startup, then access them from anywhere. Simple, fast, and testable.

flutter_it is a construction set — get_it works perfectly standalone or combine it with other packages like watch_it (state management), command_it (commands), or listen_it (reactive operators). Use what you need, when you need it.

Why get_it?

  • ⚡ Blazing Fast — O(1) lookups using Dart's native Maps. No reflection, no slow searches.
  • 🎯 Type Safe — Full compile-time type checking with generics. Errors caught before runtime.
  • 🧪 Test Friendly — Easily swap real implementations for mocks. Reset and reconfigure between tests.
  • 🌳 No BuildContext — Access your objects from anywhere—business logic, utilities, even pure Dart packages.
  • 📦 Framework Agnostic — Works in Flutter, pure Dart, server-side, CLI apps. No Flutter dependencies required.
  • 🔧 Zero Boilerplate — No code generation, no build_runner, no annotations. Just register and use.

Learn more about the philosophy behind get_it →

💡 New to service locators? Read Martin Fowler's classic article on Inversion of Control Containers and the Dependency Injection pattern or check out this detailed blog post on using service locators with Flutter.

Quick Start

Installation

Add to your pubspec.yaml:

dependencies:
  get_it: ^8.0.2
Basic Usage
import 'package:get_it/get_it.dart';

// Create a global instance (or use GetIt.instance)
final getIt = GetIt.instance;

// 1. Define your services
class ApiClient {
  Future<void> fetchData() async { /* ... */ }
}

class UserRepository {
  final ApiClient apiClient;
  UserRepository(this.apiClient);
}

// 2. Register them at app startup
void configureDependencies() {
  getIt.registerSingleton<ApiClient>(ApiClient());
  getIt.registerLazySingleton<UserRepository>(
    () => UserRepository(getIt<ApiClient>())
  );
}

// 3. Access from anywhere in your app
class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () {
        // No BuildContext passing needed!
        getIt<UserRepository>().apiClient.fetchData();
      },
      child: Text('Fetch Data'),
    );
  }
}

That's it! Three simple steps: define, register, access.

Key Features

Registration Types

Choose the lifetime that fits your needs:

  • Singleton — Create once, share everywhere. Perfect for services that maintain state. Read more →

  • LazySingleton — Create on first access. Delays initialization until needed. Read more →

  • Factory — New instance every time. Great for stateless services or objects with short lifetimes. Read more →

Avoid untyped tear-offs as factories. Registering getIt.call (or an untyped getIt.get tear-off) as registerLazySingleton<Iface>(...) re-enters get<Iface>() and used to overflow the stack. For lazy singletons (sync and async) and cached factories GetIt now detects this circular self-resolution and throws a descriptive StateError. Plain registerFactory factories are not guarded, since a factory that recursively resolves its own type (e.g. to build a tree) is a legitimate pattern. Prefer () => getIt<Impl>() or a named function that keeps the concrete type argument.

Advanced Features
  • Scopes — Create hierarchical registration scopes for different app states (login/logout, sessions, feature flags). Read more →

  • Async Objects — Register objects that need async initialization with dependency ordering. Read more →

  • Startup Orchestration — Easily orchestrate initialization of asynchronous objects during startup. Read more →

  • Named Instances — Register multiple implementations of the same type with different names. Read more →

  • Multiple Registrations — Register multiple implementations and retrieve them all as a collection. Read more →

  • Unregistering — Remove registrations with unregister(), optionally disposing the instance. By default unregister() throws if nothing matching is registered (usually a sign that you dispose once too often); set getIt.skipUnregisterIfNotRegistered = true to silently ignore a missing registration instead. Read more →

Testing Support

get_it makes testing a breeze:

  • Easy Mocking — Replace real implementations with mocks using allowReassignment or reset()
  • Test Isolation — reset() clears all registrations between tests
  • Constructor Injection — Use optional constructor parameters to inject mocks in tests
// In tests
setUp(() {
  getIt.registerSingleton<ApiClient>(MockApiClient());
});

tearDown(() async {
  await getIt.reset();
});

Read testing guide →

DevTools Extension

get_it includes a DevTools extension that lets you visualize and inspect all registered objects in your running app:

  • View all registrations — See type, instance name, scope, registration mode, async status, ready state, and creation status
  • Instance details — View the toString() output of created instances to inspect their state
  • Manual refresh — Update the registration list anytime with the refresh button
Setup
  1. Enable debug events in your app (typically in main.dart). This enables the extension to receive automatic updates when registrations change:

    void main() {
      GetIt.instance.debugEventsEnabled = true;
      // ... rest of your setup
      runApp(MyApp());
    }
    
  2. Run your app in debug mode and open DevTools

  3. Open DevTools in the browser — The extension currently only works in the browser-based DevTools, not in the IDE-embedded version.

  4. Enable the extension — Click the Extensions button (puzzle piece icon) in the top right corner of DevTools and enable the get_it extension.

  5. Find the "get_it" tab — The extension will appear as a new tab in DevTools

For more information on using DevTools extensions, see the official Flutter DevTools documentation.

💡 Tip: Override toString() in your registered classes to see meaningful details in the DevTools extension. By default, Dart's toString() only shows the type name and instance ID.

class UserRepository {
  final String userId;
  
  @override
  String toString() => 'UserRepository(userId: $userId)';
}
Flutter Widget Previews

get_it works seamlessly with Flutter's widget previewer. Since previews run in isolation, you need to initialize get_it within the preview itself:

@Preview()
Widget myPreview() {
  if (!getIt.isRegistered<MyService>()) {
    getIt.registerSingleton<MyService>(MockService());
  }
  return const MyWidget();
}

Or use a reusable wrapper for automatic cleanup:

@Preview(name: 'My Widget', wrapper: myWrapper)
Widget myPreview() => const MyWidget();

Read Flutter previews guide →

Ecosystem Integration

get_it works independently — use it standalone for dependency injection in any Dart or Flutter project.

Want more? Combine with other packages from the flutter_it ecosystem:

  • Optional: watch_it — Reactive state management built on get_it. Watch registered objects and rebuild widgets automatically.

  • Optional: command_it — Command pattern with loading/error states. Integrates seamlessly with get_it services.

  • Optional: listen_it — ValueListenable operators (map, where, debounce). Use with objects registered in get_it.

Remember: flutter_it is a construction set. Each package works independently. Pick what you need, combine as you grow.

Learn about the ecosystem →

AI-Assisted Development

This package ships an Agent Skill for AI coding assistants (Claude Code, Cursor, GitHub Copilot, Codex, Gemini CLI and others) in skills/get-it-expert/. It teaches them the critical rules, common patterns and anti-patterns of get_it. Install it into your project with the official Dart skills tool:

dart run skills@ get

For the ecosystem-wide skills (architecture guidance, feed/data-source patterns, overview) and the skills of the other flutter_it packages run:

dart run skills@ add flutter-it/flutter_it

Learn more about AI skills →

Learn More

Documentation
  • Getting Started — Installation, basic concepts, when to use what
  • Object Registration — All registration types, parameters, disposing
  • Scopes — Hierarchical scopes, shadowing, scope management
  • Async Objects — Async initialization, dependencies, allReady()
  • Testing — Unit tests, integration tests, mocking strategies
  • Advanced Topics — Named instances, multiple GetIt instances, runtime types
  • FAQ — Common questions and troubleshooting
Community & Support
Articles & Resources

Contributing

Contributions are welcome! Please read the contributing guidelines before submitting PRs.

License

MIT License - see LICENSE file for details.

Acknowledgements

Many thanks to Brian Egan and Simon Lightfoot for the insightful discussions on the API design.


Part of the flutter_it ecosystem — Build reactive Flutter apps the easy way. No codegen, no boilerplate, just code.

카테고리

의존성

의존성 목록 3 개

소스 저장소

이 패키지를 사용하는 프로젝트

순위