在这里插入图片描述

目录

  1. 概述
  2. 功能设计
  3. Kotlin 实现代码(KMP)
  4. JavaScript 调用示例
  5. ArkTS 页面集成与调用
  6. 数据输入与交互体验
  7. 编译与自动复制流程
  8. 总结

概述

本案例在 Kotlin Multiplatform (KMP) 工程中实现了一个 每日时间分配与效率分析工具

  • 输入:一行文本,包含一天中主要活动及其时长,例如:学习 3, 工作 8, 娱乐 2, 睡眠 7
  • 输出:
    • 每个活动的时长明细
    • 学习/工作/睡眠等核心统计数据
    • 时间结构分析(是否接近 24 小时、是否缺失记录)
    • 关于效率与睡眠的建议
  • 技术路径:Kotlin → Kotlin/JS → JavaScript 模块 → ArkTS 页面调用。

这个工具可以帮助你快速复盘“一天都去哪儿了”,是一个典型的生活效率类小工具,同时也非常适合作为 Kotlin 集合操作与跨端调用的示例。


功能设计

输入格式

  • 使用逗号 , 分隔不同的活动记录。
  • 每个记录由“活动名称 + 时长(小时)”组成,中间用空格隔开。
  • 示例:
学习 3, 工作 8, 娱乐 2, 睡眠 7

输出结构

工具返回一段结构化的多行文本,包含:

  1. 活动明细:逐项列出每个活动名称和时长。
  2. 核心统计:总时长、学习相关时长、工作相关时长、睡眠相关时长。
  3. 结构分析:判断总记录时长是否接近 24 小时,并给出记录完整度的提示。
  4. 效率建议:基于学习+工作总时长给出对效率的评价。
  5. 睡眠建议:基于睡眠时长判断是否偏少/偏多、是否需要调整。

Kotlin 实现代码(KMP)

关键实现位于 src/jsMain/kotlin/App.kt,并通过 @JsExport 暴露给 JS/ArkTS 调用:

@OptIn(ExperimentalJsExport::class)
@JsExport
fun dailyTimeUsageAnalyzer(inputText: String = "学习 3, 工作 8, 娱乐 2, 睡眠 7"): String {
    // 输入格式: "活动1 时长, 活动2 时长, ...",时长单位为小时
    if (inputText.trim().isEmpty()) {
        return "❌ 错误: 请输入活动名称和小时数,例如: 学习 3, 工作 8, 娱乐 2, 睡眠 7"
    }

    val entries = inputText.split(",")
        .map { it.trim() }
        .filter { it.isNotEmpty() }
        .mapNotNull { part ->
            val pieces = part.split(" ").filter { it.isNotEmpty() }
            if (pieces.size < 2) return@mapNotNull null
            val name = pieces[0]
            val hours = pieces[1].toDoubleOrNull() ?: return@mapNotNull null
            name to hours
        }

    if (entries.isEmpty()) {
        return "❌ 错误: 没有解析到有效的活动和时长\n示例: 学习 3, 工作 8, 娱乐 2, 睡眠 7"
    }

    val totalHours = entries.sumOf { it.second }
    val workHours = entries.filter { it.first.contains("工") }.sumOf { it.second }
    val studyHours = entries.filter { it.first.contains("学") }.sumOf { it.second }
    val sleepHours = entries.filter { it.first.contains("睡") || it.first.contains("眠") }.sumOf { it.second }

    val lines = entries.map { (name, hours) ->
        "  - $name: ${hours} 小时"
    }

    val balanceComment = when {
        totalHours < 20 -> "记录总时长偏少,建议补全一天 24 小时的主要活动,便于全面分析。"
        totalHours in 22.0..26.0 -> "整体时间接近 24 小时,结构较为完整,可以作为每日时间账单参考。"
        else -> "记录总时长明显超出或少于 24 小时,可能包含跨天或遗漏记录,请注意核对。"
    }

    val efficiencyComment = when {
        studyHours + workHours >= 10 -> "高效的一天,学习/工作投入时间较多,注意适当休息。"
        studyHours + workHours in 6.0..9.9 -> "学习/工作时长适中,可以考虑为深度任务预留整块时间。"
        else -> "学习/工作时间偏少,若有长期目标,建议为重点任务预留固定时段。"
    }

    val sleepComment = when {
        sleepHours in 7.0..9.0 -> "睡眠时长较为理想,有利于保持良好状态。"
        sleepHours < 7.0 -> "睡眠偏少,建议尽量保证 7 小时以上的睡眠时间。"
        else -> "睡眠时间较长,可以适当调整,将一部分时间投入到学习或运动中。"
    }

    return "⏱ 每日时间分配与效率分析\n" +
           "━━━━━━━━━━━━━━━━━━━━━\n" +
           "原始输入: $inputText\n\n" +
           "1️⃣ 活动明细:\n" +
           lines.joinToString("\n") + "\n\n" +
           "2️⃣ 核心统计:\n" +
           "  总记录时长: ${totalHours} 小时\n" +
           "  学习相关: ${studyHours} 小时\n" +
           "  工作相关: ${workHours} 小时\n" +
           "  睡眠相关: ${sleepHours} 小时\n\n" +
           "3️⃣ 结构分析:\n" +
           "  $balanceComment\n\n" +
           "4️⃣ 效率建议:\n" +
           "  $efficiencyComment\n\n" +
           "5️⃣ 睡眠建议:\n" +
           "  $sleepComment\n\n" +
           "━━━━━━━━━━━━━━━━━━━━━\n" +
           "✅ 分析完成!"
}

这是每日时间分配与效率分析工具的核心实现函数。函数使用 @OptIn(ExperimentalJsExport::class)@JsExport 注解,使其可以被编译成 JavaScript 并在 ArkTS 中调用。函数首先进行输入验证,检查输入是否为空。然后使用链式操作解析输入:split(",") 按逗号分割活动记录,map { it.trim() } 移除每条记录的首尾空白,filter { it.isNotEmpty() } 过滤空记录,mapNotNull 安全解析每条记录为活动名称和时长的键值对。使用 toDoubleOrNull() 安全转换时长为浮点数,避免非法输入导致崩溃。然后统计总时长、工作时长、学习时长和睡眠时长,使用 contains() 检查活动名称中是否包含特定关键字。使用 when 表达式根据不同的时长范围生成相应的分析建议。最后格式化输出包含活动明细、核心统计、结构分析、效率建议和睡眠建议的完整报告。

代码说明

  • 使用 split(",") 与二次 split(" ") 解析活动名称和时长。
  • 通过 toDoubleOrNull() 安全解析小时数,避免非法输入导致崩溃。
  • 利用 filter + contains("学"/"工"/"睡"/"眠") 粗略归类活动到学习/工作/睡眠。
  • 根据总时长判断记录是否接近 24 小时,用于评估数据完整度。
  • 通过简单的阈值判断给出效率和睡眠建议,便于用户快速理解一天的时间结构。

JavaScript 调用示例

在 Kotlin/JS 编译完成后,可以在 JS/TS 环境中直接调用该函数:

import { dailyTimeUsageAnalyzer } from './hellokjs.mjs';

// 默认示例
console.log(dailyTimeUsageAnalyzer());

// 自定义时间分配
const result = dailyTimeUsageAnalyzer('学习 4, 工作 7, 娱乐 3, 睡眠 8, 通勤 2');
console.log(result);

这段代码展示了如何在 JavaScript 环境中调用编译后的 Kotlin 函数。首先使用 import 语句从编译后的 JavaScript 模块中导入 dailyTimeUsageAnalyzer 函数。第一个示例调用函数时不传入参数,使用默认的示例数据 “学习 3, 工作 8, 娱乐 2, 睡眠 7”。第二个示例传入自定义的时间分配数据,包含学习 4 小时、工作 7 小时、娱乐 3 小时、睡眠 8 小时和通勤 2 小时。函数返回一个多行的分析报告字符串,可以直接在控制台输出或进一步处理。这展示了 KMP 的跨端能力,同一份 Kotlin 代码可以在 JavaScript 环境中无缝调用。

输出是一段多行文本报告,包含活动明细、统计和建议,适合直接在终端、日志或 ArkTS 页面中展示。


ArkTS 页面集成与调用

在 OpenHarmony 工程 kmp_ceshiapp 中,首页 Index.ets 已经切换为“每日时间分配与效率分析”页面:

import { dailyTimeUsageAnalyzer } from './hellokjs';

@Entry
@Component
struct Index {
  @State message: string = '请输入一天内主要活动和时长';
  @State inputText: string = '学习 3, 工作 8, 娱乐 2, 睡眠 7';
  @State resultText: string = '';

  aboutToAppear(): void {
    this.analyzeTimeUsage();
  }

  analyzeTimeUsage(): void {
    try {
      const input: string = this.inputText;
      const result: string = dailyTimeUsageAnalyzer(input);
      this.resultText = result;
      this.message = '✓ 计算完成';
    } catch (error) {
      const errorMessage = error instanceof Error ? error.message : String(error);
      this.message = `✗ 错误: ${errorMessage}`;
    }
  }

  build() {
    // 省略 UI 布局细节,重点展示状态与调用关系
  }
}

这段 ArkTS 代码是鸿蒙应用的用户界面实现,通过 import 语句导入之前编译的 Kotlin 函数。使用 @State 装饰器定义三个响应式状态变量:message 用于显示状态信息,inputText 存储用户输入的时间分配数据(默认为示例数据),resultText 存储分析结果。aboutToAppear() 生命周期函数在组件加载时自动调用 analyzeTimeUsage() 进行初始分析。analyzeTimeUsage() 方法调用 Kotlin 编译的 JavaScript 函数 dailyTimeUsageAnalyzer(),将用户输入的文本传入,获取分析结果,然后更新 resultTextmessage。使用 try-catch 块捕获异常,如果发生错误则显示错误信息。build() 方法构建整个 UI 布局,维护输入框、输出区域和按钮的交互。

ArkTS 负责:

  • 维护输入字符串 inputText 与输出结果 resultText 的状态;
  • 在生命周期钩子和按钮点击时调用 dailyTimeUsageAnalyzer
  • 根据调用结果更新页面提示 message

数据输入与交互体验

首页的交互设计延续了前几个案例的风格:

  • 顶部标题栏展示“KMP 鸿蒙跨端”和“每日时间分配与效率分析”。
  • 输入区域包含:
    • 提示文案:输入活动和时长 (示例: 学习 3, 工作 8, 娱乐 2, 睡眠 7)
    • 文本框默认内容:学习 3, 工作 8, 娱乐 2, 睡眠 7
    • “开始分析”按钮:点击后调用 analyzeTimeUsage()
  • 结果区域通过 Scroll 容器与 Text 组件展示多行分析结果。
  • 底部按钮:
    • “默认示例”:重置输入为默认示例并立即分析;
    • “清空”:清空输入与结果,将提示还原为“请输入一天内主要活动和时长”。

用户只需要轻微修改默认示例(比如调整活动名称和时长)并点击“开始分析”,即可快速看到属于自己的一天时间分配报告。


编译与自动复制流程

当你在 App.kt 中新增或修改 dailyTimeUsageAnalyzer 时,只需在项目根目录执行:

cd d:\flutter_Obj\kmp_openharmony
.\build-and-copy.bat

脚本会自动:

  1. 使用 gradlew build 编译 Kotlin/JS 工程;
  2. build/js/packages/hellokjs/kotlin/ 下生成/更新 hellokjs.mjshellokjs.d.ts
  3. 将它们复制到 ArkTS pages 目录:
    • kmp_ceshiapp/entry/src/main/ets/pages/hellokjs.d.ts
    • kmp_ceshiapp/entry/src/main/ets/pages/hellokjs.js(由 .mjs 复制并改名)。

这样可以保证 ArkTS 端始终使用最新的 Kotlin 逻辑,无需手动复制文件。


总结

“每日时间分配与效率分析工具”结合了 Kotlin 的字符串解析、集合统计与条件判断逻辑,通过 KMP 的 Kotlin/JS 能力,轻松在 ArkTS 页面中复用,实现了一个贴近日常生活的小工具:

  1. Kotlin 负责解析活动-时长列表、进行加总和分类统计,并生成结构化分析报告。
  2. Kotlin/JS 将函数导出为 JS 模块和类型声明文件,为 JS/TS/ArkTS 提供良好的调用体验。
  3. ArkTS 页面只需少量代码即可构建出一个交互式的时间分析界面,让用户方便地查看和调整自己的时间安排。

配合前面的预算分析、学习打卡、环境舒适度、随机抽奖、任务排序等案例,这个工具进一步丰富了你的 KMP + ArkTS 示例体系,覆盖了生活效率和自我管理领域。核心思路依旧是:把算法和数据分析写在 Kotlin 里,通过 KMP 连接到多端,让 ArkTS 专注于体验和展示。

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐