HarmonyOS鸿蒙Next中已有flutter项目如何适配,有没有好的步骤具体的实现方案

HarmonyOS鸿蒙Next中已有flutter项目如何适配,有没有好的步骤具体的实现方案 有如下具体诉求,麻烦帮忙解答:

  1. 已有flutter项目如何适配鸿蒙,有没有好的步骤具体的实现方案?
  2. 想在Flutter适配鸿蒙的代码中实现设置全屏模式,如何实现?
  3. 具体DevEco Studio版本信息: cke_3550.png
  4. 用的flutter版本信息:https://gitcode.com/openharmony-tpc/flutter_flutter/tree/oh-3.27.4-dev
  5. 具体报错信息和错误写法: PlatformPlugin.ets文件: cke_3297.png EntryAbility.ets文件: cke_4116.png

更多关于HarmonyOS鸿蒙Next中已有flutter项目如何适配,有没有好的步骤具体的实现方案的实战教程也可以访问 https://www.itying.com/category-92-b0.html

5 回复

开发者您好,针对Flutter适配鸿蒙的代码中实现设置全屏模式,可以采取以下方式解决:

思路:Flutter侧发消息 → ArkTS侧插件接收 → 调用HarmonyOS窗口 API → 结果回传Flutter侧。

  1. 创建ArkTS侧插件。 在HarmonyOS项目entry模块下新建插件文件src/main/ets/entryability/FullScreenPlugin.ets
import {
  FlutterManager,
  FlutterPlugin,
  Log,
  MethodCall,
  MethodChannel,
} from '@ohos/flutter_ohos';
import { FlutterPluginBinding } from '@ohos/flutter_ohos/src/main/ets/embedding/engine/plugins/FlutterPlugin';
import { MethodResult } from '@ohos/flutter_ohos/src/main/ets/plugin/common/MethodChannel';
import window from '@ohos.window';
import UIAbility from '@ohos.app.ability.UIAbility';

const TAG = "FullScreenPlugin";

export default class FullScreenPlugin implements FlutterPlugin {
  private channel?: MethodChannel;
  /**
   * 沉浸式窗口:隐藏状态栏 + 导航栏 + 全屏布局
   * 与官方 EntryAbility 写法 1:1 对应
   */
  private async setImmersiveMode(enable: boolean, result: MethodResult): Promise<void> {
    try {
      /* 1. 拿到 UIAbility 的 WindowStage */
      const ability = FlutterManager.getInstance().getUIAbility() as UIAbility;
      const stage = ability.context.windowStage;
      if (!stage) {
        result.error('NO_WINDOW', 'WindowStage not ready', null);
        return;
      }

      /* 2. 获取应用主窗口 */
      const win = await stage.getMainWindow();

      /* 3. 实现沉浸式效果 */
      if (enable) {
        // 3-1 方式一:设置导航栏、状态栏不显示。
        // await win.setWindowSystemBarEnable([]);

        // 3-2 方式二:设置窗口为全屏布局,配合设置导航栏、状态栏的透明度、背景/文字颜色及高亮图标等属性,与主窗口显示保持协调一致。
        await win.setWindowLayoutFullScreen(true);
        const sysBarProps: window.SystemBarProperties = {
          statusBarColor: '#00000000',        // 透明
          navigationBarColor: '#00000000',
          statusBarContentColor: '#FFFFFF',
          navigationBarContentColor: '#FFFFFF'
        };
        await win.setWindowSystemBarProperties(sysBarProps);
      } else {
        // 退出沉浸式:恢复显示
        await win.setWindowSystemBarEnable(['status', 'navigation']);
        await win.setWindowLayoutFullScreen(false);
      }
      result.success(true);
    } catch (e) {
      result.error('IMMERSIVE_FAILED', e.message ?? 'Unknown', null);
    }
  }

  onAttachedToEngine(binding: FlutterPluginBinding): void {
    this.channel = new MethodChannel(binding.getBinaryMessenger(), "samples.flutter.dev/fullscreen");
    let that = this;
    this.channel.setMethodCallHandler({
      onMethodCall(call: MethodCall, result: MethodResult) {
        switch (call.method) {
          case 'setFullscreen':   // 进入沉浸式
            that.setImmersiveMode(true, result);
            break;
          default:
            result.notImplemented();
            break;
        }
      }
    })
  }

  onDetachedFromEngine(binding: FlutterPluginBinding): void {
    Log.i(TAG, "onDetachedFromEngine");
    this.channel?.setMethodCallHandler(null);
  }

  getUniqueClassName(): string {
    return "FullScreenPlugin";
  }
}
  1. 注册插件。 在原工程src/main/ets/entryability/EntryAbility.ets中新增注册插件逻辑。 
import { FlutterAbility } from '@ohos/flutter_ohos'
import { GeneratedPluginRegistrant } from '../plugins/GeneratedPluginRegistrant';
import FlutterEngine from '@ohos/flutter_ohos/src/main/ets/embedding/engine/FlutterEngine';
import FullScreenPlugin from './FullScreenPlugin';

export default class EntryAbility extends FlutterAbility {
  configureFlutterEngine(flutterEngine: FlutterEngine) {
    super.configureFlutterEngine(flutterEngine)
    GeneratedPluginRegistrant.registerWith(flutterEngine)
    this.addPlugin(new FullScreenPlugin()); // 注册插件
  }
}

3. Flutter侧调用。

Flutter工程中main.dart文件新增类及方法:

/// 全屏工具
class FullScreen {
  static const MethodChannel _chan =
  MethodChannel('samples.flutter.dev/fullscreen');

  /// true = 沉浸全屏;false = 恢复带系统栏
  static Future<void> setEnabled(bool enable) async {
    await _chan.invokeMethod('setFullscreen', {'enable': enable});
  }
}

在合适的地方调用,例如在进入Flutter应用前调用:

Future main() async {
  WidgetsFlutterBinding.ensureInitialized();
  if (!kIsWeb && defaultTargetPlatform == TargetPlatform.android) {
    await InAppWebViewController.setWebContentsDebuggingEnabled(kDebugMode);
  }

  if (!kIsWeb) {
    await localhostServer.start();
  }
  // 手动把Flutter的“引擎-平台”胶水层提前初始化好
  WidgetsFlutterBinding.ensureInitialized();
  // 进入首页前切全屏
  FullScreen.setEnabled(true);
  runApp(MyApp());
}

更多关于HarmonyOS鸿蒙Next中已有flutter项目如何适配,有没有好的步骤具体的实现方案的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


开发者您好,针对PlatformPlugin.ets文件报错问题:

本地使用DevEco Studio 5.1.1 Release 版本,Build Version: 5.1.1.820;

flutter SDK:oh-3.27.4-dev版本;

本地拥有相同PlatformPlugin.ets文件项目可正常运行,无法复现您描述的报错,您看方便提供最小化demo复现您的问题吗?

开发者您好,针对已有flutter项目如何适配HarmonyOS,可以采取以下方式解决:

前置条件:完成flutter开发环境配置

github上的一个flutter项目支持HarmonyOS为例:

  1. 从github上克隆flutter_shuqi: git clone shuqi仓库地址

  2. 在flutter_shuqi同级目录下执行命令flutter create --platforms ohos flutter_shuqi

  3. flutter_shuqi目录下生成ohos目录。

  4. 连接HarmonyOS真机或者模拟器,执行flutter run。 OpenHarmony组织提供的flutter对flutter tools进行了修改,使用flutter pub getflutter run等命令会自动查找ohos目录,并生成相应的代码和.har包,从而确保可以支持HarmonyOS。

  5. 您需要注意的是: Q:那些三方库支持HarmonyOS? A:OpenHarmony SIG组织已经适配了一些三方库。详情请查看:支持HarmonyOS的三方库

    Q:签名错误如何处理? A:使用DevDco Studio打开flutter_shuqi/ohos项目设置自动化签名即可(也可根据实际情况配置手动签名)。

在鸿蒙Next中适配Flutter项目,需使用ArkTS/ArkUI重构。Flutter引擎无法直接运行。具体步骤:1. 分析Flutter项目功能模块;2. 使用DevEco Studio创建鸿蒙应用工程;3. 将Flutter的UI组件转换为ArkUI组件;4. 业务逻辑用ArkTS重写;5. 调用鸿蒙原生API替换Flutter插件功能;6. 进行测试调试。需重新开发,无直接迁移工具。

针对已有Flutter项目适配HarmonyOS Next,以下是具体步骤和问题解决方案:

1. Flutter项目适配HarmonyOS Next步骤

环境准备:

  • 安装DevEco Studio 4.1 Release及以上版本
  • 配置Flutter for OpenHarmony SDK(使用您提供的oh-3.27.4-dev分支)
  • 确保Node.js版本≥18.19

迁移步骤:

  1. 创建HarmonyOS工程

    ohpm install [@ohos](/user/ohos)/flutter
    

    在entry/src/main/ets目录下生成Flutter适配层代码

  2. 集成Flutter模块

    • 将Flutter项目代码复制到工程目录
    • 修改pubspec.yaml,添加鸿蒙依赖:
    dependencies:
      flutter_ohos:
        git:
          url: https://gitee.com/openharmony-sig/flutter_flutter
          ref: oh-3.27.4-dev
    
  3. 平台通道适配

    • 重写PlatformPlugin.ets中的getSystemUiOverlayStyle方法
    • 修改MethodChannel调用为HarmonyOS API

2. 全屏模式实现方案

EntryAbility.etsonWindowStageCreate方法中:

onWindowStageCreate(windowStage: window.WindowStage): void {
  windowStage.getMainWindow().then((window) => {
    window.setFullScreen(true)
    window.setSystemBarEnable(['navigation'])
  })
}

3. 报错问题解决

PlatformPlugin.ets错误分析:

  • 第47行getSystemUiOverlayStyle方法签名不匹配
  • 需要修改为HarmonyOS的系统状态栏接口

修正方案:

// 替换原有getSystemUiOverlayStyle实现
getSystemUiOverlayStyle(): SystemUiOverlayStyle {
  let systemUiOverlayStyle = new SystemUiOverlayStyle()
  // 使用HarmonyOS状态栏颜色API
  systemUiOverlayStyle.statusBarColor = '#000000'
  systemUiOverlayStyle.statusBarBrightness = Brightness.dark
  return systemUiOverlayStyle
}

EntryAbility.ets补充: 确保正确初始化Flutter引擎:

import flutter from '[@ohos](/user/ohos)/flutter'

onWindowStageCreate(windowStage: window.WindowStage): void {
  flutter.init(this.context, windowStage)
  // 全屏设置代码
}

4. 关键注意事项

  • Flutter for OpenHarmony目前处于Beta阶段,部分插件可能需要手动适配
  • 平台特定代码需通过kIsHarmonyOS条件编译区分
  • UI组件需验证在ArkTS渲染引擎下的兼容性

建议参考OpenHarmony SIG仓库的flutter_flutter示例项目进行对照修改。

回到顶部