鸿蒙应用入门级开发者认证实验十(美食菜谱FunctionGraph)

权限名称表示申请访问互联网的权限,允许应用进行网络通信(如HTTP请求)。
"name": "ohos.permission.INTERNET"
系统授权(system_grant):安装应用时自动授予,无需用户手动操作(区别于需弹窗的user_grant权限)。此权限为基础权限,无需动态申请调用requestPermissionsFromUser方法。申请原因的文本,需在应用的resources/base/string.json资源文件中定义具体内容(如"reason": "需要网络权限加载食谱数据"),用于安装时向用户展示。
"reason": "$string:reason"
使用场景:abilities:仅限CookAbility组件使用该权限。when:inuse表示仅当应用在前台活跃状态时才启用权限(若为always则代表后台持续可用)。
"usedScene": {
"abilities": ["CookAbility"],
"when": "inuse"
}
DevEco Studio 执行预览功能的底层构建指令,调用构建工具链(HVIGOR):
hvigorw.js --mode module ... PreviewBuild --watch --analyze=normal --parallel --incremental --daemon
--watch:实时监听文件变化(保存代码时自动触发增量构建)--incremental:启用增量编译--parallel:并行执行构建任务--daemon:守护进程模式(保持后台运行加速后续构建)需要等待:首次预览需完整编译模块(如entry@default)、解析页面(view/LoginView)、处理资源文件等,耗时较长(比如PreBuild after 325 ms即资源初始化)。与标准 HAP 构建差异在于:跳过签名/优化步骤,生成轻量级 JS Bundle 而非完整 APK,动态注入预览器所需调试接口
在 HarmonyOS 5.0.0+ 中,getContext(component?: Object): Context 签名已被废弃,旧版 getContext() 返回通用 Context 类型,需要开发者手动强制转换(如 as common.UIAbilityContext)。新版 API 直接返回具体上下文类型,消除了强制转换需求。废弃旧签名也是为了统一上下文获取方式:在 UIAbility 中直接使用 this.context 获取 UIAbilityContext,在 UI 组件中使用 getUIContext() 获取 UIContext。新设计更好地支持 Stage 模型,明确区分不同场景的上下文获取方式,避免滥用通用上下文对象。
let context: common.UIAbilityContext= getContext(this) as common.UIAbilityContext
// 修改后的正确写法 (UIAbility 中)
let context: common.UIAbilityContext = this.context; // 直接访问属性
当声明 class CookAbility extends UIAbility 时,表示该组件需要独立窗口和用户界面,会出现在任务管理器中(占用任务槽位),系统会分配完整的界面生命周期管理。Ability 的两种核心类型
| 类型 | 特点 | 适用场景 |
|---|---|---|
| UIAbility | 带独立界面,拥有完整生命周期,在任务视图中显示 | 用户交互场景(主界面/设置页/播放页) |
| ServiceExtensionAbility | 无界面,纯后台运行,生命周期由系统管理 | 后台服务(数据同步/定时任务/音乐播放) |
let want: Want = {
bundleName: 'com.example.cookbooks',
abilityName: 'CookAbility',
parameters: { userInfo: this.username }
}
Want 对象本质是跨组件通信的媒介,用于指定目标 Ability(通过 bundleName + abilityName),携带参数(通过 parameters),定义启动模式(如单实例/标准模式)
Want 与 UI 组件的状态管理(如 @State/@Prop/@Link)是不同的通信机制,分别解决跨组件(Ability)通信和UI 内部状态同步问题。Want 是 Ability 间通信的载体,类似 Android 的 Intent。用于启动另一个 Ability(显式/隐式)、传递结构化数据(如跳转时携带参数)、实现跨进程通信(不同应用间的 Ability 交互)。单向、一次性的数据传递,不建立持久绑定关系。接收方通过 onCreate() 或 onNewWant() 解析数据。
UI 状态管理用于组件内数据流。状态装饰器用于同一 Ability 内 UI 组件的状态同步:@State 组件是私有状态,驱动自身 UI 刷新(如按钮是否禁用)。@Prop 父→子单向传递(只读),子组件不能修改源数据(适合配置参数)。@Link 父子双向绑定,共享同一数据源(如表单输入框与父组件实时同步)。状态装饰器通过 ArkUI 的响应式框架自动触发 UI 更新,而 Want 需手动解析数据。
| 维度 | Want | 状态装饰器(@State/@Prop/@Link) |
|---|---|---|
| 作用范围 | 跨 Ability(应用级) | 同一 Ability 内(UI 组件级) |
| 数据绑定 | 无绑定,一次性传递 | 自动响应式绑定 |
| 通信方向 | 单向 | 单向(@Prop)或双向(@Link) |
| 典型场景 | 页面跳转、服务调用 | 表单输入、动态列表更新 |
避免滥用 Want 传递高频更新数据——它不适合实时状态同步,而适合初始化参数传递。Want 是 Ability 间的“信使”,状态变量是 UI 组件的“神经系统”,共同构建鸿蒙的通信体系。
catch((error: BusinessError)=>{}) IDE 提示 Generic type 'BusinessError' requires 1 type argument(s) 的原因是当未通过 import 语句显式导入 BusinessError 时,TypeScript 编译器会将其视为泛型类型,要求指定类型参数(如 BusinessError<number>)。易误导开发者。导入后,BusinessError 会被识别为预定义的接口(非泛型),错误自动消失。
import { BusinessError } from '@kit.BasicServicesKit';
- 点赞
- 收藏
- 关注作者
评论(0)