开发 Dart Package

纯 Dart Package 仅含 Dart 代码、不依赖原生平台实现,无需 OpenHarmony 适配即可在 ohos 平台直接运行,是跨平台复用性最高的一类 package。


创建 Package

flutter create --template=package hello

生成目录结构:

hello/
├── lib/                # 公开代码
│   └── hello.dart      # 入口文件(与 package 同名)
├── test/               # 单元测试
│   └── hello_test.dart
├── CHANGELOG.md        # 版本变更记录
├── LICENSE             # 许可证
├── README.md           # 说明文档
└── pubspec.yaml        # 元数据与依赖声明

纯 Dart package 不生成 ohos/android/ios/ 等原生目录,也不在 pubspec.yaml 中声明 flutter.plugin 字段。


实现 Package

lib/ 下编写 Dart 代码。

示例(lib/hello.dart):

class Hello {
  static String greet(String name) => 'Hello, $name!';
}

配套单元测试放在 test/ 下:

// test/hello_test.dart
import 'package:flutter_test/flutter_test.dart';
import 'package:hello/hello.dart';

void main() {
  test('greet returns greeting message', () {
    expect(Hello.greet('OHOS'), 'Hello, OHOS!');
  });
}
flutter test

在 ohos 设备上验证

纯 Dart package 不能独立运行,需通过宿主应用验证。--template=package 不生成 example/,按以下步骤手动创建。

第一步:创建示例 App

在 package 目录下创建一个 ohos 平台的 Flutter 应用:

cd hello
flutter create --platforms=ohos example

第二步:引用 package 并编写验证代码

example/pubspec.yaml 中以本地路径依赖引入 package:

dependencies:
  flutter:
    sdk: flutter
  hello:
    path: ../

example/lib/main.dart 中调用 package 接口:

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Text(Hello.greet('OHOS')),
        ),
      ),
    );
  }
}

第三步:运行到 ohos 设备

cd example
flutter pub get
flutter run -d <device-id> --debug

平台判断代码适配

纯 Dart package 不依赖原生实现,但若内部包含平台判断逻辑(如按平台返回不同样式、使用不同第三方库分支)且缺少 ohos 分支,运行时会落入错误的 else 分支,导致异常行为。

问题示例

if (Platform.isAndroid) {
  return androidStyle();
} else {
  return iosStyle(); // ohos 设备会错误执行此处
}

适配方式:为 ohos 补充对应分支,推荐使用 defaultTargetPlatform

import 'package:flutter/foundation.dart';

if (defaultTargetPlatform == TargetPlatform.android) {
  return androidStyle();
} else if (defaultTargetPlatform == TargetPlatform.ohos) {
  return ohosStyle(); // 或复用 androidStyle()
} else {
  return iosStyle();
}

常见问题

纯 Dart package 需要在 pubspec.yaml 中声明 ohos 平台支持吗?

不需要。纯 Dart package 不声明 flutter.plugin 字段,代码跨平台通用,ohos 可直接运行。仅插件(plugin)才需在 pubspec.yamlflutter.plugin.platforms 中声明 ohos

在 Android/iOS 上运行正常的纯 Dart 库,在 ohos 上也能正常运行吗?

通常可以。但若库内部包含平台判断逻辑而缺少 ohos 分支,可能落入错误的 else 分支导致异常。请按 平台判断代码适配 检查并补充 ohos 分支。

如何判断一个库是纯 Dart package 还是插件?

查看 pubspec.yaml 是否包含 flutter.plugin 声明,或检查源码是否包含 android/ios/ohos/ 等原生平台目录。有则为插件,无则为纯 Dart 库。