目录

  1. 概述

  2. 功能设计

  3. Kotlin 实现代码(KMP)

  4. JavaScript 调用示例

  5. ArkTS 页面集成与调用

  6. 数据输入与交互体验

  7. 编译与自动复制流程

  8. 总结


概述

本案例在 Kotlin Multiplatform (KMP) 工程中实现了一个 环境体感舒适度指数计算工具

  • 输入:一串数字,依次为 温度(℃)湿度(%)风速(m/s),例如:26 60 0.5

  • 输出:

    • 体感温度估算值

    • 舒适度等级(偏冷/凉爽/舒适/偏热/炎热)

    • 基于当前环境的简短建议

  • 技术路径:Kotlin → Kotlin/JS → JavaScript 模块 → ArkTS 页面调用。

相比纯算法示例,这个工具更贴近日常:你可以基于实时天气数据或者室内传感器数据,快速给出用户能理解的“体感温度”和舒适度提示,适合作为学习/工作环境的辅助信息展示。


功能设计

输入数据格式

环境体感舒适度工具的输入非常直接:

  • 使用 空格 分隔三个参数:

    • 第 1 个:温度(摄氏度),例如 26

    • 第 2 个:相对湿度(百分比),例如 60

    • 第 3 个:风速(米/秒),例如 0.5

  • 示例输入:

26 60 0.5

输出信息结构

Kotlin 函数返回一段结构化的多行文本,包含:

  1. 标题:环境体感舒适度指数。

  2. 体感温度估算:根据温湿度和风速综合给出的体感温度(非严格科学公式,仅用于演示)。

  3. 舒适度等级:根据体感温度区间将环境划分为“偏冷/凉爽/舒适/偏热/炎热”等等级。

  4. 建议:针对不同等级给出简短的生活建议,如“适当添加衣物”“注意防暑降温”等。

这种输出方式便于 ArkTS 页面直接用一个 Text 组件完整展示,也便于复制到日志或终端进行调试。


Kotlin 实现代码(KMP)

核心实现位于 src/jsMain/kotlin/App.kt,并通过 @JsExport 导出:

@OptIn(ExperimentalJsExport::class)
@JsExport
fun comfortIndexCalculator(inputText: String = "26 60 0.5"): String {
    // 输入格式: "温度(℃) 湿度(%) 风速(m/s)", 例如 "26 60 0.5"
    val parts = inputText.trim().split(" ").filter { it.isNotEmpty() }
​
    if (parts.size < 3) {
        return "❌ 错误: 请按 '温度 湿度 风速' 的格式输入,例如: 26 60 0.5"
    }
​
    val temperature = parts[0].toDoubleOrNull()
    val humidity = parts[1].toDoubleOrNull()
    val windSpeed = parts[2].toDoubleOrNull()
​
    if (temperature == null || humidity == null || windSpeed == null) {
        return "❌ 错误: 温度/湿度/风速 解析失败\n示例: 26 60 0.5"
    }
​
    // 简单的体感温度估算:随湿度升高而升高,随风速增大而降低
    val apparentTemp = temperature + (humidity - 50.0) * 0.05 - windSpeed * 1.2
​
    val comfortLevel = when {
        apparentTemp < 10 -> "偏冷"
        apparentTemp in 10.0..18.0 -> "凉爽"
        apparentTemp in 18.0..26.0 -> "舒适"
        apparentTemp in 26.0..30.0 -> "偏热"
        else -> "炎热"
    }
​
    val suggestion = when (comfortLevel) {
        "偏冷" -> "建议适当添加衣物,注意保暖,特别是在早晚温差较大的时候。"
        "凉爽" -> "气温较为凉爽,适合散步、学习和工作,注意避免长时间久坐。"
        "舒适" -> "当前环境体感舒适,非常适合专注学习或进行轻度运动。"
        "偏热" -> "略感闷热,建议补充水分,保持通风,避免长时间高强度活动。"
        else -> "体感炎热,注意防暑降温,尽量避免在高温时段长时间户外活动。"
    }
​
    return "🌡 环境体感舒适度指数\n" +
           "━━━━━━━━━━━━━━━━━━━━━\n" +
           "输入参数: 温度 ${temperature}℃, 湿度 ${humidity}%, 风速 ${windSpeed} m/s\n\n" +
           "1️⃣ 体感温度估算:\n" +
           "  体感温度: ${"" + String.format("%.1f", apparentTemp)}℃\n\n" +
           "2️⃣ 舒适度判断:\n" +
           "  舒适等级: ${comfortLevel}\n\n" +
           "3️⃣ 建议:\n" +
           "  ${suggestion}\n\n" +
           "━━━━━━━━━━━━━━━━━━━━━\n" +
           "✅ 分析完成!"
}

代码说明

  • 输入解析

    • 使用 split(" ")filter { it.isNotEmpty() } 处理空格,容忍用户多打几个空格。

    • 尝试将三个参数转换为 Double,若有任何一个为 null,直接返回错误提示,并给出示例。

  • 体感温度估算

    • 使用一个简单的线性公式:

      • 湿度偏高时体感温度上升;

      • 风速增大时体感温度下降;

    • 注意:这不是严格的气象公式,仅用于演示跨端工具的实现思路。

  • 舒适度区间划分

    • 小于 10℃:偏冷

    • 10–18℃:凉爽

    • 18–26℃:舒适

    • 26–30℃:偏热

    • 大于 30℃:炎热

  • 建议文案

    • 针对每个区间给出一句自然语言建议,方便直接展示给终端用户。


JavaScript 调用示例

和其他 Kotlin/JS 导出的函数一样,comfortIndexCalculator 会被编译进 hellokjs.mjs 模块中。在纯 JS 环境里的用法如下:

// 导入 Kotlin/JS 生成的 ES Module
import { comfortIndexCalculator } from './hellokjs.mjs';
​
// 示例 1:使用默认参数
const result1 = comfortIndexCalculator();
console.log(result1);
​
// 示例 2:自定义一组环境参数
const result2 = comfortIndexCalculator('30 75 1.2');
console.log(result2);

控制台会打印类似如下的结果:


ArkTS 页面集成与调用

在 OpenHarmony 工程 kmp_ceshiapp 中,我们已经将首页 Index.ets 改造成“环境体感舒适度指数”页面,核心调用逻辑如下:

import { comfortIndexCalculator } from './hellokjs';
​
@Entry
@Component
struct Index {
  @State message: string = '请输入当前温度、湿度和风速';
  @State inputText: string = '26 60 0.5';
  @State resultText: string = '';
​
  aboutToAppear(): void {
    this.calculateComfortIndex();
  }
​
  calculateComfortIndex(): void {
    try {
      const input: string = this.inputText;
      const result: string = comfortIndexCalculator(input);
      this.resultText = result;
      this.message = '✓ 计算完成';
    } catch (error) {
      const errorMessage = error instanceof Error ? error.message : String(error);
      this.message = `✗ 错误: ${errorMessage}`;
    }
  }
​
  build() {
    // 省略 UI 细节,重点在于调用关系
  }
}

通过这种方式,ArkTS 页面只关心:

  • 输入框里的字符串 inputText

  • comfortIndexCalculator 返回的一整段分析文本;

  • 当前状态提示 message

实际计算逻辑(包括体感温度估算和建议生成)全部由 Kotlin 提供,实现前后端解耦和跨端复用。


数据输入与交互体验

ArkTS 界面主要包含三部分:

  1. 顶部标题栏:显示“KMP 鸿蒙跨端”和“环境体感舒适度指数”字样。

  2. 输入区域

Column() {
  Text('输入温度/湿度/风速 (示例: 26 60 0.5):')
    .fontSize(14)
    .fontWeight(FontWeight.Bold)
    .fontColor('#1f2937')
    .margin({ bottom: 8 })
​
  TextInput({ placeholder: '例如: 26 60 0.5', text: this.inputText })
    .width('100%')
    .height(80)
    .padding(8)
    .border({ width: 1, color: '#d1d5db' })
    .borderRadius(6)
    .onChange((value: string) => {
      this.inputText = value;
    })
    .margin({ bottom: 12 })
​
  Button('开始分析')
    .width('100%')
    .height(40)
    .margin({ top: 4 })
    .backgroundColor('#f59e0b')
    .fontColor(Color.White)
    .onClick(() => {
      this.calculateComfortIndex();
    })
}
  1. 结果区域 + 底部按钮

    • 通过 Scroll + Text 组件展示 resultText,使用 monospace 字体保持输出对齐;

    • “默认示例”按钮会重置为 26 60 0.5 并触发分析;

    • “清空”按钮会清除输入和结果,并将 message 还原为“请输入当前温度、湿度和风速”。

用户体验上,打开页面即可看到默认示例结果,随后只需要修改一行输入并点击“开始分析”即可获得新的环境舒适度评估。


编译与自动复制流程

Kotlin 代码更新后,要让 ArkTS 端使用最新的 comfortIndexCalculator,只需要在项目根目录执行一次脚本:

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

脚本会自动完成:

  1. 运行 gradlew build 编译 Kotlin/JS;

  2. build/js/packages/hellokjs/kotlin/ 下生成/更新:

    • hellokjs.mjs

    • hellokjs.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 改名)。

每次修改 App.kt 中的工具函数(包括 comfortIndexCalculator)后,只要重新执行这个脚本,ArkTS 侧就会自动获得最新的实现,无需手动拷贝或改路径。


总结

“环境体感舒适度指数计算工具”展示了如何用 Kotlin + KMP + ArkTS 快速构建一个贴近生活的跨端小工具:

  1. 在 Kotlin 中实现体感温度估算和舒适度判断逻辑,并通过 @JsExport 导出。

  2. 使用 Kotlin/JS 编译生成 ES Module 和类型声明,使函数可以在 JavaScript/ArkTS 中像本地方法一样调用。

  3. 在 OpenHarmony ArkTS 页面中,用极少的代码完成输入收集和结果展示,把主要精力放在 UI 和体验上。

配合前面的 BMI、贷款、成绩分析、个人预算、学习打卡等案例,这个环境舒适度工具进一步丰富了 KMP 跨端示例库,你可以在此基础上继续扩展:

  • 引入真实气象公式或第三方 API,提高体感温度的准确性;

  • 根据不同用户类型(老人、儿童、运动人群)给出差异化建议;

  • 将结果和打卡工具结合,记录“适合学习的日子”或“高效学习时段”等信息。

核心思路很简单:用 Kotlin 统一做复杂逻辑,用 ArkTS 做好界面展示和交互,通过 KMP 把两者优雅地拼在一起。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐