欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。


在健康管理领域,睡眠质量监测是一项重要的功能。今天我们来深入分析一个基于 React Native 开发的智能睡眠分析应用,该应用结合智能设备数据,分析用户的深睡、浅睡比例,并提供改善睡眠的建议,为用户的健康管理提供科学依据。

React Native 现代开发技术栈

该应用采用了 React Native 现代开发技术栈,主要包括:

  • React Hooks:使用 useState 管理应用状态,useEffect 处理副作用逻辑(如自动分析睡眠数据并生成建议)
  • TypeScript:通过类型定义确保数据结构的一致性和代码的可维护性
  • 跨平台组件:使用 SafeAreaViewTouchableOpacityScrollViewModal 等实现跨平台兼容的用户界面
  • 响应式布局:利用 Dimensions API 获取屏幕尺寸,确保在不同设备上的良好显示效果
  • 基础组件:使用 ViewTextTextInput 等构建用户界面

用户信息,包含 ID、姓名、年龄和性别

应用通过 TypeScript 定义了三个核心数据类型,构建了完整的智能睡眠分析数据模型:

  • User:表示用户信息,包含 ID、姓名、年龄和性别
  • SleepData:表示睡眠数据,包含 ID、用户 ID、日期、深睡时间、浅睡时间和清醒时间
  • SleepAdvice:表示睡眠建议,包含 ID、用户 ID、建议内容和来源

这种强类型定义不仅提高了代码的可读性和可维护性,也为鸿蒙跨端适配提供了清晰的数据结构映射基础。

状态管理

应用采用了基于 useState 的轻量级状态管理方案,为不同功能模块分别管理状态:

  • 静态数据(用户列表)通过初始化的 useState 直接存储
  • 动态数据(睡眠数据、睡眠建议)通过 useState 管理,并支持添加新数据
  • 表单数据(新睡眠数据)通过独立的 useState 管理
  • 交互状态(选中的用户、模态框可见性)通过独立的 useState 管理

此外,应用使用 useEffect 钩子实现了自动分析睡眠数据并生成建议的功能,通过设置定时器定期为随机用户生成睡眠建议,模拟了智能分析的过程。


用户管理是应用的基础功能,通过列表展示用户的基本信息,包括姓名、年龄和性别。用户可以点击选择用户进行睡眠分析,为睡眠数据管理和建议生成提供明确的目标对象。

睡眠数据管理

睡眠数据管理是应用的核心功能,主要包括:

  • 展示用户的睡眠数据,包括日期、深睡时间、浅睡时间和清醒时间
  • 添加新的睡眠数据
  • 查看睡眠数据详细信息
  • 自动分析睡眠数据并生成建议

应用通过定时器自动分析睡眠数据并生成建议,模拟了智能设备数据的实时分析过程。

睡眠建议管理功能为用户提供了改善睡眠的科学建议:

  • 基于用户的睡眠数据生成个性化建议
  • 明确标注建议的来源,提高可信度
  • 为用户提供科学的睡眠改善指导

应用内置了基于权威机构的睡眠建议,如中国睡眠研究会和美国睡眠基金会的建议,为用户提供专业、可靠的健康指导。

应用通过卡片式布局展示用户信息、睡眠数据和睡眠建议,使用 TouchableOpacity 组件实现交互功能,点击卡片后可以查看详细信息或执行相关操作。此外,应用使用 Modal 组件展示详细信息,提升了用户体验。


组件映射

在鸿蒙 OS 适配过程中,需要注意以下组件映射:

  • SafeAreaView:在鸿蒙上需要使用 SafeArea 组件或自定义适配
  • TouchableOpacity:对应鸿蒙的 ButtonText 组件配合点击事件
  • ScrollView:对应鸿蒙的 ListContainerScroll 组件
  • Modal:对应鸿蒙的 Dialog 组件
  • Alert:对应鸿蒙的 ToastDialogAlertDialog 组件
  • TextInput:对应鸿蒙的 TextField 组件

鸿蒙 OS 对 Flexbox 布局的支持与 React Native 基本一致,但在细节上仍需注意:

  • 确保样式命名符合鸿蒙规范
  • 调整间距和尺寸以适应鸿蒙设备的显示特性
  • 注意字体大小和行高的适配
  • 对于表单输入控件,需要适配鸿蒙的输入框样式和交互方式

在鸿蒙跨端开发中,性能优化是一个重要考虑因素:

  • 使用 memo 优化组件渲染,特别是对于用户列表、睡眠数据列表等重复渲染的场景
  • 合理使用 useCallbackuseMemo 减少不必要的计算
  • 优化图片资源,考虑使用鸿蒙的资源加载机制
  • 对于定时器,考虑使用鸿蒙的定时器 API 以获得更好的性能
  • 对于列表数据的渲染,考虑使用虚拟化技术减少内存占用

智能睡眠分析

应用的核心创新点是智能睡眠分析功能:

  • 通过定时器自动分析睡眠数据
  • 为用户生成个性化的睡眠建议
  • 模拟了智能设备数据的实时分析过程
  • 基于权威机构的建议提供科学指导

这种智能睡眠分析比传统的睡眠监测更具价值,能够帮助用户更好地了解和改善睡眠质量。

应用实现了完整的睡眠数据管理:

  • 记录用户的详细睡眠数据
  • 分析深睡、浅睡和清醒时间的比例
  • 基于睡眠数据生成改善建议
  • 支持用户信息管理和数据添加

这种完整的睡眠数据管理为用户提供了从数据收集到分析建议的全方位睡眠管理服务。

应用通过 useEffect 和定时器实现了实时建议生成功能,定期为用户生成睡眠建议。这种设计不仅增强了应用的交互性,也为用户提供了持续的睡眠改善指导。

应用采用了清晰的模块化设计:

  • 功能按模块划分(用户管理、睡眠数据管理、睡眠建议管理)
  • 组件职责单一,便于维护和扩展
  • 状态管理逻辑与 UI 渲染分离

Base64 图标库

应用使用 Base64 编码的图标,这种方式有几个优点:

  • 减少网络请求,提高加载速度
  • 避免图标资源的跨平台适配问题
  • 减小应用包体积

虽然示例中使用的是占位 Base64 编码,但实际应用中可以使用真实的图标编码。


文件结构

示例代码集中在 App.tsx 文件中,适合小型应用。对于大型应用,建议按功能模块拆分文件:

  • /components:存放可复用组件,如用户卡片、睡眠数据卡片、建议卡片等

  • /types:存放类型定义,如 User、SleepData、SleepAdvice 等

  • /hooks:存放自定义 hooks,如睡眠数据分析逻辑、建议生成逻辑等

  • /services:存放 API 调用和业务逻辑,如数据存储、智能分析服务等

  • /utils:存放工具函数,如日期处理、数据格式化等

  • 命名规范:变量和函数命名清晰,符合语义化要求

  • 类型安全:使用 TypeScript 确保类型安全

  • 错误处理:通过条件判断处理可能的异常情况,如表单验证

  • 注释:代码结构清晰,关键部分有适当注释

  • 性能考虑:合理使用 React Hooks,避免不必要的渲染和计算

应用架构具有良好的扩展性:

  • 可以轻松添加新的用户类型和睡眠数据类型
  • 可以集成真实的智能设备数据,实现实时睡眠监测
  • 可以扩展支持更多的睡眠分析指标,如睡眠效率、睡眠质量评分等
  • 可以集成云服务,实现数据的云端存储和多设备同步
  • 可以添加数据可视化功能,如睡眠趋势图表、睡眠质量对比等

这个智能睡眠分析应用展示了如何使用 React Native 构建功能完备的睡眠管理工具,特别是在智能睡眠分析和实时建议生成方面的实践具有重要参考价值。通过跨端开发技术,可以在不同平台为用户提供一致的服务体验。

随着人们对健康管理重视程度的提高,这类智能睡眠分析应用的需求将不断增长。未来可以考虑:

  • 集成更多智能设备,实现睡眠数据的自动采集和分析
  • 利用 AI 技术根据用户的睡眠数据提供更个性化的睡眠建议
  • 支持更多的睡眠监测指标,如睡眠呼吸暂停、打鼾等
  • 开发配套的智能硬件,如智能床垫、智能枕头等
  • 与医疗机构合作,为睡眠障碍患者提供专业的诊断和治疗建议

React Native 鸿蒙跨端开发代表了移动应用开发的未来趋势,通过一套代码库覆盖多个平台,不仅可以降低开发成本,还可以确保用户体验的一致性。在健康管理应用领域,这种开发模式尤为重要,因为它可以让开发者更专注于核心功能的实现,而不是平台差异的处理。


在健康管理领域,智能睡眠分析应用需要兼顾数据采集、实时分析、多端同步等核心能力,React Native 凭借“一次开发,多端运行”的特性成为这类应用的核心技术选型,而鸿蒙(HarmonyOS)的分布式能力则为睡眠数据的跨设备流转与分析提供了全新的技术维度。本文以智能睡眠分析应用为例,深度拆解 React Native 应用的核心技术架构,并系统阐述其向鸿蒙生态跨端适配的关键技术路径与最佳实践。

一、聚焦于睡眠数据采集、分析与个性化建议生成

本次案例中的智能睡眠分析应用,聚焦于睡眠数据采集、分析与个性化建议生成,其技术架构充分体现了 React Native 函数式组件开发的轻量化、高复用特性,同时兼顾了健康数据管理的专业性与实时性:

1. 强类型数据模型:

应用基于 TypeScript 构建了完整的睡眠健康数据模型体系,从用户基础信息到睡眠监测数据、个性化建议,形成了闭环的数据链路,这是健康类应用保证数据准确性与跨端复用性的核心基础:

// 用户基础模型:健康数据的核心关联维度
type User = {
  id: string;
  name: string;
  age: number;
  gender: string; // 性别维度为睡眠建议的个性化提供依据
};

// 睡眠数据模型:核心监测指标的标准化定义
type SleepData = {
  id: string;
  userId: string; // 关联用户ID,实现数据归属
  date: string;
  deepSleep: number; // 深睡时长(分钟),量化睡眠质量核心指标
  lightSleep: number; // 浅睡时长(分钟)
  awakeTime: number; // 夜间清醒时长(分钟)
};

// 睡眠建议模型:个性化健康指导的载体
type SleepAdvice = {
  id: string;
  userId: string;
  advice: string; // 建议内容,适配不同用户的睡眠特征
  source: string; // 建议来源,保证健康指导的专业性
};

这套数据模型遵循“用户-数据-建议”的业务逻辑,所有字段均采用基础数据类型,无平台相关依赖,为跨端数据流转与解析奠定了纯净的结构化基础,同时强类型定义也避免了因数据类型错误导致的睡眠分析结果异常。

2. 状态管理

应用采用 React 核心 Hooks(useState/useEffect)实现轻量化状态管理,同时封装了睡眠数据的实时分析逻辑,体现了健康类应用“数据实时更新、状态精准响应”的特性:

  • 基础数据状态users(用户列表)、sleepData(睡眠监测数据)、sleepAdvices(睡眠建议)作为核心业务数据,采用不可变数据模式更新,保证数据变更的可追溯性;
  • 交互状态selectedUser 标记当前分析的用户,newSleepData 管理新增睡眠数据的表单状态,isModalVisible/modalContent 封装通用弹窗逻辑,统一处理数据详情与建议展示;
  • 实时分析逻辑:通过 useEffect 结合定时器实现睡眠建议的自动生成,模拟智能分析引擎的实时输出能力:
    useEffect(() => {
      const interval = setInterval(() => {
        const randomUser = users[Math.floor(Math.random() * users.length)];
        const newAdvice: SleepAdvice = {
          id: (sleepAdvices.length + 1).toString(),
          userId: randomUser.id,
          advice: '建议保持规律作息,避免睡前使用电子设备',
          source: '中国睡眠研究会'
        };
        setSleepAdvices(prevAdvices => [...prevAdvices, newAdvice]);
      }, 10000);
    
      return () => clearInterval(interval);
    }, [users, sleepAdvices]);
    
    这里的关键技术点在于 useEffect 的依赖数组与清理函数:依赖数组 [users, sleepAdvices] 保证定时器逻辑仅在依赖变更时重新执行,清理函数 clearInterval 则避免组件卸载后定时器泄漏,这是 React Native 处理异步/定时任务的最佳实践,也为鸿蒙适配时的生命周期管理提供了清晰的逻辑参考。

3. 数据交互与校验:

睡眠数据作为健康分析的核心依据,其完整性与准确性至关重要,应用通过表单校验与数据类型转换实现了数据录入的规范化:

const handleAddSleepData = () => {
  if (newSleepData.date && newSleepData.deepSleep && newSleepData.lightSleep && newSleepData.awakeTime) {
    const newSleepEntry: SleepData = {
      id: (sleepData.length + 1).toString(),
      userId: selectedUser || '',
      date: newSleepData.date,
      deepSleep: parseInt(newSleepData.deepSleep), // 字符串转数字,保证数据类型统一
      lightSleep: parseInt(newSleepData.lightSleep),
      awakeTime: parseInt(newSleepData.awakeTime)
    };
    setSleepData([...sleepData, newSleepEntry]); // 不可变更新,避免原数组污染
    setNewSleepData({ date: '', deepSleep: '', lightSleep: '', awakeTime: '' });
    Alert.alert('添加成功', '新的睡眠数据已添加');
  } else {
    Alert.alert('提示', '请填写完整的睡眠数据');
  }
};

数据类型转换(parseInt)与完整性校验是健康类应用的基础要求,这段逻辑完全基于 ES6+ 标准语法,无任何 React Native 平台特定 API,可直接复用于鸿蒙端,体现了“业务逻辑与UI解耦”的跨端开发思想。

4. UI 组件

应用基于 React Native 基础组件构建了符合健康类应用特性的 UI 体系,兼顾了易用性与专业性:

  • 分层布局结构SafeAreaView 保障不同设备的安全区域适配,ScrollView 承载长列表数据(睡眠记录、建议列表),View 实现模块化分区,形成“头部-数据录入-数据分析-建议展示”的清晰业务流程;
  • 交互设计优化
    • 用户选择:通过 selectedCard 样式实现选中状态高亮,直观反馈当前分析对象;
    • 数据展示:采用卡片式布局展示睡眠数据,核心指标(深睡/浅睡时长)突出显示,符合健康数据的可视化规范;
    • 弹窗交互:通过 Modal 组件实现详情弹窗,采用 slide 动画提升交互体验,同时 transparent 属性保证弹窗的沉浸感;
  • 样式系统StyleSheet.create 封装统一的样式规范,Flex 布局实现卡片的自适应排列,elevation/shadow 属性增强视觉层级,所有样式属性均为 React Native 跨平台通用属性,无平台硬编码,为鸿蒙适配降低了样式迁移成本。

鸿蒙系统的分布式能力与健康类应用的跨设备数据管理需求高度契合,将智能睡眠分析应用适配到鸿蒙生态,核心在于“复用业务逻辑,适配底层组件,扩展分布式能力”:

1. 适配方案选型:

针对本应用的轻量级特性与健康数据的实时性要求,优先选择“React Native 业务逻辑复用 + 鸿蒙 ArkUI 组件替换”的适配方案,核心原则是:

  • 100% 复用纯业务逻辑:用户管理、睡眠数据校验、建议生成、定时器分析等纯 JS/TS 逻辑代码无需修改,直接迁移到鸿蒙工程;
  • 组件层精准映射:将 React Native 组件替换为鸿蒙 ArkUI 组件,保持布局结构与交互逻辑一致,核心组件映射关系如下:
React Native 组件 鸿蒙 ArkUI 组件 适配核心要点
SafeAreaView SafeArea + Column 鸿蒙通过 SafeArea 组件实现安全区域适配,外层嵌套 Column 保持布局结构
View Stack/Column/Row 根据布局方向选择鸿蒙容器组件,语义更明确
Text Text 属性基本兼容,仅调整样式属性命名(如 fontWeight: 'bold'fontWeight: FontWeight.Bold
TouchableOpacity Button/Text(绑定 onClick 鸿蒙无 TouchableOpacity 组件,通过 ButtonText 绑定点击事件实现交互
ScrollView Scroll 滚动容器属性完全兼容,仅调整样式写法
Modal Dialog 鸿蒙通过 Dialog 组件实现弹窗,适配显隐控制逻辑
TextInput Input 输入框属性基本兼容,onChangeTextonChange 事件回调,数字键盘通过 type: InputType.Number 实现

以睡眠数据卡片为例,鸿蒙适配后的核心代码示例:

// 鸿蒙 TS/JS 适配代码
@Entry
@Component
struct SleepDataCard {
  @State sleepData: SleepData[] = [...]; // 复用原睡眠数据
  @State users: User[] = [...]; // 复用原用户数据

  build() {
    Column() {
      ForEach(this.sleepData, (data) => {
        Stack({ direction: Direction.Horizontal }) {
          Text('📊').fontSize(28).marginRight(12);
          Column() {
            Text(`记录ID: ${data.id}`).fontSize(16).fontWeight(FontWeight.Medium);
            Text(`日期: ${data.date}`).fontSize(14);
            Text(`深睡: ${data.deepSleep}分钟`).fontSize(14);
            Text(`浅睡: ${data.lightSleep}分钟`).fontSize(14);
            Text(`清醒: ${data.awakeTime}分钟`).fontSize(14);
          }.flexGrow(1);
        }
        .backgroundColor('#f0f9ff')
        .borderRadius(12)
        .padding(16)
        .marginBottom(12)
        .onClick(() => this.handleViewSleepData(data.id));
      })
    }
  }

  // 完全复用原 handleViewSleepData 逻辑
  handleViewSleepData(dataId: string) {
    const data = this.sleepData.find(d => d.id === dataId);
    if (data) {
      const user = this.users.find(u => u.id === data.userId);
      // 鸿蒙 Dialog 弹窗逻辑
      this.modalContent = `用户: ${user?.name}\n日期: ${data.date}\n深睡: ${data.deepSleep}分钟\n浅睡: ${data.lightSleep}分钟\n清醒: ${data.awakeTime}分钟`;
      this.isModalVisible = true;
    }
  }
}

React Native 基于 React Hooks 实现状态管理,而鸿蒙 JS/TS 框架采用装饰器模式的状态管理,核心适配要点如下:

  • 状态定义适配:React 的 useState → 鸿蒙的 @State/@Link 装饰器,例如:
    // React Native 状态定义
    const [selectedUser, setSelectedUser] = useState<string | null>(null);
    
    // 鸿蒙适配后
    @State selectedUser: string | null = null;
    
  • 不可变更新适配:React Native 中通过 setSleepData([...sleepData, newEntry]) 的不可变更新方式,在鸿蒙中可直接通过数组操作实现,因为鸿蒙的 @State 装饰器会监听数组的变更:
    // 鸿蒙中添加睡眠数据
    handleAddSleepData(newEntry: SleepData) {
      this.sleepData = [...this.sleepData, newEntry];
    }
    
  • 定时器/生命周期适配:React Native 的 useEffect 定时器逻辑,在鸿蒙中适配为 onPageShow + clearInterval,保证组件生命周期的一致性:
    // 鸿蒙中实现睡眠建议自动生成
    private intervalId: number = 0;
    
    onPageShow() {
      this.intervalId = setInterval(() => {
        const randomUser = this.users[Math.floor(Math.random() * this.users.length)];
        const newAdvice: SleepAdvice = {
          id: (this.sleepAdvices.length + 1).toString(),
          userId: randomUser.id,
          advice: '建议保持规律作息,避免睡前使用电子设备',
          source: '中国睡眠研究会'
        };
        this.sleepAdvices = [...this.sleepAdvices, newAdvice];
      }, 10000);
    }
    
    onPageHide() {
      clearInterval(this.intervalId); // 页面隐藏时清理定时器
    }
    

适配鸿蒙的核心价值不仅是“多端运行”,更是利用其分布式能力提升睡眠分析应用的核心体验:

  • 分布式数据同步:将 sleepData 睡眠监测数据存储到鸿蒙分布式数据中心,实现手机端采集睡眠数据、平板端分析睡眠报告、智慧屏端展示睡眠建议的跨设备数据同步,适配代码示例:
    // 鸿蒙分布式数据存储
    import distributedData from '@ohos.data.distributedData';
    
    // 初始化分布式数据存储
    private kvStore: distributedData.KVStore = null;
    
    async onInit() {
      const kvManager = distributedData.createKVManager({
        context: getContext(this),
        bundleName: 'com.example.smartsleep'
      });
      this.kvStore = await kvManager.getKVStore('sleep_data_store');
    }
    
    // 存储睡眠数据到分布式存储
    saveSleepDataToDistributedStore(data: SleepData) {
      this.kvStore.put(`sleep_${data.id}`, JSON.stringify(data));
    }
    
  • 分布式任务调度:将睡眠数据分析(如深睡比例计算、睡眠质量评分)等耗性能任务,分发到性能更强的鸿蒙设备(如平板/PC)执行,提升手机端的运行流畅度;
  • 跨设备交互:支持在智能穿戴设备(如鸿蒙手表)采集的睡眠数据自动同步到手机/平板应用,实现“采集-分析-建议”的全链路跨设备协同。

4. 样式

React Native 的 Flex 布局与鸿蒙的 Flex 布局语法高度兼容,仅需少量样式属性适配即可保证视觉体验的一致性:

  • 样式属性命名适配:React Native 的 flexDirection: 'row' → 鸿蒙的 flexDirection: FlexDirection.RowalignItems: 'center'alignItems: ItemAlign.Center
  • 尺寸单位适配:React Native 的 padding: 16(逻辑像素),在鸿蒙中保持一致,鸿蒙会自动适配不同设备的像素密度;
  • 阴影效果适配:React Native 的 elevation/shadow 属性,在鸿蒙中通过 shadow 组件实现,保持视觉效果一致:
    // React Native 阴影样式
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.1,
    shadowRadius: 4,
    
    // 鸿蒙适配后
    .shadow({
      color: '#000',
      offsetX: 0,
      offsetY: 2,
      opacity: 0.1,
      radius: 4
    })
    

针对智能睡眠分析这类健康类跨端应用,核心最佳实践需兼顾数据准确性、实时性与多端体验一致性:

  1. 数据模型的标准化:采用 TypeScript 强类型定义所有健康数据,确保跨端数据解析的一致性,避免因数据类型错误导致的睡眠分析结果异常;
  2. 业务逻辑与UI解耦:将睡眠数据校验、建议生成、定时器分析等核心逻辑封装为纯函数,与 UI 组件解耦,保证跨端复用性;
  3. 列表性能优化:在鸿蒙端将 map 渲染的长列表(如睡眠记录列表、建议列表)替换为鸿蒙的 LazyForEach 组件,实现列表项的懒加载,降低内存占用;
  4. 定时器管理优化:在鸿蒙端通过 onPageShow/onPageHide 生命周期精准管理定时器,避免后台定时器泄漏,保证应用性能;
  5. 分布式数据安全:睡眠数据属于用户隐私数据,在鸿蒙分布式存储中需开启数据加密,保证用户健康数据的安全性。

真实演示案例代码:






// App.tsx
import React, { useState, useEffect } from 'react';
import { SafeAreaView, View, Text, StyleSheet, TouchableOpacity, ScrollView, Dimensions, Alert, TextInput, Modal } from 'react-native';

// Base64 图标库
const ICONS_BASE64 = {
  sleep: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==',
  device: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==',
  analysis: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==',
  advice: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==',
};

const { width, height } = Dimensions.get('window');

// 用户类型
type User = {
  id: string;
  name: string;
  age: number;
  gender: string;
};

// 睡眠数据类型
type SleepData = {
  id: string;
  userId: string;
  date: string;
  deepSleep: number;
  lightSleep: number;
  awakeTime: number;
};

// 睡眠建议类型
type SleepAdvice = {
  id: string;
  userId: string;
  advice: string;
  source: string;
};

// 智能睡眠分析应用组件
const SmartSleepAnalysisApp: React.FC = () => {
  const [users] = useState<User[]>([
    {
      id: '1',
      name: '李先生',
      age: 45,
      gender: '男'
    },
    {
      id: '2',
      name: '王女士',
      age: 32,
      gender: '女'
    }
  ]);

  const [sleepData, setSleepData] = useState<SleepData[]>([
    {
      id: '1',
      userId: '1',
      date: '2023-12-01',
      deepSleep: 180,
      lightSleep: 240,
      awakeTime: 30
    },
    {
      id: '2',
      userId: '2',
      date: '2023-12-01',
      deepSleep: 150,
      lightSleep: 270,
      awakeTime: 45
    }
  ]);

  const [sleepAdvices, setSleepAdvices] = useState<SleepAdvice[]>([
    {
      id: '1',
      userId: '1',
      advice: '建议保持规律作息,避免睡前使用电子设备',
      source: '中国睡眠研究会'
    },
    {
      id: '2',
      userId: '2',
      advice: '建议睡前进行放松训练,如冥想或深呼吸',
      source: '美国睡眠基金会'
    }
  ]);

  const [selectedUser, setSelectedUser] = useState<string | null>(null);
  const [newSleepData, setNewSleepData] = useState({
    date: '',
    deepSleep: '',
    lightSleep: '',
    awakeTime: ''
  });
  const [isModalVisible, setIsModalVisible] = useState(false);
  const [modalContent, setModalContent] = useState('');

  // 自动分析睡眠数据并生成建议
  useEffect(() => {
    const interval = setInterval(() => {
      const randomUser = users[Math.floor(Math.random() * users.length)];
      const newAdvice: SleepAdvice = {
        id: (sleepAdvices.length + 1).toString(),
        userId: randomUser.id,
        advice: '建议保持规律作息,避免睡前使用电子设备',
        source: '中国睡眠研究会'
      };
      setSleepAdvices(prevAdvices => [...prevAdvices, newAdvice]);
    }, 10000);

    return () => clearInterval(interval);
  }, [users, sleepAdvices]);

  const handleSelectUser = (userId: string) => {
    setSelectedUser(userId);
    Alert.alert('选择用户', '您已选择该用户进行睡眠分析');
  };

  const handleAddSleepData = () => {
    if (newSleepData.date && newSleepData.deepSleep && newSleepData.lightSleep && newSleepData.awakeTime) {
      const newSleepEntry: SleepData = {
        id: (sleepData.length + 1).toString(),
        userId: selectedUser || '',
        date: newSleepData.date,
        deepSleep: parseInt(newSleepData.deepSleep),
        lightSleep: parseInt(newSleepData.lightSleep),
        awakeTime: parseInt(newSleepData.awakeTime)
      };
      setSleepData([...sleepData, newSleepEntry]);
      setNewSleepData({ date: '', deepSleep: '', lightSleep: '', awakeTime: '' });
      Alert.alert('添加成功', '新的睡眠数据已添加');
    } else {
      Alert.alert('提示', '请填写完整的睡眠数据');
    }
  };

  const handleViewSleepData = (dataId: string) => {
    const data = sleepData.find(d => d.id === dataId);
    if (data) {
      const user = users.find(u => u.id === data.userId);
      setModalContent(`用户: ${user?.name}\n日期: ${data.date}\n深睡: ${data.deepSleep}分钟\n浅睡: ${data.lightSleep}分钟\n清醒: ${data.awakeTime}分钟`);
      setIsModalVisible(true);
    }
  };

  const handleViewAdvice = (adviceId: string) => {
    const advice = sleepAdvices.find(a => a.id === adviceId);
    if (advice) {
      const user = users.find(u => u.id === advice.userId);
      setModalContent(`用户: ${user?.name}\n建议: ${advice.advice}\n来源: ${advice.source}`);
      setIsModalVisible(true);
    }
  };

  const openModal = (content: string) => {
    setModalContent(content);
    setIsModalVisible(true);
  };

  const closeModal = () => {
    setIsModalVisible(false);
  };

  return (
    <SafeAreaView style={styles.container}>
      {/* 头部 */}
      <View style={styles.header}>
        <Text style={styles.title}>智能睡眠分析</Text>
        <Text style={styles.subtitle}>结合智能设备数据,分析深睡、浅睡比例,提供改善睡眠建议</Text>
      </View>

      <ScrollView style={styles.content}>
        {/* 用户列表 */}
        <View style={styles.section}>
          <Text style={styles.sectionTitle}>用户列表</Text>
          {users.map(user => (
            <TouchableOpacity 
              key={user.id}
              style={[
                styles.card,
                selectedUser === user.id && styles.selectedCard
              ]}
              onPress={() => handleSelectUser(user.id)}
            >
              <Text style={styles.icon}>👤</Text>
              <View style={styles.cardInfo}>
                <Text style={styles.cardTitle}>{user.name}</Text>
                <Text style={styles.cardDescription}>年龄: {user.age}</Text>
                <Text style={styles.cardDescription}>性别: {user.gender}</Text>
              </View>
            </TouchableOpacity>
          ))}
        </View>

        {/* 添加睡眠数据 */}
        <View style={styles.section}>
          <Text style={styles.sectionTitle}>添加睡眠数据</Text>
          <View style={styles.inputRow}>
            <TextInput
              style={styles.input}
              placeholder="日期 (YYYY-MM-DD)"
              value={newSleepData.date}
              onChangeText={(text) => setNewSleepData({ ...newSleepData, date: text })}
            />
            <TextInput
              style={styles.input}
              placeholder="深睡 (分钟)"
              value={newSleepData.deepSleep}
              onChangeText={(text) => setNewSleepData({ ...newSleepData, deepSleep: text })}
              keyboardType="numeric"
            />
          </View>
          <View style={styles.inputRow}>
            <TextInput
              style={styles.input}
              placeholder="浅睡 (分钟)"
              value={newSleepData.lightSleep}
              onChangeText={(text) => setNewSleepData({ ...newSleepData, lightSleep: text })}
              keyboardType="numeric"
            />
            <TextInput
              style={styles.input}
              placeholder="清醒 (分钟)"
              value={newSleepData.awakeTime}
              onChangeText={(text) => setNewSleepData({ ...newSleepData, awakeTime: text })}
              keyboardType="numeric"
            />
          </View>
          <TouchableOpacity 
            style={styles.addButton}
            onPress={handleAddSleepData}
          >
            <Text style={styles.addText}>添加数据</Text>
          </TouchableOpacity>
        </View>

        {/* 睡眠数据分析 */}
        <View style={styles.section}>
          <Text style={styles.sectionTitle}>睡眠数据分析</Text>
          {sleepData.map(data => (
            <TouchableOpacity 
              key={data.id}
              style={styles.dataCard}
              onPress={() => handleViewSleepData(data.id)}
            >
              <Text style={styles.icon}>📊</Text>
              <View style={styles.cardInfo}>
                <Text style={styles.cardTitle}>记录ID: {data.id}</Text>
                <Text style={styles.cardDescription}>日期: {data.date}</Text>
                <Text style={styles.cardDescription}>深睡: {data.deepSleep}分钟</Text>
                <Text style={styles.cardDescription}>浅睡: {data.lightSleep}分钟</Text>
                <Text style={styles.cardDescription}>清醒: {data.awakeTime}分钟</Text>
              </View>
            </TouchableOpacity>
          ))}
        </View>

        {/* 睡眠建议 */}
        <View style={styles.section}>
          <Text style={styles.sectionTitle}>睡眠建议</Text>
          {sleepAdvices.map(advice => (
            <TouchableOpacity 
              key={advice.id}
              style={styles.adviceCard}
              onPress={() => handleViewAdvice(advice.id)}
            >
              <Text style={styles.icon}>💡</Text>
              <View style={styles.cardInfo}>
                <Text style={styles.cardTitle}>建议ID: {advice.id}</Text>
                <Text style={styles.cardDescription}>{advice.advice}</Text>
                <Text style={styles.cardDescription}>来源: {advice.source}</Text>
              </View>
            </TouchableOpacity>
          ))}
        </View>

        {/* 使用说明 */}
        <View style={styles.infoCard}>
          <Text style={styles.sectionTitle}>📘 使用说明</Text>
          <Text style={styles.infoText}>• 选择用户进行睡眠分析</Text>
          <Text style={styles.infoText}>• 添加睡眠数据进行记录</Text>
          <Text style={styles.infoText}>• 查看睡眠数据分析结果</Text>
          <Text style={styles.infoText}>• 获取个性化的睡眠改善建议</Text>
        </View>

        {/* 弹框内容 */}
        <Modal
          animationType="slide"
          transparent={true}
          visible={isModalVisible}
          onRequestClose={closeModal}
        >
          <View style={styles.modalContainer}>
            <View style={styles.modalContent}>
              <Text style={styles.modalTitle}>详细信息</Text>
              <Text style={styles.modalText}>{modalContent}</Text>
              <TouchableOpacity
                style={styles.closeButton}
                onPress={closeModal}
              >
                <Text style={styles.closeButtonText}>关闭</Text>
              </TouchableOpacity>
            </View>
          </View>
        </Modal>
      </ScrollView>
    </SafeAreaView>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#f0f9ff',
  },
  header: {
    flexDirection: 'column',
    padding: 16,
    backgroundColor: '#ffffff',
    borderBottomWidth: 1,
    borderBottomColor: '#bae6fd',
  },
  title: {
    fontSize: 20,
    fontWeight: 'bold',
    color: '#0c4a6e',
    marginBottom: 4,
  },
  subtitle: {
    fontSize: 14,
    color: '#0284c7',
  },
  content: {
    flex: 1,
    marginTop: 12,
  },
  section: {
    backgroundColor: '#ffffff',
    marginHorizontal: 16,
    marginBottom: 12,
    borderRadius: 12,
    padding: 16,
    elevation: 2,
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.1,
    shadowRadius: 4,
  },
  sectionTitle: {
    fontSize: 16,
    fontWeight: '600',
    color: '#0c4a6e',
    marginBottom: 12,
  },
  card: {
    flexDirection: 'row',
    alignItems: 'center',
    backgroundColor: '#f0f9ff',
    borderRadius: 12,
    padding: 16,
    marginBottom: 12,
  },
  selectedCard: {
    borderWidth: 2,
    borderColor: '#0284c7',
  },
  dataCard: {
    flexDirection: 'row',
    alignItems: 'center',
    backgroundColor: '#f0f9ff',
    borderRadius: 12,
    padding: 16,
    marginBottom: 12,
  },
  adviceCard: {
    flexDirection: 'row',
    alignItems: 'center',
    backgroundColor: '#f0f9ff',
    borderRadius: 12,
    padding: 16,
    marginBottom: 12,
  },
  icon: {
    fontSize: 28,
    marginRight: 12,
  },
  cardInfo: {
    flex: 1,
  },
  cardTitle: {
    fontSize: 16,
    fontWeight: '500',
    color: '#0c4a6e',
    marginBottom: 4,
  },
  cardDescription: {
    fontSize: 14,
    color: '#0284c7',
    marginBottom: 2,
  },
  inputRow: {
    flexDirection: 'row',
    justifyContent: 'space-between',
    marginBottom: 12,
  },
  input: {
    flex: 1,
    backgroundColor: '#f0f9ff',
    borderRadius: 8,
    paddingHorizontal: 12,
    paddingVertical: 8,
    fontSize: 14,
    color: '#0c4a6e',
    marginRight: 8,
  },
  addButton: {
    backgroundColor: '#0284c7',
    padding: 12,
    borderRadius: 8,
    alignItems: 'center',
  },
  addText: {
    color: '#ffffff',
    fontSize: 14,
    fontWeight: '500',
  },
  infoCard: {
    backgroundColor: '#ffffff',
    marginHorizontal: 16,
    marginBottom: 80,
    borderRadius: 12,
    padding: 16,
    elevation: 2,
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.1,
    shadowRadius: 4,
  },
  infoText: {
    fontSize: 14,
    color: '#64748b',
    lineHeight: 20,
    marginBottom: 4,
  },
  modalContainer: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: 'rgba(0, 0, 0, 0.5)',
  },
  modalContent: {
    width: '80%',
    backgroundColor: '#ffffff',
    borderRadius: 12,
    padding: 20,
    elevation: 5,
  },
  modalTitle: {
    fontSize: 18,
    fontWeight: 'bold',
    color: '#0c4a6e',
    marginBottom: 12,
    textAlign: 'center',
  },
  modalText: {
    fontSize: 14,
    color: '#0c4a6e',
    lineHeight: 20,
    marginBottom: 20,
  },
  closeButton: {
    backgroundColor: '#0284c7',
    padding: 10,
    borderRadius: 8,
    alignItems: 'center',
  },
  closeButtonText: {
    color: '#ffffff',
    fontSize: 14,
    fontWeight: '500',
  },
});

export default SmartSleepAnalysisApp;



请添加图片描述


打包

接下来通过打包命令npn run harmony将reactNative的代码打包成为bundle,这样可以进行在开源鸿蒙OpenHarmony中进行使用。

在这里插入图片描述

打包之后再将打包后的鸿蒙OpenHarmony文件拷贝到鸿蒙的DevEco-Studio工程目录去:

在这里插入图片描述

最后运行效果图如下显示:

请添加图片描述

智能睡眠分析应用的技术架构与跨平台实践
本文介绍了一个基于React Native开发的智能睡眠分析应用,该应用采用现代技术栈实现跨平台开发,并探讨了向鸿蒙生态适配的关键路径。应用核心功能包括:

数据建模:通过TypeScript定义用户、睡眠数据和睡眠建议三类强类型数据结构,构建完整的数据闭环

智能分析:

采用React Hooks管理应用状态
使用useEffect实现自动睡眠数据分析
基于权威机构建议生成个性化睡眠改善方案

跨平台适配:

详细映射React Native组件到鸿蒙对应组件
优化Flexbox布局适配鸿蒙设备
实施性能优化策略包括memo和虚拟化技术

扩展性设计:

模块化架构便于功能扩展
支持未来集成智能设备和AI分析
预留云端同步和数据可视化接口

该案例展示了React Native在健康管理领域的应用价值,以及向鸿蒙生态迁移的技术可行性,为跨平台健康应用开发提供了实践参考。

欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐