1. 常见问题及解决方案
1.1 卡片显示异常
问题1:卡片白屏/内容不显示
可能原因:
- 页面路径配置错误
- 权限未声明(如网络权限)
- 代码运行时异常
解决方案:
-
检查form_config.json的src路径是否正确
json{ "src": "./ets/widget/pages/WidgetCard.ets" } // 确保路径正确
-
在module.json5中添加必要权限:
json"requestPermissions": [ { "name": "ohos.permission.INTERNET" }, { "name": "ohos.permission.KEEP_BACKGROUND_RUNNING" } ]
-
查看日志定位异常:
javascripttry { // 可能出错的代码 } catch (error) { console.error(`Widget error: ${JSON.stringify(error)}`); }
问题2:卡片尺寸适配错误
解决方案:
-
在form_config.json中声明支持的尺寸:
json"defaultDimension": "2*2", "supportDimensions": ["2*2", "2*4"]
-
使用相对单位(vp)而非固定像素
1.2 数据同步问题
问题1:卡片数据不刷新
可能原因:
- updateEnabled未设为true
- FormProvider.updateForm调用失败
- 卡片进程被系统终止
解决方案:
-
确保配置文件启用刷新:
json"updateEnabled": true, "updateDuration": 2 // 设置合理刷新间隔
-
检查formId是否有效:
javascriptformProvider.getFormsInfo((error, forms) => { if (!error) console.log('Current forms:', forms); });
问题2:应用与卡片数据不一致
解决方案:
-
使用数据库持久化卡片数据:
javascript// 保存数据 database.insert('formData', { formId, data: JSON.stringify(cardData) }); // 恢复数据 onAddForm() { const savedData = database.query('formData', { formId }); return formBindingData.createFormBindingData(savedData); }
1.3 性能问题
问题1:卡片占用内存过高
解决方案:
- 减少图片资源大小(建议<100KB/张)
- 关闭不必要的动画
- 避免在卡片中使用复杂组件(如List嵌套)
问题2:刷新时卡顿
解决方案:
-
异步加载数据:
typescriptonUpdate(formId: string) { // 使用TaskPool异步处理 taskPool.execute((formId) => { const newData = fetchData(); // 耗时操作 return { formId, newData }; }, formId).then(({ formId, newData }) => { formProvider.updateForm(formId, newData); }); }
2. 最佳实践
2.1 代码组织
-
分离关注点:将UI、数据逻辑、工具函数分离
-
复用代码:提取通用样式与工具方法到公共模块
yaml// 公共样式 export const CARD_STYLES = { container: { backgroundColor: '#FFFFFF', borderRadius: 16, padding: 16, shadow: { radius: 16, color: '#20000000', offsetY: 8 } } };
2.2 性能优化
-
延迟加载:非首屏内容使用条件渲染
-
图片优化:使用WebP格式,根据设备分辨率加载不同尺寸
-
事件节流:避免频繁触发updateForm
typescript// 使用节流控制刷新频率 throttleUpdateForm(formId: string, data: object, delay = 1000) { if (this.updateTimer) clearTimeout(this.updateTimer); this.updateTimer = setTimeout(() => { formProvider.updateForm(formId, data); }, delay); }
2.3 用户体验
- 加载状态:显示骨架屏或加载指示器
- 错误提示:网络异常时显示重试按钮
- 状态反馈:操作成功/失败给予明确提示
2.4 兼容性处理
-
API版本适配:使用@system.apiVersion判断版本
arduinoif (apiVersion >= 10) { // 使用新API } else { // 兼容旧版本实现 }
-
设备类型适配:根据设备调整布局
arduinoif (deviceType === 'wearable') { // 穿戴设备布局 } else { // 手机布局 }
3. 安全与合规
- 数据脱敏:卡片不展示敏感信息(如完整手机号)
- 权限最小化:仅申请必要权限
- 内容合规:不包含违规信息,符合应用市场审核要求
4. 测试建议
- 多尺寸测试:验证所有声明尺寸的显示效果
- 网络测试:在弱网/断网环境下测试降级策略
- 性能测试:使用DevEco Studio的性能分析工具监控内存占用
- 兼容性测试:在不同品牌鸿蒙设备上验证
5. 发布 checklist
- 所有尺寸卡片显示正常
- 数据刷新机制正常工作
- 内存占用<50MB
- 无崩溃与异常日志
- 符合华为应用市场卡片规范