OpenHarmony实战开发-如何实现购物示例应用

​介绍

本示例展示在进场时加载进场动画,整体使用Tabs容器设计应用框架,通过TabContent组件设置分页面,在子页面中绘制界面。通过Navigation完成页面之间的切换。在详情页中通过 Video组件加载视频资源,使用CustomDialogController弹窗选择位置信息,点击首页及购物车返回主页面。

本示例使用Tabs容器 实现通过页签进行内容视图切换。使用Navigation实现页面之间的切换。使用自定义弹窗 设置位置信息。使用Swiper 组件实现页面展示图轮播。使用Grid 容器组件设置展示的商品信息。

本示例用到了延迟任务回调能力接口@ohos.WorkSchedulerExtensionAbility 。

通知管理的能力接口@ohos.notification 。

HTTP数据请求能力接口@ohos.net.http 。

媒体查询接口@system.mediaquery 。

管理窗口能力接口@ohos.window 。

效果预览

在这里插入图片描述
使用说明:

1、启动应用进入进场动画,然后进入首页的时候会有升级弹窗的提示,判断应用需不需要升级,整个应用分四部分,首页、新品、购物车、我的。可以点击进行切换。

2、“首页”页面具有扫一扫功能、搜索框、轮播图、tabs、商品列表。

3、“首页”页面的扫一扫点击可以进行二维码扫描,点击商品可以跳转到详情页。

4、“商品详情页”上部分是视频,点击视频进行播放,也可以点击进入全屏模式,向下滑动详情页视频可以变成小窗口模式。点击右侧悬浮的直播按钮,可进入直播页面,直播页面可进行视频播放。

5.“商品详情页”有个分享功能,点击可进行分享。点击选择收货地址可弹出选择地址的选项,可进行选择地址。

6.断开网络链接,“商品详情页”中点击降价通知后,重新连接网络后通知栏有降价通知。

7.新品、购物车、我的目前是静态页面。

工程目录

OrangeShopping
├── AppScope                                    
│   └── app.json5                               // APP信息配置文件
├── entry/src/main                              // 商品主页
│   ├── ets
│   │   ├── Application
│   │   ├── Mainmability                        // 应用入口,在应用创建时进行必要的权限判断
│   │   ├── pages
│   │   │   ├── Index.ets                       // 首页的入口,首页加载页面(可点击跳过)
│   │   │   ├── Detail.ets                      // 商品详情页
│   │   │   ├── FullPage.ets                    // 商品详情页内的视频组件
│   │   │   ├── Home.ets                        // 首页
│   │   │   ├── LivePage.ets                    // 直播页
│   │   │   ├── ScanPage.ets                    // 二维码扫描组件
│   │   │   └── Setting.ets                     // 封装http请求页   
│   │   ├── utils
│   │   │   ├── RouterUtil.ets                  // 路由跳转配置
│   │   └── WorkAbility
│   │       └── WorkAbility.ts
│   ├── module.json5                            // Module的基本配置信息,应用运行过程中所需的权限信息。
│   ├── resources/base
│   │   ├── element                             // 文字信息列表
│   │   ├── profile                             // 全局路由配置
│   │   └── media                               // icon图片
├── feature/detailPageHsp/src/main              // 商品主页
│   ├── ets
│   │   ├── mock                                // mock的数据
│   │   ├── components                          // 组件模块
│   │   └── main                                // 商品详情页模块
├── feature/emitter/src/main                    
│   ├── ets
│   │   └── components                          // 订阅购物车模块
├── feature/navigationHome/src/main             
│   ├── ets
│   │   ├── good                                // 商品模块
│   │   ├── home                                // 首页模块
│   │   ├── user                                // 用户模块
│   │   └── shoppingCart                        // 商品购物车模块

相关概念

动效能力:动画应该尽可能减少冗余刷新,合理地使用动效开发效率更高,可以获得更好的性能。

具体实现

Navigation相关的能力:NavPathStack路由转场,跨包引用Hsp,动态加载等能力详见Navigation开发示例文章 。
1.应用创建时进行必要的权限判断:在app.json5 文件中对"requestPermission"对象进行权限匹配。如果有如果权限列表中有-1,说明用户拒绝了授权。

2.配置Module信息:

  • 在module.json5文件中配置"extensionAbilities"字段
  • 在"requestPermissions"标签中添加需要开的权限,例如使用相机拍摄照片和录制视频权限: “name”: "
    ohos.permission.CAMERA"

3.Navigation的使用: Navigation组件主要包含主页和内容页。主页由标题栏、内容区和工具栏组成,其中内容区默认首页显示导航内容(Navigation的子组件) 或非首页显示(NavDestination的子组件),首页和非首页通过路由进行切换。Navigation的路由切换的方式有两种,在API Version 9上,首页导航内容需要配合NavRouter组件实现页面路由, 从API Version 10开始,首页推荐使用NavPathStack配合NavDestination属性进行页面路由。本次示例主要介绍NavPathStack的使用,如下步骤所示:

  • NavPathStack有两种路由切换方法,一种是pushPath,如主页---->设置页面,通过使用this.pageStack.pushPath({
    name: ‘SetPage’ })进行跳转,源码参考TitleBar.ets,
    另外一种是pushPathByName,如主页---->详情页面,通过使用this.pageStack.pushPathByName(‘DetailPage’,
    item)进行跳转,其中item为需要传递的参数。

  • NavPathStack支持pop、move、clear方法的使用;pop方法的作用是弹出路由栈栈顶元素,如首页进入商品详情页面,在详情页面使用this.pageStack.pop()方法返回到首页,clear方法的作用是清除栈中所有页面,
    如首页跳转到详情页面,详情页面再进入直播页面,在直播页面通过使用this.pageStack.clear()直接返回到首页。除此之外,还有popTo(回退路由栈到第一个名为name的NavDestination页面)、
    popToIndex(回退路由栈到index指定的NavDestination页面)、moveToTop(将第一个名为name的NavDestination页面移到栈顶)、moveIndexToTop(将index指定的NavDestination页面移到栈顶)方法,
    由于本示例暂时没有合适的按钮去承载这些功能,所以本示例未体现。

  • 路由栈信息,如下所示

获取栈中所有NavDestination页面的名称:this.pageInfos.getAllPathName()
获取index指定的NavDestination页面的参数信息:this.pageInfos.getParamByIndex(1)
获取全部名为name的NavDestination页面的参数信息:this.pageInfos.getParamByName('pageTwo')
获取全部名为name的NavDestination页面的位置索引:this.pageInfos.getIndexByName('pageOne')
获取栈大小:this.pageInfos.size()

4.动态加载的使用:

  • 定义需要被动态加载的组件DetailPage,本示例中组件加载使用搭配Navigation实现。源码参考DetailPage.ets;
  • 定义一个DynamicLoader动态回调类作为容器,用来注册和调用动态加载函数。源码参考DynamicLoader.ets;
  • 将DetailPage组件用DetailPageLoader函数封装,当DetailPageLoader被调用时,会渲染DetailPage页面。源码参考DetailPageLoader.ets;
  • 在主页实现动态加载DetailPage的步骤如下:
    由于navDestination无法直接动态import组件(import是函数,组件中无法引用函数),此处采用声明@BuilderParam
    detailPageLoader函数,在点击时初始化此函数,此时navDestination中可以调用this.detailPageLoader()从而加载组件DetailPage。

a)主页Home中定义组件加载函数@BuilderParam detailPageLoader: () => void,用来承接await import异步导入detailPageLoader的结果。

@BuilderParam detailPageLoader: () => void

b)注册异步函数,点击时为detailPageLoader初始化,当满足key为DetailPage时,此时异步的加载DetailPageLoader,渲染DetailPage

DynamicLoader.getInstance().register(async (key: string) => {if (key === "DetailPage") {let obj = await import("./DetailPageLoader")this.detailPageLoader = obj.DetailPageLoader;}}

c) 定义NavDestination中动态加载函数,当存在跳转行为时,会调用此函数

 PageMap(name: string, param: NavPathStack) {if (name === 'DetailPage') {this.detailPageLoader();})

d)按钮触发点击函数,调用detailPageLoader,此时真正的初始化@BuilderParam detailPageLoader,并通过Navigation中PageMap动态加载组件DetailPage。

Column() // 首页goodsList组件.onClick(() => {// 动态加载组件DynamicLoader.getInstance().fire('DetailPage').then(()=>{this.active = true;this.pageStack.pushPathByName('DetailPage', item);})})

5.hsp包的创建与使用: 本示例以创建detailPageHsp的hsp包为例,Hsp包介绍及详细操作步骤

  • 在根目录右键新创建module为Shared
    Library类型的hsp模块,并将模块命名为detailPageHsp并拖拽至feature文件夹下做包的统一管理;
  • 定义hsp出口:在创建后的hsp包内编写业务代码,并在index.ets中export组件。
  • 引用方hap如何使用hsp:通过在oh-package.json5文件中加入定义的hsp依赖。
"dependencies": {"@ohos/details-page-hsp": "file:../feature/detailPageHsp",}
  • hap中使用:在组件中引入依赖。
import { DetailPage } from '@ohos/details-page-hsp';
  • 编译时需选中detailPageHsp模块,在ide的工具栏中选择build-Make Module ‘detailPageHsp’。
  • 运行时,需要在运行模块处配置edit Configuration并勾选Deploy Multi Hap
    Packages进行混合编译,即可运行。
    6.多屏监听:在首页加载时会通过mediaquery.matchMediaSync()监听当前屏幕尺寸curBp=[sm代表小屏,md代表中屏,lg代表大屏] ,并将当前值存储到Appstorage里,通过AppStorage.SetOrCreate(‘curBp’, this.curBp)。
    7.响应式渲染:通过全局的UI状态AppStorage存储,绑定了appstorage的数据会进行响应式屏幕尺寸渲染。

8.订阅购物车事件:以持久化方式订阅并接收事件回调,持续订阅发布事件。通过emitter.emit(addToShoppingCartId, shoppingCartData)

相关权限

允许使用Internet网络: ohos.permission.INTERNET

允许应用控制马达振动:ohos.permission.VIBRATE

允许应用使用相机拍摄照片和录制视频:ohos.permission.CAMERA

允许应用获取设备位置信息:ohos.permission.LOCATION

允许应用在后台运行时获取设备位置信息:ohos.permission.LOCATION_IN_BACKGROUND

允许应用截取屏幕图像 :ohos.permission.CAPTURE_SCREEN

允许应用读取用户外部存储中的媒体文件信息:ohos.permission.READ_MEDIA

允许应用访问用户媒体文件中的地理位置信息 :ohos.permission.MEDIA_LOCATION

允许应用读写用户外部存储中的媒体文件信息 :ohos.permission.WRITE_MEDIA

依赖

数据请求 本示例的网络配置服务依赖此示例。

位置服务 本示例的详情页中的位置服务功能依赖此示例。

媒体库视频 本示例的详情页中的视频功能依赖此示例。

分享 本示例的详情页中的分享功能依赖此示例。

事件通知 本示例详情页中的降价通知功能依赖此示例。

扫一扫 本示首页中的扫码功能依赖此示例。

约束与限制

1.本示例仅支持标准系统上运行,支持设备:RK3568。

2.本示例已适配API10版本SDK,SDK版本号(API Version 10 Release),镜像版本号(4.0 Release)。

3.本示例需要使用DevEco Studio 版本号(4.0 Release)及以上版本才可编译运行。

4.本示例需要使用系统权限的接口。使用Full SDK时需要手动从镜像站点获取,并在DevEco Studio中替换,具体操作可参考替换指南。

5.本示例需联网运行。

6.弹窗升级需配置服务器后触发。

7.本示例所配置的权限ohos.permission.CAPTURE_SCREEN为system_core级别( 相关权限级别可通过权限定义列表 查看),需要手动配置对应级别的权限签名( 具体操作可查看自动化签名方案。

下载

如需单独下载本工程,执行如下命令:

git init
git config core.sparsecheckout true
echo code/Solutions/Shopping/OrangeShopping/ > .git/info/sparse-checkout
git remote add origin https://gitee.com/openharmony/applications_app_samples.git
git pull origin master

为了帮助大家更深入有效的学习到鸿蒙开发知识点,小编特意给大家准备了一份全套最新版的HarmonyOS NEXT学习资源,获取完整版方式请点击→https://qr21.cn/FV7h05

HarmonyOS教学视频:语法ArkTS、TypeScript、ArkUI等…视频教程

在这里插入图片描述
在这里插入图片描述

鸿蒙生态应用开发白皮书V2.0PDF: 获取完整版白皮书方式请点击→https://qr21.cn/FV7h05

在这里插入图片描述

鸿蒙 (Harmony OS)开发学习手册

一、入门必看

应用开发导读(ArkTS)
.……
在这里插入图片描述

二、HarmonyOS 概念

系统定义
技术架构
技术特性
系统安全
在这里插入图片描述

三、如何快速入门?

《做鸿蒙应用开发到底学习些啥?》https://qr21.cn/FV7h05
基本概念
构建第一个ArkTS应用
.……在这里插入图片描述

四、开发基础知识

应用基础知识
配置文件
应用数据管理
应用安全管理
应用隐私保护
三方应用调用管控机制
资源分类与访问
学习ArkTS语言
.……在这里插入图片描述

五、基于ArkTS 开发

Ability开发
UI开发
公共事件与通知
窗口管理
媒体
安全
7.网络与链接
电话服务
数据管理
后台任务(Background Task)管理
设备管理
设备使用信息统计
DFX
国际化开发
折叠屏系列
.……在这里插入图片描述

更多了解更多鸿蒙开发的相关知识可以参考:《鸿蒙 (Harmony OS)开发学习手册》https://qr21.cn/FV7h05

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/785839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 代码混淆工具概述

在保护Python代码安全方面,有多种混淆工具可供选择,包括 Cython, Nuitka, Pyminifier 和 IPA guard。本文将介绍这些工具的特点和适用情况,以及在实际应用中的注意事项。 📝 摘要 本文探讨了几种常见的 Python 代码混淆工具&am…

用Typora+picgo+cloudflare+Telegraph-image的免费,无需服务器,无限空间的图床搭建(避坑指南)

用TyporapicgocloudflareTelegraph-image的免费,无需服务器,无限空间的图床搭建(避坑指南) 前提:有github何cloudflare (没有的话注册也很快) 首先,是一个别人写的详细的配置流程,傻瓜式教程&am…

嵌入式网络硬件方案

一. 简介 本文来了解一下嵌入式有些网络中,涉及的网络硬件方案。 注意:本文说明的是有些网络。 提起网络,我们一般想到的硬件就是“网卡”,“网卡”这个概念最早从电脑领域传出来,顾名思义就是能上网的卡。在电脑领…

Android12 简单的共享内存驱动实现 参考Ashmem

Android12 共享内存驱动实现 SOC:RK3568 system:Android12 概述: 1. 概述 Ashmem(Anonymous Shared Memory,Android 匿名共享内存),它基于 mmap 系统调用,可以让不同进程将同一段…

Go-知识协程

Go-知识协程 1. 基本概念1.1 进程1.2 线程1.3 协程 2. 协程的优势3. 调度模型3.1 线程模型3.2 Go调度器模型 4. 调度策略4.1 队列轮转4.2 系统调用4.3 工作量窃取4.4 抢占式调度 5. GOMAXPROCS对性能的影响 一个小活动: https://developer.aliyun.com//topic/lingma…

virtualbox 日常运维

前言 虽然平常以macOS和Linux作为主打工作环境,但还是有很多需要用到windows的时候,如camtasia和券商QMT软件。 在二手ThinkPad P53上安装了几个windows虚机,作为测试环境。Mac笔记本远程桌面连接嫌麻烦,还是命令行舒服。MacOS自…

计算机网络—TCP协议详解:特性、应用(1)

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:マリンブルーの庭園—ずっと真夜中でいいのに。 0:34━━━━━━️💟──────── 3:34 🔄 ◀️…

Linux文件与进程交互的窥探者lsof

lsof 是一个 Linux 和 UNIX 系统中的实用工具,用于列出系统中打开文件的所有信息。这个名字代表 “List Open Files”,但它也可以显示进程相关的其他信息,如: 打开的文件描述符列表 打开网络连接的列表 被进程使用的信号和内核对象等 在Linux系统中,有一个经典的概念: …

【御控物联】JavaScript JSON结构转换(6):对象To对象——综合应用

文章目录 一、JSON结构转换是什么?二、术语解释三、案例之《JSON对象 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么? JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

java(4)之运算符

1、算术运算符 运算符含义表达式加11-减1-1*乘1*2/除2/1%取余5%2 2、赋值运算符 即 表示将右边的值赋给左边的变量 即 int i ; i 1; 运算符含义 表达式 x xyxy-x x-yx - y*x x*yx*y/x x/yx /y%x x%yx %y 代码示例 public class Main {pub…

DXP学习3-单片机时钟显示系统的层次原理图设计

目录 一,自上而下的子母图设计 1,绘制层次式电路母图 1)工程及原理图创建和保存 2)开始绘制层次式母图main.SchDoc 2,绘制图纸符号 1)properties选项卡 2)designator标号 3)filename文件名 4&…

Kafka、ActiveMQ、RabbitMQ和RocketMQ都有哪些区别?

一、问题解析 Kafka、ActiveMQ、RabbitMQ和RocketMQ都是常见的消息中间件,它们都提供了高性能、高可用、可扩展的消息传递机制,但它们之间也有以下一些区别: 1、消息传递模型:Kafka主要支持发布-订阅模型,ActiveMQ、R…

什么是人工智能物联网(AIoT)?

过去十年,从医疗设备、家庭和楼宇自动化到工业自动化等各个领域,物联网 (IoT) 设备的数量呈爆炸式增长。设备包括可穿戴设备、传感器、电器和医疗监视器——所有这些设备都相互连接,收集和共享大量数据。国际数据公司 (IDC) 预测,…

蓝桥杯c++递归与递推

数字三角形 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm>using namespace std; const int N 110; int map[N][N]; int n;int main() {cin >> n;for(int i0;i<n;i){for(int j0;j<i;j){cin >> map[i]…

做好自动化测试必备的5大技能,懂一个就超过了99%的人

或许还有一些人认为软件测试的门槛很低&#xff0c;低到任何人都可以做&#xff0c;随便点点就可以了。这里需要澄清一下&#xff0c;不管哪一类测试岗位&#xff0c;如果做深做精都需要下功夫&#xff0c;只是精通的方向不同。试问一下如果让一个什么都不懂、一点业务基础都没…

Linux之ssh服务

目录 一、ssh简介 ssh组件 二、配置文件 三、相关的命令 ssh scp 四、密钥认证 一、ssh简介 远程登陆linux用的就是ssh服务 ssh服务特点就是数据会机密传输 ssh组件 组件&#xff1a;openssh 服务器&#xff1a;sshd 默认端口&#xff1a;22 二、配置文件 /etc/ssh/ss…

【题目】【网络系统管理】2021年全国职业院校技能大赛模块B--样题(三)

2021年全国职业院校技能大赛 网络系统管理&#xff08;样题3&#xff09;模块B&#xff1a;Windows环境 全国职业院校技能大赛执委会.技术专家组 2021年03月 目录 一、赛题说明 3 &#xff08;一&#xff09;竞赛介绍 3 &#xff08;二&#xff09;密码 3 &#xff08;三…

理解 SQL 数据添加:从基础到实践

引言&#xff1a; 在现代软件开发中&#xff0c;数据库是不可或缺的一部分。而 SQL 作为结构化查询语言的代表&#xff0c;广泛应用于数据库管理系统中&#xff0c;为我们提供了强大的数据管理和查询能力。 主题&#xff1a; 我们将从基础的 SQL INSERT INTO 语句开始&…

【智能家居项目】RT-Thread版本——DHT11获取温湿度 | MQTT上传到服务器 | 服务器控制外设

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《智能家居项目》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 这篇文章中&#xff0c;本喵将使用RT-Thread Studio来实现这个智能家居的项目&#xff0c;最终…

【智能算法】帝企鹅优化算法(EPO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2018年&#xff0c;G Dhiman等人受到自然界中帝企鹅群体社会行为启发&#xff0c;提出了帝企鹅优化算法&#xff08;Emperor Penguin Optimizer, EPO&#xff09;。 2.算法原理 2.1算法思想 EPO模…