- 博客(37)
- 收藏
- 关注
原创 十一、【鸿蒙 NEXT】@Observed装饰器和@ObjectLink装饰器
我们经常会遇到这种场景,比如从后台获取到一个数组对象T[],然后会根据该数组对象去循环渲染页面。当某个元素T中的某个属性值变更的时候,需要重新刷新页面。那么我们可以怎么操作去刷新页面呢?本节将讲下刷新页面的方法,以及它的优缺点。
2025-03-21 07:24:53
713
原创 十、【鸿蒙 NEXT】如何解决模块之间相互依赖问题
我们在业务开发时,会根据功能特点,划分不同的功能hsp模块,使得不同功能边界划分清晰,也能更好的将各个功能模块解耦,但是在一些业务复杂场景,难免会出现各个hsp模块之间存在相互依赖场景,比如A模块需要调用B模块的一个查询数据的方法,B模块也需要调用A模块一个查询数据的方法。但是模块之间又不能相互依赖,否则会造成app崩溃。那么如何解决这种模块之间相互依赖的问题呢?本节将介绍一种方法,希望给大家一个参考。我们可以先定义一个公共的模块common,该模块是一个最底层模块,不依赖任何其他模块。
2025-03-18 06:47:55
285
原创 九、【鸿蒙 NEXT】如何快速分析AppFreeze
在应用发布后,经常会遇到一些appFreeze的报错信息,那么我们可以如何快速的定位分析出问题点,本章就讲一下一些常用的判断方法,供大家参考。
2025-03-09 16:41:26
214
原创 八、【鸿蒙 NEXT】ArkTS开发中遇到的注意点
在实际开发中,经常遇到一些细节的点,可能在出现问题时,看代码逻辑,没有任何问题,但是运行结果就是不符合预期,本节将梳理一些这样的问题点,希望能帮助到大家。
2025-03-09 11:32:59
721
原创 七、【鸿蒙 NEXT】如何将多个图片合成一张图片
使用多媒体图片相关接口,将多个图片写入新图中,入参是一组图片流,怎么获取图片流可以参考上一篇文章,直接通过网络下载。或者将本地图片直接转为图片流。一般涉及聊天的场景,都会有用户头像展示,如果涉及群聊,群组的头像可能是多个头像拼接而成,本章就讲下如何实现图片拼接。比如,我要将最多4个头像拼接成一个40*40的图片,可以参考如下实现。2、使用图片接口,将多个图片流写入新的图片中。二、使用图片接口,将多个图片流写入新的图片中。1、纯粹采用布局实现图片拼接。一、纯粹采用布局实现图片拼接。
2025-03-07 22:18:03
257
原创 六、【鸿蒙 NEXT】如何实现图片下载,并保存本地
可能很多应用都会涉及网络图片的下载,本节将介绍下,如何在纯鸿蒙中实现图片的下载,并将图片保存到本地目录,或者直接保存到相册中。本节主要涉及以下几点:1、下载图片流2、将图片流转为Image组件能展示的对象PixelMap3、将图片保存到本地路径,路径由用户选择4、直接将图片保存到相册。
2025-02-26 23:19:17
298
原创 五、【纯血鸿蒙】如何抽取公共样式
开发过程中我们经常会遇到同一类型的组件样式都是一样的,如果每个组件都复制一份样式,代码会产生冗余,并且如果要改动这个样式,由于代码太分散,很容易改漏。那么纯血鸿蒙中如何抽取公共样式呢。主要分为两种(1)单个ets文件的样式抽取,这种方式抽取的样式只能在当前ets文件中共享。其他ets文件无法引用。(2)跨ets文件的公共样式抽取。1、使用@Styles装饰器,该装饰器只能抽取组件的通用属性及通用事件,比如height,width这些属于所有组件都有的属性,叫做通用属性这里有两种写法,一个是全局定义的需要加f
2025-02-23 17:20:56
324
原创 四、【纯血鸿蒙】关系型数据库创建与升级
在app开发过程中,关系型数据库基本都会用到,纯血鸿蒙的关系型数据库底层也是sqllite,只不过纯血鸿蒙用的是ArtTS语法写的。本章就讲解下如何用ArtTS语法来进行关系型数据库的创建与升级。
2025-02-23 16:33:03
410
原创 三、鸿蒙模块划分,hap/hsp/har三种模块如何选择
HAP(Harmony Ability Package)是应用安装和运行的基本单元。HAP包是由代码、资源、第三方库、配置文件等打包生成的模块包,其主要分为两种类型:entry和feature。entry:应用的主模块,作为应用的入口,提供了应用的基础功能。feature:应用的动态特性模块,作为应用能力的扩展,可以根据用户的需求和设备类型进行选择性安装。应用程序包可以只包含一个基础的entry包,也可以包含一个基础的entry包和多个功能性的feature包。
2024-09-01 16:07:10
1699
原创 一、鸿蒙原生开发语言:ArkTS语言介绍
ArkTS语言是官方主推的开发鸿蒙原生App应用的语言,该语言的语法和TypeScript比较相似,对于有前端基础的同学,学习起来应该比较容易。本节主要介绍下ArkTS与TypeScript的关系,以及ArkTS的特性。总结一句话,ArkTS是语法的定义,ArkUI是基于该语法的UI框架。集成了TS的语法,集成了目前流行的前端框架中的数据驱动UI的能力,并提供一套现成的UI框架,这样的一个超集
2024-08-25 16:09:15
1808
原创 harmonyOS鸿蒙-UI-自定义弹窗
上面代码中dialogController就是弹窗控制器,即CustomDialogController对象,该对象构造方法接收一个对象参数,其中builder对应值就是自定义的弹窗组件,需要@CustomDialog标注,alignment定义弹窗的位置,此处弹窗展示在底部,offset是弹窗相对于当前位置的偏移量,此处相对于底部再向上偏移24,效果如下。1、使用@CustomDialog装饰器装饰自定义弹窗,此装饰器内进行自定义内容(也就是弹框内容)2、创建构造器,与装饰器关联。
2023-07-02 22:33:32
1820
原创 harmonyOS鸿蒙-数据管理-用户首选项(@ohos.data.preferences)
用户首选项为应用提供key-value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。数据存储形式为键值对,键的类型为字符串,值得存储数据类型包括数字型、字符型、布尔型以及3种类型的数组类型。
2023-07-02 21:57:41
4401
1
原创 HarmonyOS-页面和自定义组件生命周期
1、自定义组件:@Component装饰的UI单元,可以组合多个系统组件实现UI复用2、页面:即应用的UI页面。可以由一个或者多个自定义组件组成,@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个@Entry。只有被@Entry装饰的组件才能调用页面的生命周期1、aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行2、aboutToDisappear:在自定义组件即将销毁时执行。
2023-07-02 17:05:35
1338
原创 鸿蒙-关系型数据库(@ohos.data.relationalStore)
update函数需要传入两个参数,第一个是需要更新的列值,是一个对象,key为列名,value是对应的值,第二个参数是一个条件对象,上面代码表示更新userInfo表中name='lisi'的age更新为66。batchInsert函数第一个参数是表名称,第二个参数是一个ValuesBucket数组对象,ValuesBucket表示key-value的对象,key表示表的列名称,value是对应的值。2、RdbPredicates 用来定义数据库的操作条件,可用于查询,修改,删除的条件语句。
2023-07-02 16:35:47
5369
2
原创 HiLog日志打印
业务调用日志打印公共类,因为我们公共日志类参数是一个可变数组,我们可以把第一个参数作为业务类型的TAG,比如下面的"EntryAbility",第二个参数传入要具体打印的日志,如下。4、用DevEco Studio查看日志。
2023-07-02 10:16:08
647
原创 Optional取代null
如果给定一个Person对象,想要获取对应保险公司的名称,那么为了防止空指针异常的出现,我们往往会这么获取,每次引用一个变量都会做一次null检查、if嵌套层数多,代码膨胀。在项目中我们经常遇到空指针异常,为了防止该异常发生,我们往往需要加一大堆的判断,来防止对象是null的场景。(1)Optional.ofNullable():创建一个可接受null的Optional对象。(3)orElse():当Optional对象中存储的值不存在时,返回一个默认值。为了防止空指针异常,我们往往会这么写。
2023-05-07 09:04:18
149
原创 Android之服务service
新建一个类,并继承Service类,并实现类的方法onCreate、onStartCommand、onDestory,者三个方法是最常用的,其中onCreate方法会在服务创建时调用,onStartCommand方法会在每次服务启动时调用。通常,如果希望服务一起动就去执行某个动作,可以把逻辑写在onStartCommand中。另外每个服务都需要在AndroidManifest.xml中注册才能生效。
2023-04-23 07:02:58
921
原创 Android 内容提供器
比如某个程序的包名是com.test.app,那么程序对应的authority可以命名为com.test.app.provider。那么以路径结尾的MIME类型可以写成vnd.android.cursor.dir/vnd.com.test.app.provider.table1,以id结尾的MIME类型可以写为:vnd.android.cursor.item/vnd.com.test.app.provider.table1。分别是从内容提供器中查询,新增,更新,删除数据。以读取联系人为例,步骤如下。
2023-04-20 07:15:45
138
原创 Android 持久化操作
(1)通过Context.getSharedPreferences获取SharedPreferences对象,第一个参数是文件名,如果文件不存在,则会创建文件,第二个参数是操作模式,目前只有MODE_PRIVATE一种模式可选,表示只有当前app才能对这个文件进行读写。(1)调用update方法,第一个参数是表名称,第二是ContentValues对象,第三个是where条件,第四个是where条件的参数,第三第四个参数不指定的话是更新所有。(4)调用Editor.apply方法提交键值对,存入文件中。
2023-04-13 06:50:59
149
原创 class.getResourceAsStream获取不到resources路径下的文件
1、现象,如下图,获取xml文件为空2、解决方案: 在Porject Sturcture->Modules中将resources文件夹设置为Resources目录,如下图
2022-02-25 08:01:04
5973
原创 重构改善既有代码设计总结之代码坏味道
一、代码坏味道1、神秘命名意义:使函数、模块、变量和类,能清晰的表明自己的功能和用法(如果想不出一个好名字,说明背后可能潜藏着更深的设计问题)常用重构手法:(1)改变函数声明(124)(2)变量改名(137)(3)字段改名(244)2、重复代码意义:如果要修改重复代码,你必须找出所有的副本来修改,如果在一个以上的地点看到相同代码结构,设法将它们合而为一常用重构手法:(1)“同一个类的两个函数含有相同表达式”可以提炼函数(106)提炼出重复代码(2)如果
2022-02-18 07:22:18
827
原创 重构改善既有代码设计总结之重构手法
106、提炼函数要点:(1)将意图和实现分开:如果需要花时间浏览一段代码才能弄清它到底在干什么,就该提炼到一个函数中,并根据期用途来命名(大多数时候根本不需要关心函数如何达成其意图,这是函数体内干的事)(2)一个大函数中,一段代码上放着一句注释,此时可以将代码提炼到自己函数中,注释往往提示一个好名字115、内联函数要点:(1)手上有一群组织不合理的函数,可以将它们内联到一个大函数中,再以合理的方式重新提炼小函数(2)间接性可能带来帮助,但非必要的间接性总是让人晕头转向,如果系
2022-02-18 07:20:24
342
原创 JS基础-变量类型和计算
一、思考:(1)typeof能判断哪些类型(2)何时使用===何时使用==(3)值类型和引用类型区别(4)如何实现深拷贝二、知识点:1、变量类型(1)值类型与引用类型深入分析:值类型:引用类型:常见值类型:常见引用类型(2)typeof运算符识别所有值类型识别函数判断是否是引用类型(不可再细分)(3)深拷贝const obj1 = { age: 20, ...
2022-02-13 11:49:34
542
原创 代码整洁之道总结
1、整洁的代码力求集中。每个函数、每个类和每个模块都全神关注于一事,完全不受四周细节的干扰和污染。2、不要重复代码,只做一件事,表达力,小规模抽象一、有意义的命名1、命名需要名副其实,一旦发现有更好的名称,就换掉旧的。如果名称需要注释来补充,那就不算名副其实2、以数字系列命名(a1、a2…aN)是依义命名的对立面,名称纯属误导,完全没有提供正确信息3、使用可搜索的名称,便于在项目中快速找到对应变量4、避免使用缩写,如接口的命名以I开头,可以直接把I去掉5、类名不应当是动词6、方法命名应当是动
2020-12-20 15:54:40
996
原创 Ract基础之恰当的获取数据二
1、创建一个组件来从服务端获取数据,并展示,如下import React from 'react'class Gists extends React.Component{ constructor(props) { super(props); this.state = { gists:[] } } componentDidMount() { console.log('向服务端发起请求获取数据,
2020-12-13 17:12:12
522
原创 Ract基础之恰当的获取数据一
1、创建一个简单的组件,点击增加按钮计数器加1,点击减法按钮,计数器减一,如下import React from 'react'export default class Counter extends React.Component{ constructor(props) { super(props); this.state = { counter: 0 } } handleDecrement = () =
2020-12-13 16:23:47
1036
原创 React基础之函数子组件
1、概念:不按组件的形式传递子组件,而是定义一个可以从父组件接收参数的函数import React from 'react'export const Name = ({children}) => children("world")Name组件中拥有定义为函数的children属性,并且没有按JSX表达式使用,而是作为函数被调用上述组件的用法如下:ReactDOM.render( <Name> {name => <div>Hello,
2020-12-13 11:11:49
1130
原创 React基础之高阶组件
1、高阶组件其实就是函数,它接收组件作为参数,对组件进行增强后返回const Hoc = Component => EnhancedComponet2、举例:如果要为每个组件添加相同的className。可以编写一个高阶组件const withClassName = Component => props => (<Component {...props} className="my-class"/>)3、举例:为每个组件添加事件监听window的窗口宽度变化,可以编
2020-12-13 10:11:02
121
原创 React开发可复用组件
1、prop类型(1)如果希望整个引用可以复用组件,关键要确保清晰的定义组件及其参数,以便能够直观使用。React提供了一个非常简单的表达组件接口的强大工具,只要提供组件期望接收的prop名称与对应的验证规则即可。import React from 'react';import PropTypes from 'prop-types';export default function Button({text}){ return <button>{text}</button
2020-12-12 22:54:11
295
原创 React基础总结
1、React工作方式state—》视图—》修改state—》newState----》新视图只要对state进行修改,React就会重新渲染视图,大量的DOM操作不会对页面性能有影响,React采用了一种虚拟DOM的核心技术,每一个组件都会生成一个虚拟DOM树,它是以纯对象的方式进行描述的,React会根据虚拟DOM来生成真实的DOM,组件中的数据变化会生成一个新的虚拟DOM,React会对比新旧的虚拟DOM,找出变化点,然后针对变化的节点进行重新渲染,极大提高了重新渲染的性能。2、React两个核
2020-11-08 10:57:03
123
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人