Flutter依赖注入插件minimal_di的使用

Flutter依赖注入插件minimal_di的使用

Flutter 的 minimal_di 插件是一个轻量级的依赖注入工具包。它提供了简单的 API 来管理对象的注册、获取和生命周期。

仅有的6个简单特性

abstract class IDependencyInjection
{
  bool isRegistered<T extends Object>({String? named}); // 检查是否已注册
  void register<T extends Object>(T instance, {String? named}); // 注册实例
  void registerLazy<T extends Object>(Future<T> Function() func, {String? named}); // 注册延迟加载实例
  void change<T extends Object>(T instance, {String? named}); // 更改已注册的实例
  T get<T extends Object>({String? named}); // 获取实例
  Future<T> getAsync<T extends Object>({String? named}); // 异步获取实例
}

使用方法

示例代码

// 延迟加载一个整数
Future<int> initNumber(String number) async {
  var parsed = int.tryParse(number);
  parsed ??= 1; // 如果解析失败,则默认值为1
  await Future.delayed(Duration(seconds: parsed)); // 模拟异步操作
  return parsed;
}

void main() async {
  // 初始化 minimal_di 实例
  DI.instance.registerLazy<int>(() => initNumber("1"), named: "one");

  // 异步获取注册的实例
  var one = await DI.instance.getAsync<int>(named: "one");

  // 断言结果是否为1
  assert(one == 1);
}

说明

  1. registerLazy 方法
    使用 registerLazy 方法可以注册一个延迟加载的实例。这里我们传递了一个返回 Future<int> 的函数,并为其命名 "one"

  2. getAsync 方法
    使用 getAsync 方法可以异步获取之前注册的实例。这里我们通过名称 "one" 获取之前注册的实例。

  3. 默认命名规则
    如果未传递 named 参数,则默认使用类型名(即 runtimeType.toString())作为名称。

完整示例代码

import 'package:minimal_di/minimal_di.dart';

void main() async {
  // 注册延迟加载的实例
  DI.instance.registerLazy<int>(() => initNumber("1"), named: "one");

  // 异步获取实例并断言
  var one = await DI.instance.getAsync<int>(named: "one");
  assert(one == 1);

  print("One is: $one"); // 输出: One is: 1
}

// 延迟加载函数
Future<int> initNumber(String number) async {
  var parsed = int.tryParse(number);
  parsed ??= 1;
  await Future.delayed(Duration(seconds: parsed));
  return parsed;
}

运行上述代码后,您将看到控制台输出:

One is: 1

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

1 回复

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


minimal_di 是一个轻量级的依赖注入(Dependency Injection, DI)插件,适用于 Flutter 项目。它提供了简单的方式来管理依赖关系,并且能够帮助你在应用程序中实现松耦合的代码设计。

安装 minimal_di

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

dependencies:
  flutter:
    sdk: flutter
  minimal_di: ^0.1.0

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

使用 minimal_di

1. 创建一个依赖注入容器

import 'package:minimal_di/minimal_di.dart';

void main() {
  final di = MinimalDI();
  
  // 注册依赖
  di.registerSingleton<MyService>(MyService());
  
  // 运行应用程序
  runApp(MyApp());
}

2. 注册依赖

你可以使用 registerSingletonregisterFactoryregisterLazySingleton 来注册依赖。

  • Singleton: 单例模式,整个应用程序生命周期中只创建一个实例。
  • Factory: 每次请求时都会创建一个新的实例。
  • Lazy Singleton: 单例模式,但只在第一次请求时创建实例。
di.registerSingleton<MyService>(MyService());
di.registerFactory<MyService>(() => MyService());
di.registerLazySingleton<MyService>(() => MyService());

3. 获取依赖

你可以使用 get<T>() 方法来获取已注册的依赖。

final myService = di.get<MyService>();

4. 在 Widget 中使用依赖注入

你可以通过 MinimalDI 容器在 Widget 中获取依赖。

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final myService = MinimalDI().get<MyService>();
    
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Minimal DI Example'),
        ),
        body: Center(
          child: Text(myService.getMessage()),
        ),
      ),
    );
  }
}

5. 完整的示例

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

class MyService {
  String getMessage() {
    return 'Hello from MyService!';
  }
}

void main() {
  final di = MinimalDI();
  
  // 注册依赖
  di.registerSingleton<MyService>(MyService());
  
  // 运行应用程序
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final myService = MinimalDI().get<MyService>();
    
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Minimal DI Example'),
        ),
        body: Center(
          child: Text(myService.getMessage()),
        ),
      ),
    );
  }
}
回到顶部