HarmonyOS 5.0.0 或以上:封装 useDeviceType,实现多端设备识别与适配
问题说明忘记处理未知类型非主流设备上显示空白或报错设备类型未统一小写处理判断失效,应统一与混用混淆用于逻辑切换,适合响应式布局,二者结合更强大。
·
📌 应用场景
HarmonyOS 原生支持多设备协同,开发时经常需要根据设备类型(手机、平板、TV、手表等)动态切换 UI、逻辑或布局。
本篇封装 useDeviceType:
- ✅ 获取当前设备类型;
- ✅ 支持页面渲染判断;
- ✅ 可用于组件适配和逻辑切换。
🧩 Step 1:封装 useDeviceType Hook
// hooks/useDeviceType.ts
import deviceInfo from '@ohos.deviceInfo';
import { reactive } from '@ohos.arkui';
const deviceState = reactive({
deviceType: 'unknown',
isPhone: false,
isTablet: false,
isTv: false,
isWatch: false
});
export function useDeviceType() {
const type = deviceInfo.deviceType?.toLowerCase();
deviceState.deviceType = type;
deviceState.isPhone = type === 'phone';
deviceState.isTablet = type === 'tablet';
deviceState.isTv = type === 'tv';
deviceState.isWatch = type === 'wearable';
return {
deviceState
};
}
🧩 Step 2:页面中使用设备类型控制渲染
@Entry
@Component
struct DevicePage {
private device = useDeviceType();
build() {
Column() {
Text(`当前设备类型:${this.device.deviceState.deviceType}`)
.fontSize(18)
.padding(10)
If(this.device.deviceState.isPhone, () => {
Text("📱 手机模式").fontColor('#2196F3')
})
If(this.device.deviceState.isTablet, () => {
Text("📲 平板模式").fontColor('#4CAF50')
})
If(this.device.deviceState.isTv, () => {
Text("📺 电视模式").fontColor('#FF5722')
})
If(this.device.deviceState.isWatch, () => {
Text("⌚ 手表模式").fontColor('#9C27B0')
})
}
.padding(20)
}
}
✅ 效果说明
- 页面加载时自动检测设备类型;
- 可灵活根据不同设备渲染差异内容;
- 支持多端场景下自适应布局策略。
⚠️ 易错点总结
| 问题 | 说明 |
|---|---|
| 忘记处理未知类型 | 非主流设备上显示空白或报错 |
| 设备类型未统一小写处理 | 判断失效,应统一 .toLowerCase() |
与 useMediaQuery 混用混淆 |
useDeviceType 用于逻辑切换,useMediaQuery 适合响应式布局,二者结合更强大 |
🧠 拓展建议
- 搭配
useTheme和useMediaQuery做全端自适应样式; - 不同设备提供不同导航栏/菜单结构;
- 结合分布式特性,识别多设备协同场景。
更多推荐
所有评论(0)