パッケージ、リポジトリ、アプリカテゴリを検索

パッケージ詳細v2.0.0

flutter_simple_dependency_injection

Flutter用の非常にシンプルな依存関係注入実装で、通常のIOCコンテナと同様に動作し、ミラーに依存しません。

AndroidiOSWebmacOSWindowsLinux
30日間ダウンロード
3880
いいね数
74
Pub ポイント
160

パッケージをインストール

flutter pub add flutter_simple_dependency_injection

パッケージ概要

公開情報に基づく選定ガイドです。参考としてご利用ください。

Flutter向けの軽量な依存関係注入パッケージで、シンプルでミラー不要のIOCコンテナを提供します。開発者がアプリ全体にわたって依存関係を簡単に登録・解決できるため、関心の明確な分離が実現されます。シンプルさとパフォーマンスを重視し、ランタイムリフレクションを回避しており、ツリーシェーキング対応により本番アプリにも適しています。APIは直感的で、既存のFlutterプロジェクトへの統合も複雑さなくスムーズに行えます。

用途

  • 複数のウィジェットにわたって共有サービスを管理する
  • リポジトリとデータソースのインジェクション
  • モック依存関係を使用したテスト
  • 複雑なオブジェクトグラフの初期化を簡素化する
  • モジュールアーキテクチャアプリの有効化

主な機能

  • ミラー不要の依存関係解決
  • シンプルな登録および取得の構文
  • シングルトンおよび一時インスタンスをサポート
  • すべての Flutter プラットフォームで動作します
  • 軽量で起動が早い

適している対象

  • 小規模から中規模のFlutterアプリケーション
  • DIの最小構成を求めるチーム
  • パフォーマンスとツリー・シェーキングを最優先するプロジェクト
  • 複雑なDIフレームワークを避ける開発者

注意事項

  • 完全なDIコンテナと比較して、高度な機能が限られている
  • 階層的なスコープに対する組み込みサポートなし
  • 複雑なシナリオにおけるライフサイクルの手動管理
  • 複雑な依存関係ツリーを持つ大規模なエンタープライズアプリには適していない

元の README

関連するソースリポジトリの README 原文のスナップショットです。最新の内容はリポジトリをご覧ください。

flutter_simple_dependency_injection

A simple dependency injection plugin for Flutter and Dart.

This implementation does not rely on the dart reflection apis (mirrors) and favours a simple factory based approach. This increases the performance and simplicity of this implementation.

  • Support for multiple injectors (useful for unit testing or code running in isolates)
  • Support for types and named types
  • Support for singletons
  • Support simple values (useful for configuration parameters like api keys or urls)

Any help is appreciated! Comment, suggestions, issues, PR's!

Getting Started

In your flutter or dart project add the dependency:

dependencies:
  ...
  flutter_simple_dependency_injection: any

For help getting started with Flutter, view the online documentation.

Usage example

Import flutter_simple_dependency_injection

import 'package:flutter_simple_dependency_injection/injector.dart';
Injector Configuration

As this injector relies on factories rather than reflection (as mirrors in not available in Flutter) each mapped type needs to provide a factory function. In most cases this can just be a simple new object returned function. In slightly more advanced scenarios where the type to be created relies on other types an injector instances is passed into the factory function to allow the type of be created to get other types it depends on (see below for examples).

import 'package:flutter_simple_dependency_injection/injector.dart';

void main() {
  // it is best to place all injector initialisation work into one or more modules
  // so it can act more like a dependency injector than a service locator.
  // The Injector implements a singleton pattern. You can get a singleton injector instance
  // just by calling Injector().
  final injector = ModuleContainer().initialise(Injector());

  // NOTE: it is best to architect your code so that you never need to
  // interact with the injector itself.  Make this framework act like a dependency injector
  // by having dependencies injected into objects in their constructors.  That way you avoid
  // any tight coupling with the injector itself.

  // Basic usage, however this kind of tight couple and direct interaction with the injector
  // should be limited.  Instead prefer dependencies injection.

  // simple dependency retrieval and method call
  injector.get<SomeService>().doSomething();

  // get an instance of each of the same mapped types
  final instances = injector.getAll<SomeType>();
  print(instances.length); // prints '3'

  // passing in additional arguments when getting an instance
  final instance =
      injector.get<SomeOtherType>(additionalParameters: {"id": "some-id"});
  print(instance.id); // prints 'some-id'
}

class ModuleContainer {
  Injector initialise(Injector injector) {
    injector.map<Logger>((i) => Logger(), isSingleton: true);
    injector.map<String>((i) => "https://api.com/", key: "apiUrl");
    injector.map<SomeService>(
        (i) => SomeService(i.get<Logger>(), i.get<String>(key: "apiUrl")));

    // note that you can configure mapping in a fluent programming style too
    injector.map<SomeType>((injector) => SomeType("0"))
            ..map<SomeType>((injector) => SomeType("1"), key: "One")
            ..map<SomeType>((injector) => SomeType("2"), key: "Two");

    injector.mapWithParams<SomeOtherType>((i, p) => SomeOtherType(p["id"]));

    return injector;
  }
}

class Logger {
  void log(String message) => print(message);
}

class SomeService {
  final Logger _logger;
  final String _apiUrl;

  SomeService(this._logger, this._apiUrl);

  void doSomething() {
    _logger.log("Doing something with the api at '$_apiUrl'");
  }
}

class SomeType {
  final String id;
  SomeType(this.id);
}

class SomeOtherType {
  final String id;
  SomeOtherType(this.id);
}

Remove mappings

You can remove a mapped a factory/instance at any time:

  injector.removeMapping<SomeType>();

  injector.removeMapping<SomeType>(key: 'some_key');

  injector.removeAllMappings<SomeType>();
Multiple Injectors

The Injector class has a factory constructor that by default returns the default singleton instance of the injector. In most cases this will be enough. However, you can pass a name into this factory constructor to return another isolated injector that is independent from the default injector. Passing in a new injector name will create the injector if it has not be retrieved before.

  final defaultInjector = Injector();
  final isolatedInjector = Injector("Isolated");

To destroy an injector instance call its dispose method. The particular instance of the injector with all mappings will be removed.

  Injector().dispose();
  Injector("Isolated").dispose();

カテゴリー

ソースリポジトリ

このパッケージを使用しているプロジェクト