Flutter依赖注入插件flutter_simple_dependency_injection的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter依赖注入插件flutter_simple_dependency_injection的使用

flutter_simple_dependency_injection简介

flutter_simple_dependency_injection是一个为Flutter和Dart设计的简单依赖注入插件。这个实现不依赖于Dart的反射API(mirrors),而是采用基于工厂的方法。这提高了性能并简化了实现。

特点

  • 支持多个注入器(对单元测试或在孤立进程中运行代码非常有用)
  • 支持类型和命名类型
  • 支持单例模式
  • 支持简单值(如配置参数、API密钥或URL)

任何帮助都是受欢迎的!您可以评论、提出建议、报告问题或发送PR!

开始使用

在您的Flutter或Dart项目中添加依赖:

dependencies:
  ...
  flutter_simple_dependency_injection: any

有关开始使用Flutter的帮助,请查看在线文档

使用示例

首先,导入flutter_simple_dependency_injection

import 'package:flutter_simple_dependency_injection/injector.dart';

Injector配置

由于此注入器依赖于工厂而非反射(因为Flutter中不支持mirrors),每个映射的类型都需要提供一个工厂函数。大多数情况下,这只是一个简单的返回新对象的函数。在更复杂的情况下,当要创建的类型依赖于其他类型时,可以将注入器实例传递给工厂函数以允许创建的类型获取它所依赖的其他类型(参见以下示例)。

示例代码

void main() {
  // 将所有注入器初始化工作放入一个或多个模块中
  final injector = ModuleContainer().initialise(Injector());

  // 简单的依赖项检索和方法调用
  injector.get<SomeService>().doSomething();

  // 获取每个相同映射类型的实例
  final instances = injector.getAll<SomeType>();
  print(instances.length); // 打印 '3'

  // 在获取实例时传递额外参数
  final instance =
      injector.get<SomeOtherType>(additionalParameters: {"id": "some-id"});
  print(instance.id); // 打印 '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")));

    // 注意,您也可以使用流畅编程风格来配置映射
    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);
}

移除映射

您可以随时移除映射的工厂/实例:

injector.removeMapping<SomeType>();

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

injector.removeAllMappings<SomeType>();

多个注入器

Injector类有一个工厂构造函数,默认返回默认的单例注入器实例。在大多数情况下,这已经足够了。但是,您可以通过向此工厂构造函数传递名称来返回另一个独立于默认注入器的注入器。如果之前未检索过,则传递新的注入器名称将创建该注入器。

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

要销毁注入器实例,请调用其dispose方法。特定的注入器实例及其所有映射将被移除。

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

通过上述内容,您可以更好地理解如何在Flutter项目中使用flutter_simple_dependency_injection进行依赖注入。希望这些信息对您有所帮助!


更多关于Flutter依赖注入插件flutter_simple_dependency_injection的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter依赖注入插件flutter_simple_dependency_injection的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用flutter_simple_dependency_injection插件的一个简单示例。这个插件提供了一种在Flutter应用中实现依赖注入的方式。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加flutter_simple_dependency_injection依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_simple_dependency_injection: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 配置依赖注入容器

创建一个全局的依赖注入容器。你可以在应用的入口文件(例如main.dart)中完成这个操作。

import 'package:flutter/material.dart';
import 'package:flutter_simple_dependency_injection/flutter_simple_dependency_injection.dart';

// 创建一个全局的依赖注入容器实例
final injector = DiContainer();

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

3. 定义服务

接下来,定义一些服务。例如,我们可以创建一个简单的UserService

class UserService {
  String getUserName() {
    return "John Doe";
  }
}

4. 注册服务

在你的应用初始化过程中,将服务注册到依赖注入容器中。这可以在main.dart文件中完成。

void main() {
  // 初始化并注册服务
  injector.register<UserService>(() => UserService());

  runApp(MyApp());
}

5. 获取并使用服务

现在你可以在任何需要的地方通过依赖注入容器获取服务实例。例如,在MyHomePage中:

import 'package:flutter/material.dart';
import 'package:flutter_simple_dependency_injection/flutter_simple_dependency_injection.dart';
import 'main.dart';  // 确保导入全局的 injector 实例

class MyHomePage extends StatelessWidget {
  MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    // 从依赖注入容器中获取 UserService 实例
    final UserService userService = injector.get<UserService>();

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text(
          'Hello, ${userService.getUserName()}!',
          style: TextStyle(fontSize: 24),
        ),
      ),
    );
  }
}

完整代码示例

以下是完整的代码示例,包括所有上述步骤:

// pubspec.yaml
name: flutter_di_example
description: A new Flutter project.

publish_to: 'none' # Remove this line if you wish to publish to pub.dev

version: 1.0.0+1

environment:
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  flutter_simple_dependency_injection: ^2.0.0  # 替换为最新版本号

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  uses-material-design: true

// main.dart
import 'package:flutter/material.dart';
import 'package:flutter_simple_dependency_injection/flutter_simple_dependency_injection.dart';

class UserService {
  String getUserName() {
    return "John Doe";
  }
}

final injector = DiContainer();

void main() {
  injector.register<UserService>(() => UserService());

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final UserService userService = injector.get<UserService>();

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text(
          'Hello, ${userService.getUserName()}!',
          style: TextStyle(fontSize: 24),
        ),
      ),
    );
  }
}

这样,你就完成了在Flutter项目中使用flutter_simple_dependency_injection插件的基本设置和使用。

回到顶部