Flutter适配器插件adapters_flutter的使用

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

Flutter适配器插件adapters_flutter的使用

开始使用

要求

sdk: '>=3.0.0 <4.0.0'
flutter: '>=3.10.0'

安装

通过Dart安装:

dart pub add adapters_flutter

通过Flutter安装:

flutter pub add adapters_flutter

兼容性

Test IT adapters_flutter
5.0 2.1.9+

使用方法

配置

以下是一些配置选项及其描述:

描述 文件属性 环境变量 命令行参数
适配器模式。默认值为0。适配器支持以下模式:
0 - 在此模式下,适配器仅发送在测试运行中找到的自动测试结果。
1 - 在此模式下,适配器将发送所有结果到测试运行。
2 - 在此模式下,适配器将创建一个新的测试运行并发送所有结果到它。
adapterMode TMS_ADAPTER_MODE tmsAdapterMode
自动创建测试用例的模式(可选)。默认值为false。适配器支持以下模式:
true - 在此模式下,适配器将创建一个与创建的自动测试关联的测试用例(而不是更新的自动测试)
false - 在此模式下,适配器不会创建测试用例。
automaticCreationTestCases TMS_AUTOMATIC_CREATION_TEST_CASES tmsAutomaticCreationTestCases
自动更新测试用例链接的模式(可选)。默认值为false。适配器支持以下模式:
true - 在此模式下,适配器将更新测试用例链接。
false - 在此模式下,适配器不会更新测试用例链接。
automaticUpdationLinksToTestCases TMS_AUTOMATIC_UPDATION_LINKS_TO_TEST_CASES tmsAutomaticUpdationLinksToTestCases
启用/禁用证书验证(可选)。默认值为true。 certValidation TMS_CERT_VALIDATION tmsCertValidation
配置文件名称。如果未提供,则使用默认文件名(可选)。 - TMS_CONFIG_FILE tmsConfigFile
在TMS实例中的配置ID。如何获取配置ID? configurationId TMS_CONFIGURATION_ID tmsConfigurationId
启用调试日志(可选)。默认值为false。 isDebug TMS_IS_DEBUG tmsIsDebug
API密钥 privateToken TMS_PRIVATE_TOKEN tmsPrivateToken
在TMS实例中的项目ID。如何获取项目ID? projectId TMS_PROJECT_ID tmsProjectId
启用/禁用TMS集成(可选)。默认值为true。 testIt TMS_TEST_IT tmsTestIt
在TMS实例中创建的测试运行ID。对于adapterMode 0或1时必需。 testRunId TMS_TEST_RUN_ID tmsTestRunId
指定TMS实例中测试运行名称的参数(可选)。如果没有提供,将自动生成。 testRunName TMS_TEST_RUN_NAME tmsTestRunName
TMS实例的URL url TMS_URL tmsUrl
文件

在项目的根目录中创建名为testit.properties的文件:

adapterMode={%ADAPTER_MODE%}
automaticCreationTestCases={%AUTOMATIC_CREATION_TESTCASES%}
automaticUpdationLinksToTestCases={%AUTOMATIC_UPDATION_LINKS_TO_TESTCASES%}
certValidation={%CERTIFICATE_VALIDATION%}
configurationId={%CONFIGURATION_ID%}
isDebug={%IS_DEBUG%}
privateToken={%USER_PRIVATE_TOKEN%}
projectId={%PROJECT_ID%}
testIt={%TEST_IT%}
testRunId={%TEST_RUN_ID%}
testRunName={%TEST_RUN_NAME%}
url={%URL%}
命令行
flutter test --dart-define=tmsAdapterMode={%ADAPTER_MODE%} --dart-define=tmsAutomaticCreationTestCases={%AUTOMATIC_CREATION_TESTCASES%} --dart-define=tmsAutomaticUpdationLinksToTestCases={%AUTOMATIC_UPDATION_LINKS_TO_TESTCASES%} --dart-define=tmsCertValidation={%CERTIFICATE_VALIDATION%} --dart-define=tmsConfigFile={%CONFIG_FILE%}  --dart-define=tmsConfigurationId={%CONFIGURATION_ID%} --dart-define=tmsIsDebug={%IS_DEBUG%} --dart-define=tmsPrivateToken={%USER_PRIVATE_TOKEN%} --dart-define=tmsProjectId={%PROJECT_ID%} --dart-define=tmsTestIt={%TEST_IT%} --dart-define=tmsTestRunId={%TEST_RUN_ID%} --dart-define=tmsTestRunName={%TEST_RUN_NAME%} --dart-define=tmsUrl={%URL%}

自动测试元数据

使用元数据指定有关自动测试的信息。

测试参数描述

  • description - 在自动测试卡片中指定的自动测试描述。
  • externalId - 唯一的内部自动测试ID(用于Test IT)。
  • links - 列在自动测试卡片中的链接。
  • tags - 列在自动测试卡片中的标签。
  • title - 在自动测试卡片中指定的自动测试名称。如果未指定,则使用测试名称。
  • workItemsIds - 一种将自动测试与手动测试关联的方法。接收一组手动测试的ID。

函数描述

  • addAttachment - 将单个附件添加到自动测试结果中。
  • addAttachments - 将多个附件添加到自动测试结果中。
  • addLink - 将单个链接添加到自动测试结果中。
  • addLinks - 将多个链接添加到自动测试结果中。
  • addMessage - 将消息添加到自动测试结果中。

步骤描述

  • step - 实现自动测试步骤。

示例代码

以下是一个完整的示例代码:

#!/usr/bin/env dart

[@Tags](/user/Tags)(['suite_tag'])
import 'package:adapters_flutter/adapters_flutter.dart';
import 'package:universal_io/io.dart';

void main() {
  group('example group', () {
    setUpAll(() async {
      HttpOverrides.global = null;

      await step('setup all step', () {
        expect(0, 0);
      });
    });

    setUp(() async {
      await step('setup step', () {
        expect(0, 0);
      });
    });

    tmsTest('example test',
        externalId: 'example_externalId',
        links: {Link('https://www.example.org/')},
        tags: {'example_tag'},
        title: 'example_title',
        workItemsIds: {'47100'}, () async {
      await step('success step', () {
        expect(0, 0);
      });

      await step('success step with attachment', () async {
        await addAttachment('avatar.png');
      });

      await step('success step with link', () async {
        await addLink('https://www.example.org/');
      });

      await step('success step with message', () async {
        await addMessage('example message');
      });

      final actual = await step('success step with return value', () {
        return 0;
      });

      expect(actual, 0);

      await step('success root step', () async {
        await step('success child step', () {
          expect(0, 0);
        });
      });

      await step('failed step', () {
        throw Exception('example exception.');
      });
    });

    tmsTestWidgets('example widgets test',
        externalId: 'example_widgets_externalId',
        links: {Link('https://www.example.org/')},
        tags: {'example_tag_widgets'},
        title: 'example_title_widgets',
        workItemsIds: {'47100'}, (tester) async {
      await step('success step', () {
        expect(0, 0);
      });

      await step('success step with attachment', () async {
        await addAttachment('avatar.png');
      });

      await step('success step with link', () async {
        await addLink('https://www.example.org/');
      });

      await step('success step with message', () async {
        await addMessage('example message');
      });

      final actual = await step('success step with return value', () {
        return 0;
      });

      expect(actual, 0);

      await step('success root step', () async {
        await step('success child step', () {
          expect(0, 0);
        });
      });

      await step('failed step', () {
        throw Exception('example exception.');
      });
    });

    tearDown(() async {
      await step('teardown step', () {
        expect(0, 0);
      });
    });

    tearDownAll(() async {
      await step('teardown all step', () {
        expect(0, 0);
      });
    });
  });
}

更多关于Flutter适配器插件adapters_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter适配器插件adapters_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中,使用适配器插件(如adapters_flutter)通常是为了将原生平台(iOS和Android)的特定功能或数据格式适配到Flutter层。不过,需要注意的是,adapters_flutter并不是一个官方的或广泛认可的Flutter插件名称,可能是一个自定义或特定项目的插件。因此,我将给出一个通用的适配器插件使用示例,你可以根据具体插件的文档进行调整。

假设我们有一个自定义的Flutter插件my_adapters_flutter,它提供了对原生平台功能的访问。以下是如何在Flutter项目中集成和使用这个插件的示例。

1. 添加插件依赖

首先,你需要在pubspec.yaml文件中添加插件依赖。如果插件已经在Pub仓库中发布,你可以这样添加:

dependencies:
  flutter:
    sdk: flutter
  my_adapters_flutter: ^x.y.z  # 替换为实际的版本号

如果插件是私有的或者还没有发布到Pub仓库,你可能需要配置.pub-cache或使用其他方式将其包含在你的项目中。

2. 导入插件

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

import 'package:my_adapters_flutter/my_adapters_flutter.dart';

3. 使用插件

假设my_adapters_flutter插件提供了一个方法来获取原生平台的数据,并将其转换为Flutter可以使用的格式。下面是一个简单的使用示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Adapter Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String platformData = 'Loading...';

  @override
  void initState() {
    super.initState();
    // 调用插件方法来获取平台数据
    _fetchPlatformData();
  }

  Future<void> _fetchPlatformData() async {
    try {
      // 假设插件提供了一个名为fetchData的方法
      String data = await MyAdaptersFlutter.fetchData();
      // 更新UI
      setState(() {
        platformData = data;
      });
    } catch (e) {
      // 处理错误
      print('Error fetching platform data: $e');
      setState(() {
        platformData = 'Error fetching data';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Adapter Example'),
      ),
      body: Center(
        child: Text(platformData),
      ),
    );
  }
}

4. 原生平台实现

在原生平台(iOS和Android)上,你需要实现插件的接口。这通常涉及到创建插件的MethodChannel,并在原生代码中处理从Flutter层传来的方法调用。

iOS:

import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

class MyAdaptersFlutterPlugin: NSObject, FlutterPlugin {
  public static func register(with registrar: FlutterPluginRegistrar) {
    let channel = FlutterMethodChannel(name: "my_adapters_flutter", binaryMessenger: registrar.messenger())
    let instance = MyAdaptersFlutterPlugin()
    instance.setup(channel: channel, registrar: registrar)
  }

  private func setup(channel: FlutterMethodChannel, registrar: FlutterPluginRegistrar) {
    channel.setMethodCallHandler({
      (call: FlutterMethodCall, result: @escaping FlutterResult) in
      if call.method == "fetchData" {
        // 在这里获取平台数据并返回给Flutter
        let platformData = "Hello from iOS!"
        result(platformData)
      } else {
        result(FlutterMethodNotImplemented)
      }
    })
  }
}

Android:

import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;
import androidx.annotation.NonNull;

public class MainActivity extends FlutterActivity {
    private static final String CHANNEL = "my_adapters_flutter";

    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
                .setMethodCallHandler(
                        (call, result) -> {
                            if (call.method.equals("fetchData")) {
                                // 在这里获取平台数据并返回给Flutter
                                String platformData = "Hello from Android!";
                                result.success(platformData);
                            } else {
                                result.notImplemented();
                            }
                        }
                );
    }
}

以上代码是一个基本的示例,展示了如何在Flutter项目中集成和使用一个自定义的适配器插件。根据adapters_flutter插件的实际API和文档,你可能需要对代码进行调整。

回到顶部