搜尋套件、儲存庫與 APP 分類

套件詳情v2.0.0

flutter_simple_dependency_injection

一個超簡單的 Flutter 依賴注入實現,行為類似於任何正常的 IOC 容器,且不依賴於 mirrors。

AndroidiOSWebmacOSWindowsLinux
近 30 天下載
3880
喜歡數
74
Pub 分數
160

安裝套件

flutter pub add flutter_simple_dependency_injection

套件介紹

根據套件公開資料產生的選型評估,僅供參考。

一個輕量級的 Flutter 依賴注入套件,提供簡單直覺、無需鏡像的 IOC 容器。它讓開發者能輕鬆在應用程式中註冊與解析相依性,實現關注點的明確分離。設計以簡潔與效能為導向,避免使用執行時期反射,支援樹搖優化,適合用於生產環境。API 直觀易用,可無縫整合至現有的 Flutter 專案中,不增加複雜度。

適用情境

  • 跨多個小部件管理共享服務
  • 注入倉庫和資料來源
  • 使用模擬依賴項進行測試
  • 簡化複雜物件圖的初始化
  • 啟用模組化應用架構

主要特色

  • 無鏡像依賴解析
  • 簡單的註冊和檢索語法
  • 支援單例與暫時實例
  • 適用於所有 Flutter 平台
  • 輕量且啟動快速

適合對象

  • 中小型Flutter應用
  • 尋求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();

所屬分類

原始碼儲存庫

使用此套件的專案