Flutter未知功能插件gate的探索使用

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

Flutter未知功能插件gate的探索使用

Gate

Dart/Flutter依赖注入生成器

flutter锚定引导屏幕
pubdev ci License: MIT

动机

提供服务应与页面或其他代码独立。依赖注入模式将创建服务类对象的责任从客户端类中分离出来。此外,使用代码生成可以消除样板代码。

特性

  • 将可注入类作为单例提供
  • 将可注入类作为动态服务提供
  • 将一个可注入类注入到另一个类中

开始使用

pubspec.yaml文件中安装gate及其构建工具:

dependencies:
  build_runner: ^X.X.X
  gate: ^X.X.X

dev_dependencies:
  gate_generator: ^X.X.X

替换X.X.Xpub.dev上的最新版本。

使用

1 - 创建要注入的类

import 'package:gate/gate.dart';

@Injectable()
class CoffeeService {
  final S1 s1;

  CoffeeService._(this.s1);

  @Singleton()
  factory CoffeeService.simple(S1 s1) => CoffeeService._(s1);

  void pump() {
    print("CoffeeService it's working");
  }
}

你只需要:

  • 在你的类上添加@Injectable()注解。
  • 在工厂方法上添加@Singleton()@Provide()注解。

2 - 注入依赖

现在我们可以使用@Inject注解来注入我们的可注入类。

InjectedChild使用:

  • 要注入的类型
  • 要使用的工厂名称(你可以有多个提供的工厂)
  • 属性名称(以防你想重命名它或使其私有)
import 'package:gate_example/gate/gate_provider.dart';
import 'package:gate_example/gate/coffee_service.dart';
part 'coffee_page.gate_inject.g.part';

@Inject(children: [
  InjectedChild(S1, factoryName: "build"),
  InjectedChild(CoffeeService, factoryName: "simple", attrName: "coffeeService"),
])
class CoffeePage extends StatelessWidget {
  const CoffeePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    coffeeService.pump();
    return Container();
  }
}

你可以向你的类注入任意数量的依赖项,只要它们都是可注入的。

part 'coffee_page.gate_inject.g.part'; 将被添加到你的文件中。 这个文件将在下一步自动生成。 别忘了导入自动生成的gate_provider.dart文件。

3 - 生成代码

使用构建运行器可以在你的shell中运行命令:

flutter packages pub run build_runner build --delete-conflicting-outputs

一旦构建运行器完成,你就可以运行你的Flutter应用并使用所有注入的类。

如果你更改了工厂或想注入其他类…只需重新运行构建运行器。

属性

注解 描述
Injectable 标记一个类包含单例或提供工厂
Singleton 标记一个工厂为单例可注入类
Provide 标记一个工厂为动态可注入类。每次注入都会创建该类的新实例
Inject 标记一个类用于注入依赖

Inject 注解

属性 描述
children InjectedChild 列表

InjectedChild 注解

属性 描述
type 要注入的类型
factoryName 要使用的工厂名称
attrName (可选)从你的类中调用的属性名称

为测试模拟注入的依赖

为了替换服务为模拟,你必须在测试之前设置它们。Gate会为你生成所有方法。

首先,使用你喜欢的库声明你的模拟服务。

然后,使用appProvider设置模拟。

最后,别忘了通过将其设置为null来重置模拟。

class CoffeeServiceMock extends Mock implements CoffeeService {}

class S1ServiceMock extends Mock implements S1 {}

class S2BServiceMock extends Mock implements S2B {}

class TodoServiceMock extends Mock implements TodoService {}

void main() {
  // 初始化模拟
  final CoffeeService coffeeServiceMock = CoffeeServiceMock();
  final S1 s1ServiceMock = S1ServiceMock();
  final S2B s2BServiceMock = S2BServiceMock();
  final TodoService todoServiceMock = TodoServiceMock();

  group('模拟注入组', () {
    setUp(() {
      when(() => coffeeServiceMock.getMenu()).thenReturn("Best menu");
      // 使用模拟设置注入的服务
      appProvider.setCoffeeServiceSimpleMock(coffeeServiceMock);
      appProvider.setS1BuildMock(s1ServiceMock);
      appProvider.setS2BBuildMock(s2BServiceMock);
      appProvider.setTodoServiceBeanMock(todoServiceMock);
    });

    tearDownAll(() {
      // 从appProvider中移除模拟(实际的会被使用)
      appProvider.setCoffeeServiceSimpleMock(null);
      appProvider.setS1BuildMock(null);
      appProvider.setS2BBuildMock(null);
      appProvider.setTodoServiceBeanMock(null);
    });

    test('测试模拟注入', () async {
      expect(appProvider.getCoffeeServiceSimple().getMenu(), equals('Best menu')); // 模拟返回值

      appProvider.setCoffeeServiceSimpleMock(null);

      expect(appProvider.getCoffeeServiceSimple().getMenu(), equals('No menu')); // 真实值(未模拟)
    });
  });
}

运行测试

dart pub global activate coverage
dart test --coverage="coverage"
format_coverage --lcov --in=coverage --out=coverage.lcov --packages=.packages --report-on=lib

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

1 回复

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


在探索和使用Flutter中的未知功能插件(如假设的gate插件)时,重要的是首先查阅该插件的官方文档或源代码,以确保对其功能和用法有准确的理解。由于gate并非一个广为人知的Flutter插件,且Flutter社区和官方插件库中并未直接提及此名称,我将提供一个假设性的代码示例,展示如何集成和使用一个假想的Flutter插件。

请注意,以下代码是基于假设的,实际使用时需要根据gate插件的真实API进行调整。

假设的gate插件使用示例

1. 添加依赖

首先,在pubspec.yaml文件中添加对gate插件的依赖(假设它存在于某个仓库中):

dependencies:
  flutter:
    sdk: flutter
  gate: ^0.0.1  # 假设的版本号

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

2. 导入插件

在你的Dart文件中导入gate插件:

import 'package:gate/gate.dart';

3. 初始化并使用插件

假设gate插件提供了一个用于检查某些“门”(可能是功能开关或权限检查)状态的方法。以下是一个假设性的使用示例:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool isGateOpen = false;

  @override
  void initState() {
    super.initState();
    // 假设有一个方法用于检查“门”的状态
    _checkGateStatus();
  }

  Future<void> _checkGateStatus() async {
    try {
      // 假设Gate类有一个静态方法checkStatus,返回一个Future<bool>
      bool status = await Gate.checkStatus();
      setState(() {
        isGateOpen = status;
      });
    } catch (e) {
      print('Error checking gate status: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Gate Plugin Example'),
        ),
        body: Center(
          child: Text(
            isGateOpen ? 'The gate is open!' : 'The gate is closed.',
            style: TextStyle(fontSize: 24),
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () async {
            // 假设有一个方法可以切换“门”的状态
            bool newStatus = await Gate.toggleStatus();
            setState(() {
              isGateOpen = newStatus;
            });
          },
          tooltip: 'Toggle Gate',
          child: Icon(isGateOpen ? Icons.lock_open : Icons.lock),
        ),
      ),
    );
  }
}

注意事项

  1. 文档和API参考:实际使用时,务必查阅gate插件的官方文档和API参考,以确保正确理解和使用该插件。
  2. 错误处理:在调用插件方法时,添加适当的错误处理逻辑,以处理可能的异常情况。
  3. 权限和配置:如果gate插件涉及特定的权限或配置,请确保在AndroidManifest.xmlInfo.plist或其他相关配置文件中进行必要的设置。

由于gate插件的具体实现和API未知,上述代码仅为示例性质。在实际项目中,应根据插件的实际文档和API进行调整。

回到顶部