Flutter鸿蒙终端一体化-珠联璧合

这篇具有很好参考价值的文章主要介绍了Flutter鸿蒙终端一体化-珠联璧合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

鸿蒙flutter,flutter,harmonyos,华为

点击上方蓝字关注我,知识会给你力量

鸿蒙flutter,flutter,harmonyos,华为

在上一篇文章中,我们初步了解了在鸿蒙中使用Flutter的可能性和可用性,还没看过的可以参考下面的链接。

Flutter鸿蒙终端一体化-混沌初开

在文章的最后,我们分析了两种混编模式,和Android、iOS类似,分别是源码依赖和产物依赖,在我们的项目中,由于很早之前就开始介入Flutter开发,同时抽象了一套Flutter的轻量级渲染模式,所以,这里我们会使用产物依赖的方式进行混编开发,这也和Native开发保持一致。

Flutter混编方案在起点客户端的实践之路

混编的这两种方式各有利弊,我们先来看下这两种方式的工程结构。

下面是以Flutter工程为主的鸿蒙混编项目结构,和纯Flutter工程结构基本一致,鸿蒙的Native功能,都写在ohos目录下,这就是一个完整的鸿蒙Native工程,可以直接使用DevECO Studio打开。
鸿蒙flutter,flutter,harmonyos,华为
在这种方式下,直接执行flutter build hap,将工程编译成鸿蒙的hap包,就可以运行了,这种方式可以参考前面的文章。

下面是以Native工程为主的Flutter Module的工程结构,可以发现,这与我们在Native中看见的内容基本是一样的,还是很好理解的。
鸿蒙flutter,flutter,harmonyos,华为
这种开发模式有什么好处呢?和Native一样,最大的好处就是将Flutter开发和其它开发独立开来,这样双端独立开发互不影响,同时和我们Native的轻量级Flutter渲染架构统一。最后我们选择的架构也就是通过产物集成的方式,下面我们来看下具体的工程模板。

创建module工程

首先,我们通过下面的指令来创建一个支持鸿蒙的Flutter Module工程:

shell
flutter create -t module <project_name>

然后就是执行编译指令,将Flutter Module编译成har,这就类似Android中的aar,这里包含了我们Flutter工程的代码和相关依赖。

shell
flutter build har --local-engine=/Users/xxx/engine/src_release/out/ohos_release_arm64

编译success后,会在下面的目录中生成我们需要的产物:

shell
/Users/xxx/.ohos/flutter_module/build/default/outputs/default/flutter_module.har

我们需要这里的flutter_module.har文件,同时,还需要flutter_embedding.har文件,它的目录如下:

shell
/Users/xxx/.ohos/flutter_module/har/flutter_embedding.har

这个文件是当前flutter_flutter项目的bug,按道理产物只需要flutter_module.har,flutter_embedding.har中都是系统级别的一些产物代码,在当前版本中,未做合并,所以才需要copy出来引入。

产物集成

如果你能顺利完成上面的步骤,那么恭喜你,距离成功就只有一步步步步步步之遥了。

首先,我们创建一个鸿蒙Native工程,你可以使用Dev-ECO Studio来创建,然后直接运行跑起来,这时候,你可以通过这个项目来检查下你的鸿蒙的Native环境,以及验证签名、打包等问题。

一起准备就绪后,在根目录下,创建har文件夹,将前面我们准备好的产物copy到这里,然后,修改entry中的oh-package.json5文件,如下所示。
鸿蒙flutter,flutter,harmonyos,华为
在dependencies中增加两个文件的依赖,并分别命名为flutter_module和flutter_ohos,方便我们后面引用。

编辑之后,右键快捷刷新依赖,执行鸿蒙的run install指令,创建相关的依赖。

打开EntryAbility,我们可以将纯Flutter工程的模板代码copy过来,实际上就和FlutterActivity的使用一模一样,代码如下。

arkts
import { FlutterAbility } from '@ohos/flutter_ohos'
import { FlutterPlugin } from '@ohos/flutter_ohos/src/main/ets/embedding/engine/plugins/FlutterPlugin';
import { GeneratedPluginRegistrant } from '@ohos/flutter_module/src/main/ets/plugins/GeneratedPluginRegistrant';
import List from '@ohos.util.List';
import FlutterEngine from '@ohos/flutter_ohos/src/main/ets/embedding/engine/FlutterEngine';

export default class EntryAbility extends FlutterAbility {
  configureFlutterEngine(flutterEngine: FlutterEngine) {
    super.configureFlutterEngine(flutterEngine)
    let plugins = GeneratedPluginRegistrant.getPlugins() as List<FlutterPlugin>;
    plugins.forEach((plugin) => {
      this.addPlugin(plugin);
    })
  }
}

然后在Index中添加FlutterPage,代码如下。

arkts
import common from '@ohos.app.ability.common';
import { FlutterPage } from '@ohos/flutter_ohos'

let storage = LocalStorage.getShared()
const EVENT_BACK_PRESS = 'EVENT_BACK_PRESS'

@Entry(storage)
@Component
struct Index {
  private context = getContext(this) as common.UIAbilityContext
  @LocalStorageLink('viewId') viewId: string = "";

  build() {
    Column() {
      FlutterPage({ viewId: this.viewId })
    }
  }

  onBackPress(): boolean {
    this.context.eventHub.emit(EVENT_BACK_PRESS)
    return true
  }
}

可以发现,这里的FlutterPage是完全可以当作一个View来使用的,你甚至可以设置它的尺寸,或者是将它放到一个Native的Tab组件中,相当灵活。

直接运行项目,我们就可以看到熟悉的Flutter计数器页面了。熟悉的感觉又回来了,现在我们可以随心所欲地在Flutter中创建页面,并直接运行在鸿蒙系统中了。

然后等你开开心心的写了一堆Flutter代码,好不容易实现了老板的大饼,满心欢喜的将har重新copy到项目中,结果,它居然还是那个计数器!!!没错,现在IDE的编译系统还存在缓存问题,而且不论你怎么clean都没用,必须要把项目中的build、oh_modules文件夹都删掉,然后重新install才会创建正确的数据,有点小坑,但不大。

本篇就先到这里,这里我们确定了Flutter鸿蒙的混编方案,并探索了har产物集成的一般方法,当然这还只是迈出了一小步,后面我们会逐步实现Channel和双向通信,这才是我们混编的核心。

向大家推荐下我的网站 https://www.yuque.com/xuyisheng  点击原文一键直达

专注 Android-Kotlin-Flutter 欢迎大家访问

往期推荐

  • Flutter鸿蒙终端一体化-混沌初开

  • Flutter混编方案在起点客户端的实践之路

  • 当我用ChatGPT摸了一上午鱼,结果......

  • FlutterComponent最佳实践之Widget Lifecycle

本文原创公众号:群英传,授权转载请联系微信(Tomcat_xu),授权后,请在原创发表24小时后转载。

< END >

作者:徐宜生

更文不易,点个“三连”支持一下👇
文章来源地址https://www.toymoban.com/news/detail-827350.html

到了这里,关于Flutter鸿蒙终端一体化-珠联璧合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DevOps(开发运维一体化)

    DevOps是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。 DevOps的三大支柱,即人(People)、流程(Process)、平台(

    2024年02月07日
    浏览(46)
  • 一体化个人门户Web Portal

    什么是 Web Portal ? Web Portal 是一个一体化的 Web 仪表板,提供许多小部件来构建个人门户。具有加载外部插件的能力。对于那些只需要链接仪表板并希望使用 yaml 配置它的人来说, Lite 版是一个精简版本。 如果你不想自己构建,可以跳过,直接阅读下一章节 构建服务端镜像的

    2024年02月11日
    浏览(63)
  • “天空地”一体化生态系统监测概念介绍

    “天空地”一体化生态系统监测是综合运用卫星遥感监测、航空遥感监测和地面站点监测等环境监测手段,基于数据挖掘、数据融合、数据协同和数据同化等关键技术,获得更加准确数据支持的立体生态监测感知体系。“天空地”一体化生态监测体系能更为全面地反映生态系

    2024年02月12日
    浏览(44)
  • 什么是流批一体化、区块链

    流批一体 大数据厂商喜欢强调的功能特性。就是流式数据处理、离线批量数据处理,实现一体化处理。可能对政务信息化的数据处理效率会有所提升。这个也是个工程概念,估计2-3年就会过时。什么不是工程概念呢?比如数据元和元数据的概念。 再来看看区块链的底层逻辑

    2024年02月02日
    浏览(50)
  • 大数据流批一体化架构设计

    1、当前生产环境因source端数据更改,导致后续计算重新运行情况时有发生,这样不仅牵扯开发精力而且十分消耗资源。 2、现有的数据处理方式不能更好的面向未来日益增多的需求。 3、业务线数据模型混乱,数据使用成本特别高。 4、需求驱动的烟囱式开发,完全没有复用的

    2024年02月14日
    浏览(38)
  • 医院核心数据库一体化建设实践

    “以数据为核心资源的数字化时代,正在成为引领和推动新一轮科技革命的核心力量,将会深刻影响卫生健康行业。” 这是四月份发布的《公立医院运营管理信息化功能指引》中对数据重要性的描述。数据库作为数据的载体,支撑着整个业务系统,发挥着非常重要的作用,被

    2023年04月24日
    浏览(57)
  • 数字孪生“光储充”一体化智慧充电站

    近年来,蔚来、理想、特斯拉等电动汽车凭借独特的优势已成为全球消费者的“新宠儿”。随着新能源车保有量迅速增长,充电需求不断上升,充电桩对区域电网的冲击也日益显著。 “光储充”一体化模式,即“光伏+储能+汽车充电”,被视为解决新能源汽车与充电桩发展不

    2024年02月21日
    浏览(37)
  • 一体化笔记本电脑内置键盘更换指南

    内容:记录一次笔记本内置键盘更换事件。以前的笔记本键盘可以从C面直接取掉,现在的笔记本基本都是金属外壳,同时为了让笔记本电脑更加轻薄,一般都是一体化操作。网上一般都是连同键盘及外壳,直接更换C面,价格昂贵不说,太浪费了,不建议,地球环境越来越差

    2024年02月13日
    浏览(54)
  • 重新认识Elasticsearch-一体化矢量搜索引擎

    2023 哪个网络词最热?我投“生成式人工智能”一票。过去一年大家都在拥抱大模型,所有的行业都在做自己的大模型。就像冬日里不来件美拉德色系的服饰就会跟不上时代一样。这不前段时间接入JES,用上好久为碰的RestHighLevelClient包。心血来潮再次访问Elasticsearch官网,发现

    2024年02月02日
    浏览(40)
  • 02.RDO一体化部署OpenStack详细步骤

    Author:Sickey Date:2021-11-24 vim /etc/resolv.conf 如上图,默认已经配置好了 vim /etc/hosts 192.168.233.133 openstackrdo     systemctl stop firewalld systemctl disable firewalld vim /etc/selinux/config       #SELINUX=enforcing  改成  SELINUX=disabled

    2024年02月09日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包