【鸿蒙应用ArkTS开发系列】- Har包中子组件中监听生命周期实现

这篇具有很好参考价值的文章主要介绍了【鸿蒙应用ArkTS开发系列】- Har包中子组件中监听生命周期实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在鸿蒙应用开发中,有时候我们会创建HAR 模块封装一些SDK能力提供给第三方APP进行集成。
鸿蒙的har 包并不支持定义page页面对外导出,也不支持配置路由信息,因此我们多是在har包中提供组件,通过导出组件的形式,提供给App引用使用。
在鸿蒙中,非@Entry装饰的组件,只能收到如下生命周期函数的回调

  • aboutToAppear?(): void;
  • aboutToDisappear?(): void;

对于页面级组件来说,就可以收到

  • onPageShow?(): void;
  • onPageHide?(): void;
  • onBackPress?(): void;

但是在实际使用过程中,如果我们的har包中想提供跟页面组件一样的功能,受限于har限制,不能定义为@Entry 组件,因而无法接收到上述三个函数的回调,实际功能会收到限制。那有没有办法解决上述问题呢?

解决思路

1. 集成方定义壳页面

我们在har模块中定义一个子组件,pages/SdkPage.ets

@Component
export struct SdkPage {

build() {
...
}

}

在App中定义壳页面,pages/SdkPageShell.ets
这里也可以创建一个HSP对外提供,壳页面配置在HSP包中,对外提供HSP给App集成(这个HSP的,后面有时间在单独写一篇进行讲解SDK的封装,有兴趣的可以私信我或者评论区留言)。

@Entry
@Component
export struct SdkPageShell {

  build() {
    Column() {
      SdkPage()
    }.width('100%')
    .height('100%')
  }
}

套娃模式,这样我们就能将har包中的子组件作为页面级别进行展示了。App需要对SdkPageShell进行页面路由配置。
SdkPageShell 作为一个空壳页面。
但是在实际开发中,就会出现正文前言提到的问题,有部分生命周期函数无法收到回调, 导致我们开发页面功能时处处受限,比如页面隐藏时进行一些消息取消订阅,页面显示时进行消息订阅,如果是要做编辑功能,希望是用户在触发手机实体键的时候,弹窗询问用户是否进行数据保存,不能收到
onBackPress回调,那功能就无法实现了。
那应该怎么做呢,接着往下看。

2. 生命函数钩子函数

经过对子组件的个追踪,发现 在子组件中,是能够获取到父组件的实例的parent_,那我们就可以对其进行一点点的处理。如果我们的子组件是页面组件下的一级子组件,那this[‘parent_’] 拿到的就是上文提到的壳页面SdkPageShell ,
parent_无法直接获取到,我们通过this[‘parent_’] 就可以拿到实例。
那这里有一个思路,我们对this[‘parent_’] 进行一个生命周期函数的方法注入。

在SdkPage.ets中,

 
 aboutToAppear() {
    this['parent_'].onBackPress= this.onBackPress.bind(this);
  };
  onBackPress() {
    Logger.info(this.TAG, 'onBackPress is called');
    return true;
  }

既然按实体返回键的时候,系统会回调壳页面的onBackPress函数,在壳页面中重写onBackPress就可以收到回调, 那我们这里给壳页面注入一个onBackPress进行替换,然后绑定到SdkPage子组件上的onBackPress中去,这样是不是就可以收到回调呢?按这个思路好像是行得通,那就运行试试看,可是很遗憾不能生效。原因是我们改动的是运行期壳页面的onBackPress方法,系统触发实际调用的是CustomComponent的onBackPress。
那壳页面重写onBackPress是能够收到回调,那在壳页面进行一点修改不就可以了,

1. 壳页面调用生命周期函数

在SdkPageShell.ets中,

@Entry
@Component
export struct SdkPageShell {

  build() {
    Column() {
      SdkPage()
    }.width('100%')
    .height('100%')
  }

  onBackPress() {
    if (this['onBackPressHook']) {
      return this['onBackPressHook'].call(this);
    }
  }
}
  1. 重写onBackPress方法
  2. 判断是否有onBackPressHook方法,如果有,触发onBackPressHook,根据onBackPressHook返回值确认是否拦截返回
  3. 如果没有定义onBackPressHook,就直接不处理

看到这里,会不会有点懵,onBackPressHook是啥,SdkPageShell中并未定义onBackPressHook,这里的代码能生效吗,相信有的同学已经反应过来,没错,我们要到子组件中对SdkPageShell进行 onBackPressHook方法的注入。

2. 子组件进行生命周期函数处理方法注入

这里贴下完整代码:

在SdkPage.ets中,

@Component
export struct SdkPage {

	build() {
	...
	}

	aboutToAppear() {
    	this.addEvent();
  	};

  	aboutToDisappear() {
  	}

 	addEvent() {
    	this['parent_'].onBackPressHook= this.onBackPress.bind(this);
  	}

  	onBackPress() {
    	Logger.info(this.TAG, 'onBackPress is called');
    	this.handlePageBack();
    	return true;
  	}
}

这样,在按了手机的物理返回键的时候,子组件SdkPage 就能在onBackPress中收到回调,在handlePageBack中进行返回事件处理,比如弹窗提供用户进行数据保存, return true意思是要拦截系统返回,这样页面就不会被关闭。

总结

其他的生命周期函数,处理方式跟上述的方式一致,总结思路如下:

  1. 壳页面在触发生命周期函数回调时,调用生命周期函数处理函数(需判断是否有定义)
  2. 子组件给壳页面注入生命周期函数处理函数,绑定到自身的方法中。

上述方法,只需要App配合,写少量代码,在壳页面中进行生命周期函数的调用,或者是SDK提供方提供壳页面给到App。如果觉得这样还是不够简洁,那就得考虑提供HSP包给App集成,而不是提供HAR包,这样就可以直接提供Page而不是提供组件。 上面方案也只是一个实现的思路之一,也是有其局限性,比如多个子组件的情况下,就会存在多注入覆盖的问题,因此需要根据实际开发情况来选择实现方案,本文这里仅提供一种实现思路,如果有其他实现方式,欢迎评论区探讨。谢谢阅读!文章来源地址https://www.toymoban.com/news/detail-619634.html

到了这里,关于【鸿蒙应用ArkTS开发系列】- Har包中子组件中监听生命周期实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:List)

    列表包含一系列相同宽度的列表项。适合连续、多行呈现同类数据,例如图片和文本。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 该组件内容区小于一屏时,默认没有回弹效果。需要回弹效果,可以通过edgeEffe

    2024年04月13日
    浏览(86)
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Flex)

    以弹性方式布局子组件的容器组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 Flex组件在渲染时存在二次布局过程,因此在对性能有严格要求的场景下建议使用Column、Row代替。 Flex组件主轴默认不设置时撑满父容

    2024年04月11日
    浏览(39)
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:组件内容模糊)

    为当前组件添加内容模糊效果。 说明: 从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 foregroundBlurStyle(value: BlurStyle, options?: ForegroundBlurStyleOptions) 为当前组件提供内容模糊能力。 系统能力:  SystemCapability.ArkUI.ArkUI.Full 参数: 参数

    2024年03月09日
    浏览(35)
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:UIExtensionComponent (系统接口))

    UIExtensionComponent用于支持在本页面内嵌入其他应用提供的UI。展示的内容在另外一个进程中运行,本应用并不参与其中的布局和渲染。 通常用于有进程隔离诉求的模块化开发场景。 说明: 该组件从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的

    2024年04月13日
    浏览(38)
  • 【鸿蒙应用ArkTS开发系列】- 选择图片、文件和拍照功能实现

    在使用App的时候,我们经常会在一些社交软件中聊天时发一些图片或者文件之类的多媒体文件,那在鸿蒙原生应用中,我们怎么开发这样的功能呢? 本文会给大家对这个功能点进行讲解,我们采用的是拉起系统组件来进行图片、文件的选择,拉起系统相机进行拍照的这样一种

    2024年02月04日
    浏览(37)
  • 【鸿蒙应用ArkTS开发系列】- http网络库使用讲解和封装

    现在网上的应用,基本都是网络应用,需要进行联网获取数据,而常用的联网获取数据的方式有http、socket、websocket等。 在鸿蒙应用、服务中,stage模式开发下,鸿蒙官方为我们提供了一个网络组件库 http ,我们通过 import http from ‘@ohos.net.http’; 即可以完成引用。 @ohos.net.http

    2024年02月15日
    浏览(44)
  • 鸿蒙实战:ArkTs 开发一个鸿蒙应用

    学习过的 ArkTs 知识点,一步一步开发一个小的鸿蒙应用示例,涉及到  ArkTs 语法、注解 @Entry 、 @Component 、 @state 、路由、生命周期、 @Prop 、 @Link 、常用组件的使用等等知识点。 要开发一个鸿蒙应用,首先我们需要知道 系统是如何找到页面的启动入口 。 鸿蒙如何启动应用

    2024年02月22日
    浏览(41)
  • 【鸿蒙软件开发】ArkTS常用组件之Button

    Button是按钮组件,通常用于响应用户的点击操作,其类型包括胶囊按钮、圆形按钮、普通按钮。Button当做为容器使用时可以通过添加子组件实现包含文字、图片等元素的按钮。具体用法请参考Button。 Button通过调用接口来创建,接口调用有以下两种形式: 创建不包含子组件的

    2024年02月02日
    浏览(34)
  • 【鸿蒙软件开发】ArkTS容器组件之Badge

    Badge组件:可以附加在单个组件上用于信息标记的容器组件。 可以附加在单个组件上用于信息标记的容器组件。 说明 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 支持单个子组件。 说明 子组件类型:系统组件和自定义组

    2024年02月08日
    浏览(39)
  • 鸿蒙开发系列教程(七)--ArkTS语言:状态管理

    如果希望构建一个动态的、有交互的界面,就需要引入“状态”的概念 状态管理机制:在声明式UI编程框架中,UI是程序状态的运行结果,用户构建了一个UI模型,其中应用的运行时的状态是参数。当参数改变时,UI作为返回结果,也将进行对应的改变。这些运行时的状态变化

    2024年01月20日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包