Flutter插件功能探索之registry插件的使用

Flutter插件功能探索之registry插件的使用

在Flutter开发中,插件的使用可以极大地提升开发效率。本文将介绍一款名为registry的插件,它是一个轻量级的服务定位器(Service Locator),用于Dart和Flutter项目中实现依赖注入。该插件无需任何依赖,也无需代码生成,非常适合快速构建项目。


快速服务定位器

registry插件提供了一个简单易用的服务定位器,支持以下特性:

  • 支持懒加载单例模式、立即加载单例模式和懒加载工厂模式。
  • 支持复杂的依赖注入参数传递。
  • 提供便捷的方法来注册、获取、移除对象,并检查对象是否已注册。

registry


快速开始

1. 初始化服务定位器

首先,我们需要初始化Registry实例并设置调试日志打印:

print('1. Init service locator');
final sl = Registry()..debugLog = print;

2. 注册对象

接下来,我们将一个接口类型IDummyClass绑定到其实现类DummyClassImpl1。我们还可以通过params字段传递额外的参数:

print('2. Register object');
sl.put<IDummyClass>(
  (get, params) => DummyClassImpl1(params?.byName('param') ?? 'No param'),
  onDispose: (instance) => instance.dispose(),
);

3. 解析对象

通过调用get方法从服务定位器中解析对象。这里我们传递了带有参数的对象RegistrationParams.named

final params = RegistrationParams.named({'param': 'Param123'});

print('3. Resolve object');
final object = sl.get<IDummyClass>(params: params) as DummyClassImpl1;

print('4. Check the param of the resolved object: ${object.getParam()}');

4. 移除对象

当不再需要某个对象时,可以通过remove方法将其从服务定位器中移除:

print('5. Remove object');
sl.remove<IDummyClass>();

5. 检查对象状态

最后,我们可以检查该对象是否仍然注册在服务定位器中:

print('6. Check if still registered');
print(sl.isRegistered<IDummyClass>());

完整示例代码

以下是完整的代码示例:

import 'package:registry/registry.dart';

void main() {
  print('1. Init service locator');
  final sl = Registry()..debugLog = print;

  print('2. Register object');
  sl.put<IDummyClass>(
    (get, params) => DummyClassImpl1(params?.byName('param') ?? 'No param'),
    onDispose: (instance) => instance.dispose(),
  );

  final params = RegistrationParams.named({'param': 'Param123'});

  print('3. Resolve object');
  final object = sl.get<IDummyClass>(params: params) as DummyClassImpl1;

  print('4. Check the param of the resolved object: ${object.getParam()}');

  print('5. Remove object');
  sl.remove<IDummyClass>();

  print('6. Check if still registered');
  print(sl.isRegistered<IDummyClass>());
}

// Dummy classes

abstract class IDummyClass {
  void dispose();
}

class DummyClassImpl1 implements IDummyClass {
  final String _param;

  DummyClassImpl1(this._param) {
    print('Created a new instance of DummyClassImpl1.');
  }

  String getParam() => _param;

  @override
  void dispose() {
    print('Object disposed');
  }
}

其他特性

1. 注册模式

registry提供了三种注册模式:

  • 懒加载单例模式:首次调用get时创建对象。
  • 立即加载单例模式:注册时立即创建对象。
  • 懒加载工厂模式:每次调用get时都会创建新对象。
sl.put<T>(
  (get, params) => YourObject(),
  registrationMode: RegistrationMode.lazySingleton, // 可选值:lazySingleton, eagerSingleton, lazyFactory
);

2. 参数注入

参数可以通过两种方式传递:命名构造函数或列表构造函数。

命名构造函数

final paramsNamed = RegistrationParams.named({
  'first_param': 10,
  'second_param': 'Test123',
});

列表构造函数

final paramsList = RegistrationParams.list([10, 'Test123']);

3. 自动依赖解析

registry支持多层依赖自动解析。例如:

final sl = Registry()
  ..put<ThirdObject>((get, params) => ThirdObject())
  ..put<SecondObject>((get, params) => SecondObject(get()))
  ..put<FirstObject>((get, params) => FirstObject(get()));

void main() {
  final firstObject = sl.get<FirstObject>();
}

更多关于Flutter插件功能探索之registry插件的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件功能探索之registry插件的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中,registry 插件是一个用于管理插件注册的工具。它允许开发者在 Flutter 应用中动态地注册和查找插件,从而实现更灵活的插件管理。以下是对 registry 插件功能的探索和使用方法的介绍。

1. registry 插件的基本概念

registry 插件的核心思想是通过一个注册表来管理插件的实例。开发者可以在运行时将一个插件实例注册到注册表中,然后在需要时从注册表中获取该插件的实例。

2. 使用 registry 插件的基本步骤

2.1 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  registry: ^0.1.0

然后运行 flutter pub get 来获取依赖。

2.2 注册插件实例

在应用的某个地方(例如 main.dart 中),你可以注册插件实例。假设你有一个名为 MyPlugin 的插件:

import 'package:registry/registry.dart';

class MyPlugin {
  void doSomething() {
    print('Doing something...');
  }
}

void main() {
  // 注册插件实例
  Registry().register<MyPlugin>(MyPlugin());

  runApp(MyApp());
}

2.3 获取插件实例

在需要使用插件的地方,你可以通过注册表获取插件实例:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 获取插件实例
    MyPlugin myPlugin = Registry().get<MyPlugin>();

    // 使用插件
    myPlugin.doSomething();

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Registry Plugin Example'),
        ),
        body: Center(
          child: Text('Hello, World!'),
        ),
      ),
    );
  }
}

3. registry 插件的高级用法

3.1 单例模式

registry 插件默认以单例模式管理插件实例。这意味着无论你从注册表中获取多少次插件实例,返回的都是同一个实例。

MyPlugin plugin1 = Registry().get<MyPlugin>();
MyPlugin plugin2 = Registry().get<MyPlugin>();

print(identical(plugin1, plugin2)); // 输出: true

3.2 自定义注册表

你可以创建自定义的注册表实例,而不是使用全局的 Registry()。这样可以更好地控制插件的生命周期和管理范围。

var customRegistry = Registry();

customRegistry.register<MyPlugin>(MyPlugin());

MyPlugin myPlugin = customRegistry.get<MyPlugin>();

3.3 注册多个实例

你可以在注册表中注册多个同一类型的插件实例,并通过不同的标识符来区分它们。

Registry().register<MyPlugin>(MyPlugin(), name: 'plugin1');
Registry().register<MyPlugin>(MyPlugin(), name: 'plugin2');

MyPlugin plugin1 = Registry().get<MyPlugin>(name: 'plugin1');
MyPlugin plugin2 = Registry().get<MyPlugin>(name: 'plugin2');

print(identical(plugin1, plugin2)); // 输出: false
回到顶部