Flutter依赖注入插件dart_injektor的使用

Flutter依赖注入插件dart_injektor的使用

这是Dart语言中一个轻量级的依赖注入包,提供了注册和解析依赖的功能。

使用

import 'package:dart_injektor/injektor.dart';

// 获取依赖注入实例,或创建一个新的实例。
final injektor = Injektor();

// 注册一个依赖实例。
final myDependency = MyDependency();
injektor.register<MyDependency>(myDependency);

// 解析依赖。
// 或者,你可以使用`resolve`或`call`方法来更明确地进行操作。
final myClass = injektor<MyDependency>();

API

Injektor 包提供了以下方法:

  • register<T>(T instance, [String identifier = 'DEFAULT'])

    注册一个依赖实例。T 类型参数指定依赖的类型。instance 参数是要注册的实例。identifier 参数是一个可选标识符。如果未提供,则默认为 DEFAULT

  • lazyRegister<T>(Function() factory, [String identifier = 'DEFAULT'])

    注册一个依赖工厂函数。T 类型参数指定依赖的类型。factory 参数是一个返回依赖实例的函数。identifier 参数是一个可选标识符。如果未提供,则默认为 DEFAULT

  • resolve<T>([String identifier = 'DEFAULT'])

  • call<T>([String identifier = 'DEFAULT'])

  • <T>([String identifier = 'DEFAULT'])

    解析一个依赖实例。T 类型参数指定依赖的类型。identifier 参数是一个可选标识符,用于解析实例或工厂。如果没有提供,则默认为 DEFAULT。如果给定类型和标识符的实例已注册,则返回该实例。否则,如果给定类型和标识符的工厂已注册,则调用工厂以创建实例并将其注册后再返回。如果没有注册实例或工厂,则会抛出异常。

  • dispose<T>([String identifier = 'DEFAULT'])

    处理一个依赖实例或工厂。T 类型参数指定依赖的类型。identifier 参数是一个可选标识符,用于处理实例或工厂。如果没有提供,则默认为 DEFAULT。如果给定类型和标识符的实例已注册,则从实例映射中移除。如果给定类型和标识符的工厂已注册,则从工厂映射中移除。

  • disposeAll()

    处理所有依赖实例和工厂。从实例映射中移除所有实例,并从工厂映射中移除所有工厂。

特性

  • ✅ 注册实例(急切),实例在注册时创建。
  • ✅ 注册工厂(懒惰),实例在第一次解析时创建。
  • ✅ 解析实例,如果存在则返回实例。
  • ✅ 处理实例或工厂,从注入器中移除实例或工厂。
  • ✅ 处理所有,从注入器中移除所有实例和工厂。

许可证

此库根据 MIT License 许可。

完整示例Demo

import 'dart:developer' as developer;

import 'package:dart_injektor/injektor.dart';

void main() {
  final Injektor injektor = Injektor();

  // 注册一个依赖实例。
  final SampleClass sampleClassInstance = SampleClass();
  injektor.register<SampleClass>(sampleClassInstance);

  // 注册一个懒加载工厂。
  injektor.lazyRegister<SampleClass>(
    () => SampleClass(type: 'factory'),
    'SAMPLE_CLASS_FACTORY_KEY',
  );

  // 解析默认实例。
  final SampleClass resolvedDefaultInstance = injektor<SampleClass>();
  developer.log('resolvedDefaultInstance.type: ${resolvedDefaultInstance.type}');

  // 解析带有标识符的实例。
  final SampleClass resolvedFactoryInstance = injektor<SampleClass>('SAMPLE_CLASS_FACTORY_KEY');
  developer.log('resolvedFactoryInstance.type: ${resolvedFactoryInstance.type}');

  // 处理实例。
  injektor.dispose<SampleClass>();

  try {
    // 尝试解析已处理的实例。
    injektor<SampleClass>();
  } on Exception catch (e) {
    developer.log('$e');
  }
}

class SampleClass {
  SampleClass({this.type = 'default'});

  final String type;
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用dart_injektor进行依赖注入的示例代码。dart_injektor是一个用于Flutter的依赖注入库,它允许你轻松地在应用的不同部分之间共享和管理依赖项。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加dart_injektor依赖:

dependencies:
  flutter:
    sdk: flutter
  dart_injektor: ^x.y.z  # 请使用最新版本号替换x.y.z

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

2. 创建依赖项

假设我们有一个简单的服务类UserService,它有一个方法getUserName来返回用户名。

// user_service.dart
class UserService {
  String getUserName() {
    return "John Doe";
  }
}

3. 配置依赖注入容器

接下来,我们需要在应用的入口点(例如main.dart)中配置dart_injektor

// main.dart
import 'package:flutter/material.dart';
import 'package:dart_injektor/dart_injektor.dart';
import 'user_service.dart';

void main() {
  // 配置依赖注入容器
  Injektor.container
    ..registerSingleton<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(),
    );
  }
}

4. 使用依赖注入

现在,我们可以在任何需要UserService的地方通过Injektor来获取它的实例。

// my_home_page.dart
import 'package:flutter/material.dart';
import 'package:dart_injektor/dart_injektor.dart';
import 'user_service.dart';

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 获取UserService实例
    final userService = Injektor.get<UserService>();

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text('User Name: ${userService.getUserName()}'),
      ),
    );
  }
}

完整示例

将上述代码片段整合到一个完整的Flutter项目中,如下所示:

pubspec.yaml

name: flutter_demo
description: A new Flutter project.

version: 1.0.0+1

environment:
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  dart_injektor: ^x.y.z  # 请使用最新版本号替换x.y.z

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  uses-material-design: true

user_service.dart

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

main.dart

import 'package:flutter/material.dart';
import 'package:dart_injektor/dart_injektor.dart';
import 'user_service.dart';
import 'my_home_page.dart';

void main() {
  Injektor.container
    ..registerSingleton<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(),
    );
  }
}

my_home_page.dart

import 'package:flutter/material.dart';
import 'package:dart_injektor/dart_injektor.dart';
import 'user_service.dart';

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final userService = Injektor.get<UserService>();

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text('User Name: ${userService.getUserName()}'),
      ),
    );
  }
}

以上代码展示了如何在Flutter项目中使用dart_injektor进行依赖注入。通过这种方式,你可以轻松地在整个应用中共享和管理依赖项。

回到顶部