flutter_ohos

一、插件介绍

platform_test是一款专为OpenHarmony优化的Flutter插件,基于platform 3.1.3包开发,用于获取设备平台信息和进行平台模拟测试。该插件提供了一套完整的API,让开发者能够轻松获取设备的操作系统、处理器数量、环境变量等信息,同时支持使用FakePlatform进行单元测试和模拟不同平台环境。

核心功能

  • 获取设备的操作系统信息
  • 获取处理器数量和系统架构
  • 获取环境变量和文件路径信息
  • 支持平台模拟测试
  • 适配OpenHarmony API 9+

技术特点

  • 提供类型安全的API接口
  • 支持真实平台信息获取
  • 支持模拟平台环境进行测试
  • 简洁易用的接口设计
  • 完善的文档和示例

二、环境配置

系统要求

  • OpenHarmony API 9+
  • Flutter SDK 3.0+
  • Dart SDK >=2.19.6 ❤️.0.0

安装配置

在Flutter项目的pubspec.yaml文件中添加以下依赖配置:

dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.2
  platform_test:
    git:
      url: "https://atomgit.com/openharmony-tpc/flutter_packages.git"
      path: "ohos/platform_test"

然后执行以下命令获取依赖:

flutter pub get

三、快速开始

1. 基本用法

以下是一个简单的示例,展示如何在Flutter应用中使用platform_test插件获取设备信息:

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

class ExampleTestPage extends StatefulWidget {
  const ExampleTestPage({super.key, required this.title});

  final String title;

  
  State<ExampleTestPage> createState() => _ExampleTestPageState();
}

class _ExampleTestPageState extends State<ExampleTestPage> {
  LocalPlatform platform = LocalPlatform();

  String platformTitle = '';
  String value = '';

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
          child: Column(
        children: <Widget>[
          const SizedBox(height: 10),
          Container(
            height: 150,
            child: ListView(
              children: [
                Text(
                  platformTitle,
                  style: Theme.of(context).textTheme.titleLarge,
                  textAlign: TextAlign.center,
                ),
                Text(
                  value,
                  textAlign: TextAlign.center,
                ),
              ],
            ),
          ),
          const SizedBox(height: 10),
          Expanded(
              child: ListView(
            children: [
              MaterialButton(
                onPressed: () {
                  setState(() {
                    platformTitle = '操作系统:';
                    value = platform.operatingSystem;
                  });
                },
                color: Colors.blue,
                child: const Text('platform.operatingSystem'),
              ),
              const SizedBox(height: 10),
              MaterialButton(
                onPressed: () {
                  setState(() {
                    platformTitle = '处理器数量:';
                    value = platform.numberOfProcessors.toString();
                  });
                },
                color: Colors.blue,
                child: const Text('platform.numberOfProcessors'),
              ),
              // 更多按钮...
            ],
          )),
        ],
      )),
    );
  }
}

2. 平台模拟测试

以下是一个示例,展示如何使用FakePlatform进行平台模拟测试:

import 'package:platform/platform.dart';

class FakePlatFormTestPage {
  FakePlatFormTestPage(String title) {
    group('FakePlatform', () {
      late FakePlatform fake;
      late LocalPlatform local;

      setUp() {
        fake = FakePlatform();
        local = const LocalPlatform();
      }

      group('fromPlatform', () {
        test('复制所有属性', () {
          setUp();
          fake = FakePlatform.fromPlatform(local);
          _expectPlatformsEqual(fake, local);
        });

        test('转换属性为可变', () {
          setUp();
          fake = FakePlatform.fromPlatform(local);
          final String key = fake.environment.keys.first;

          expect(fake.environment[key]);
          fake.environment[key] = 'FAKE';
          expect(fake.environment[key]);

          expect(fake.executableArguments.length);
          fake.executableArguments.add('ARG');
          expect(fake.executableArguments.last);
        });
      });

      // 更多测试...
    });
  }

  void _expectPlatformsEqual(Platform actual, Platform expected) {
    // 验证平台属性是否相等
  }
}

四、核心API详解

LocalPlatform

LocalPlatform是platform包提供的主要类,用于获取真实的设备平台信息。

class LocalPlatform implements Platform {
  // 获取操作系统名称
  String get operatingSystem;

  // 获取操作系统版本
  String get operatingSystemVersion;

  // 获取处理器数量
  int get numberOfProcessors;

  // 获取路径分隔符
  String get pathSeparator;

  // 获取本地主机名
  String get localHostname;

  // 获取环境变量
  Map<String, String> get environment;

  // 获取可执行文件路径
  String get executable;

  // 获取解析后的可执行文件路径
  String get resolvedExecutable;

  // 获取脚本路径
  Uri get script;

  // 获取可执行文件参数
  List<String> get executableArguments;

  // 获取包配置路径
  Uri? get packageConfig;

  // 获取Dart版本
  String get version;

  // 检查stdin是否支持ANSI
  bool get stdinSupportsAnsi;

  // 检查stdout是否支持ANSI
  bool get stdoutSupportsAnsi;

  // 获取区域设置名称
  String get localeName;

  // 检查是否为Android平台
  bool get isAndroid;

  // 检查是否为Fuchsia平台
  bool get isFuchsia;

  // 检查是否为iOS平台
  bool get isIOS;

  // 检查是否为Linux平台
  bool get isLinux;

  // 检查是否为macOS平台
  bool get isMacOS;

  // 检查是否为Windows平台
  bool get isWindows;
}

FakePlatform

FakePlatform是platform包提供的类,用于模拟平台信息,主要用于测试目的。

class FakePlatform implements Platform {
  // 创建一个空的FakePlatform
  FakePlatform({
    int? numberOfProcessors,
    String? pathSeparator,
    String? operatingSystem,
    String? operatingSystemVersion,
    String? localHostname,
    Map<String, String>? environment,
    String? executable,
    String? resolvedExecutable,
    Uri? script,
    List<String>? executableArguments,
    Uri? packageConfig,
    String? version,
    bool? stdinSupportsAnsi,
    bool? stdoutSupportsAnsi,
    String? localeName,
  });

  // 从现有Platform创建FakePlatform
  factory FakePlatform.fromPlatform(Platform platform);

  // 创建FakePlatform的副本并覆盖指定属性
  FakePlatform copyWith({
    int? numberOfProcessors,
    String? pathSeparator,
    String? operatingSystem,
    String? operatingSystemVersion,
    String? localHostname,
    Map<String, String>? environment,
    String? executable,
    String? resolvedExecutable,
    Uri? script,
    List<String>? executableArguments,
    Uri? packageConfig,
    String? version,
    bool? stdinSupportsAnsi,
    bool? stdoutSupportsAnsi,
    String? localeName,
  });

  // 从JSON创建FakePlatform
  factory FakePlatform.fromJson(Map<String, dynamic> json);

  // 转换为JSON
  Map<String, dynamic> toJson();

  // 以下属性与LocalPlatform相同,但可以修改
  
  int numberOfProcessors;

  
  String pathSeparator;

  
  String operatingSystem;

  // 更多属性...
}

五、最佳实践

1. 平台信息获取

  • 在需要根据不同平台执行不同逻辑的地方使用LocalPlatform
  • 优先使用平台特定的布尔属性(如isAndroid、isIOS等)而不是直接比较operatingSystem
  • 缓存平台信息以避免重复获取

2. 单元测试

  • 在单元测试中使用FakePlatform模拟不同的平台环境
  • 使用FakePlatform.fromPlatform()创建基于真实平台的模拟,然后修改特定属性
  • 使用copyWith()方法创建多个不同的平台模拟

3. 错误处理

  • 对于可能不存在的属性(如packageConfig),使用空安全操作符
  • 处理环境变量可能为空的情况
  • 确保在不同平台上都能正常工作

六、常见问题

1. 获取不到正确的平台信息

问题:在OpenHarmony设备上获取的平台信息不正确

解决方案

  • 确保使用的platform包版本支持OpenHarmony
  • 检查是否正确初始化了LocalPlatform
  • 查看设备日志获取详细错误信息

2. 单元测试失败

问题:使用FakePlatform进行单元测试时失败

解决方案

  • 确保正确设置了FakePlatform的属性
  • 检查测试用例是否覆盖了所有可能的情况
  • 使用print语句或调试器查看FakePlatform的状态

七、总结

platform_test插件为Flutter开发者提供了一种简单而强大的方式来获取设备平台信息和进行平台模拟测试。通过使用该插件,开发者可以轻松地在OpenHarmony设备上获取各种平台信息,并在单元测试中模拟不同的平台环境。

该插件具有以下优势:

  • 提供了丰富的API接口,可以获取各种平台信息
  • 支持平台模拟测试,方便编写跨平台应用的单元测试
  • 适配OpenHarmony API 9+,可以在鸿蒙设备上正常工作
  • 代码结构清晰,易于理解和使用

无论您是想在Flutter应用中根据不同平台执行不同逻辑,还是需要编写跨平台应用的单元测试,platform_test插件都是一个理想的选择。

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐