Flutter依赖注入插件injectfy的使用

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

Flutter依赖注入插件injectfy的使用

🚀 Injectfy简介

Injectfy 是一个为Dart设计的极简且易于使用的依赖注入库,用于管理单例和工厂模式。它使得在Flutter项目中管理对象的创建和生命周期变得非常简单。

🌟 功能特性

  • ✅ 注册单例和工厂来管理依赖。
  • 🔄 自动解析并注入依赖。
  • ❌ 简单地注销不再需要的依赖。
  • ⚡ 缓存频繁访问的实例以提高性能。
  • 🛠️ 适用于生产环境和测试(支持mock)。

📦 安装

在您的pubspec.yaml文件中添加以下依赖:

dependencies:
  injectfy: ^1.0.1

然后运行命令安装依赖:

flutter pub get

🚀 快速上手

📋 基本用法

以下是Injectfy的基本使用方法:

import 'package:injectfy/injectfy.dart';

void main() {
  // 获取Injectfy实例
  final injectfy = Injectfy.instance;

  // 注册单例
  injectfy.registerSingleton<SomeService>(() => SomeService());

  // 注册工厂
  injectfy.registerFactory<ClientsRepository>(() => ClientsRepositoryImpl());

  // 解析依赖
  final someService = injectfy.get<SomeService>();
  final clientsRepository = injectfy.get<ClientsRepository>();

  print(someService);  // 输出: Instance of 'SomeService'
  print(clientsRepository);  // 输出: Instance of 'ClientsRepositoryImpl'
}

🧱 注册单例

单例模式下,类只会被实例化一次,并在每次请求时重用相同的实例。

class SomeService {
  void doSomething() => print("Doing something...");
}

void main() {
  final injectfy = Injectfy.instance;

  injectfy.registerSingleton<SomeService>(() => SomeService());

  final service1 = Injectfy.get<SomeService>();
  final service2 = Injectfy.get<SomeService>();

  print(identical(service1, service2));  // 输出: true
}

🏢 注册工厂

工厂模式允许每次请求时创建一个新的实例。

class UserRepository {}

void main() {
  final injectfy = Injectfy.instance;

  injectfy.registerFactory<UserRepository>(() => UserRepository());

  final repo1 = Injectfy.get<UserRepository>();
  final repo2 = Injectfy.get<UserRepository>();

  print(identical(repo1, repo2));  // 输出: false
}

🧐 自动解析依赖

当调用方法时,可以自动解析依赖关系。

class SomeService {
  final SomeDependency _someDependency;

  SomeService(this._someDependency);
}

void main() {
  final injectfy = Injectfy.instance;

  injectfy.registerSingleton<SomeService>(() => SomeService(injectfy()));
}

🛠️ 注销依赖

如果不再需要某个依赖,可以通过unregister方法将其注销。

void main() {
  final injectfy = Injectfy.instance;

  injectfy.registerSingleton<SomeService>(() => SomeService());

  injectfy.unregister<SomeService>();

  try {
    final service = Injectfy.get<SomeService>();
  } catch (e) {
    print(e);  // 输出: Dependency of type SomeService not found.
  }
}

🧪 注册Mock依赖(适用于测试)

为了测试目的,可以用模拟对象替换实际依赖。

void main() {
  final injectfy = Injectfy.instance;

  final mockService = SomeService();
  injectfy.registerMock<SomeService>(mockService);

  final service = Injectfy.get<SomeService>();
  print(service == mockService);  // 输出: true
}

🖊️ API参考

方法 描述
instance 获取Injectfy的单例实例。
I 获取实例的简化语法。
registerSingleton<T> 为指定类型T注册单例。
registerFactory<T> 为指定类型T注册工厂。
get<T> 解析并返回类型T的实例。
call<T> 自动解析并返回类型T的实例。
unregister<T> 注销类型T的依赖。
registerMock<T> 注册模拟对象代替真实依赖。

🧪 测试

通过注册mock依赖来进行单元测试是十分方便的。

import 'package:test/test.dart';

void main() {
  test('Singleton works correctly', () {
    Injectfy.I.registerSingleton<SomeService>(() => SomeService());

    final service1 = Injectfy.get<SomeService>();
    final service2 = Injectfy.get<SomeService>();

    expect(identical(service1, service2), true);
  });

  test('Factory works correctly', () {
    Injectfy.I.registerFactory<UserRepository>(() => UserRepository());

    final repo1 = Injectfy.get<UserRepository>();
    final repo2 = Injectfy.get<UserRepository>();

    expect(identical(repo1, repo2), false);
  });

  test('Mock registration works correctly', () {
    final mockService = SomeService();
    Injectfy.I.registerMock<SomeService>(mockService);

    final service = Injectfy.get<SomeService>();

    expect(service, mockService);
  });
}

示例代码

这里提供了一个完整的示例,展示了如何在Flutter应用中使用Injectfy进行依赖注入。

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

// 模拟的服务类
class SomeService {
  void doSomething() => print("Doing something...");
}

// 主函数入口
void main() {
  // 初始化依赖注入容器
  Inject.inject();

  runApp(MyApp());
}

// 应用根组件
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Injectfy Example',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: HomePage(),
    );
  }
}

// 首页组件
class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 从注入容器中获取服务实例
    final someService = Inject.get<SomeService>();

    return Scaffold(
      appBar: AppBar(title: Text('Injectfy Example')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            someService.doSomething();
          },
          child: Text('Do Something'),
        ),
      ),
    );
  }
}

以上就是关于Injectfy的详细介绍和使用示例,希望对您有所帮助!如果您有任何问题或建议,请随时提出。


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

1 回复

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


当然,以下是一个关于如何在Flutter中使用injectfy插件进行依赖注入的代码案例。injectfy是一个轻量级的依赖注入库,可以帮助你管理应用程序中的依赖关系。

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

dependencies:
  flutter:
    sdk: flutter
  injectfy: ^最新版本号  # 请替换为实际的最新版本号

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

1. 定义依赖项

创建一个简单的依赖项类,例如一个服务类:

// services/api_service.dart
import 'package:injectfy/injectfy.dart';

@Injectable()
class ApiService {
  String fetchData() {
    return "Hello from API!";
  }
}

2. 创建依赖注入容器

在你的应用程序的入口文件(通常是main.dart)中,初始化依赖注入容器:

// main.dart
import 'package:flutter/material.dart';
import 'package:injectfy/injectfy.dart';
import 'services/api_service.dart';

void main() {
  // 初始化依赖注入容器
  final container = InjectfyContainer();
  
  // 注册依赖项
  container.registerSingleton<ApiService>(ApiService());

  // 使用依赖注入容器获取依赖项
  final apiService = container.get<ApiService>();
  print(apiService.fetchData());  // 输出: Hello from API!

  runApp(MyApp(container: container));
}

class MyApp extends StatelessWidget {
  final InjectfyContainer container;

  MyApp({required this.container});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 在这里你可以通过某种方式获取到container,然后获取依赖项
    // 例如,通过Provider传递container
    // 这里为了简单起见,我们直接在build方法中获取(实际开发中不推荐这样做)
    final InjectfyContainer container = Provider.of<InjectfyContainer>(context, listen: false);
    final ApiService apiService = container.get<ApiService>();

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Injectfy Example'),
      ),
      body: Center(
        child: Text(apiService.fetchData()),
      ),
    );
  }
}

注意:在上面的代码中,我们直接在MyHomePagebuild方法中通过Provider获取container,这在实际开发中是不推荐的,因为它违反了依赖注入的原则。更好的做法是使用Provider在应用程序的更高层次管理container,然后在需要的地方通过Provider.of<T>(context)获取。

3. 使用Provider管理依赖注入容器

为了改进上面的代码,我们可以使用Provider来管理container

// main.dart (改进版)
import 'package:flutter/material.dart';
import 'package:injectfy/injectfy.dart';
import 'package:provider/provider.dart';
import 'services/api_service.dart';

void main() {
  final container = InjectfyContainer();
  container.registerSingleton<ApiService>(ApiService());

  runApp(
    MultiProvider(
      providers: [
        Provider<InjectfyContainer>.value(value: container),
      ],
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final InjectfyContainer container = Provider.of<InjectfyContainer>(context);
    final ApiService apiService = container.get<ApiService>();

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Injectfy Example'),
      ),
      body: Center(
        child: Text(apiService.fetchData()),
      ),
    );
  }
}

在这个改进版中,我们使用MultiProvider在应用程序的根级别提供了InjectfyContainer,然后在需要的地方通过Provider.of<T>(context)获取它。这样做更符合依赖注入的最佳实践。

希望这个代码案例能帮助你理解如何在Flutter中使用injectfy进行依赖注入。

回到顶部