Flutter依赖注入插件tiny_locator的使用

Flutter依赖注入插件tiny_locator的使用

Tiny服务定位器提供了全局访问服务的入口。它可以与tiny_react结合,成为Flutter中的一个微型状态管理库。

它是一个非常小的库,少于100行代码(不包括注释),因此任何人都可以轻松理解其工作原理。

特性

  • 查找服务
  • 层次化作用域

正如名称所暗示的,小巧是我们的一大卖点,因此我们不计划在未来添加主要功能,但可能会添加一些只需要少量修复的功能。

开始使用

最简单的使用方式如下:

import 'package:tiny_locator/tiny_locator.dart';

void main() {
  // 注册
  locator.add(() => 'abc');
  // 查找
  print(locator.get<String>());
}

ServiceLocator类是一个单例,对象被分配给全局变量locator

使用方法

以单例形式注册

立即创建并注册唯一对象。通过get获取时将返回相同对象。

locator.add(() => Controller());

以延迟创建形式注册

对象将在使用get获取时创建。之后,每次获取都将返回相同对象。

locator.add(() => Controller(), lazy: true);

以每次创建形式注册

每次通过get获取时都会创建新对象。

locator.add(() => Controller(), singleton: false);

以带标签的形式注册

如果注册了相同的类,将会被覆盖。若要注册为不同实例,请添加tag

locator.add(() => Controller(), tag: 'abc');

查找服务

通过指定类型和tag来查找服务。如果没有注册服务,则会抛出异常。还可以使用contains来判断服务是否已注册。

if (locator.contains<Controller>()) {
  locator.get<Controller>();
}

if (locator.contains<Controller>(tag: 'abc')) {
  locator.get<Controller>(tag: 'abc');
}

删除服务

可以像get一样删除服务。

if (locator.remove<Controller>()) {
  print('deleted');
};

locator.remove<Controller>(tag: 'abc');

作用域

ServiceLocator类以层次结构保留ServiceContainer的实现。可以使用poppush从层次结构中添加和移除ServiceContainer,并用作作用域。主要用于与Flutter的Navigator结合使用。

// 在根作用域中注册
locator.add(() => ClassA());

// 创建新作用域
locator.push();

// 在新作用域中注册
locator.add(() => ClassB());

// 可以找到ClassA和ClassB
locator.get<ClassA>();
locator.get<ClassB>();

// 销毁当前作用域
locator.pop();

// 现在只能找到ClassA
locator.get<ClassA>();
locator.get<ClassB>(); // 异常!

tiny_react

tiny_react是对ValueNotifierValueListenableBuilder的语法糖。与tiny_locator结合使用时,可成为Flutter的微型状态管理方法。

import 'package:flutter/material.dart';
import 'package:tiny_locator/tiny_locator.dart';
import 'package:tiny_react/tiny_react.dart';

class MyController {
  final num = 0.notif;
  final list = <int>[].notif;

  void doSomething() {
    num.value++;
    if (num.value % 2 == 0) {
      list
        ..value.add(num.value)
        ..notifyListeners();
    }
  }
}

void main() {
  locator.add(() => MyController());
  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyPage(),
    );
  }
}

class MyPage extends StatelessWidget {
  final controller = locator.get<MyController>();

  MyPage({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('MyPage')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            controller.num.build((val) => Text('$val')),
            controller.list.build((val) => Text('$val')),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => controller.doSomething(),
        child: const Icon(Icons.add),
      ),
    );
  }
}

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

1 回复

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


tiny_locator 是一个轻量级的依赖注入(DI)库,适用于 Flutter 应用。它可以帮助你管理和注入依赖项,使你的代码更加模块化和易于测试。以下是如何在 Flutter 项目中使用 tiny_locator 的步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  tiny_locator: ^1.0.0  # 请检查最新版本

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

2. 创建服务

假设你有一个服务类 MyService,你希望将其注入到你的应用中:

class MyService {
  void doSomething() {
    print('Doing something!');
  }
}

3. 注册服务

在应用的入口点(通常是 main.dart 文件),使用 tiny_locator 来注册这个服务:

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

void main() {
  // 注册服务
  locator.registerSingleton<MyService>(MyService());

  runApp(MyApp());
}

4. 获取并使用服务

在需要使用 MyService 的地方,你可以通过 locator.get<T>() 来获取该服务:

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 获取服务
    final myService = locator.get<MyService>();

    return Scaffold(
      appBar: AppBar(
        title: Text('Tiny Locator Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 使用服务
            myService.doSomething();
          },
          child: Text('Press Me'),
        ),
      ),
    );
  }
}

5. 运行应用

现在你可以运行你的应用,点击按钮时,MyServicedoSomething 方法将会被调用。

6. 其他注册方式

tiny_locator 还支持其他注册方式,例如:

  • 注册工厂:每次获取时都会创建一个新的实例:

    locator.registerFactory<MyService>(() => MyService());
    
  • 注册懒加载的单例:只有在第一次获取时才会创建实例:

    locator.registerLazySingleton<MyService>(() => MyService());
    

7. 清除注册

如果你需要在某些情况下清除所有的注册,可以使用:

locator.reset();
回到顶部