You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin Multiplatform Mobile(KMM)项目中添加并使用Android库?

KMM项目中使用Compose日历库的问题解决建议

核心问题说明

你用的这个日历库是Android Jetpack Compose专属库,没有提供iOS或跨平台实现,因此无法在commonMain(KMM跨平台共享代码区)中直接导入使用——commonMain的代码必须兼容Android和iOS双平台,而该库仅适配Android。

当前配置问题

你仅在androidMain和Android模块的dependencies中添加了库依赖,commonMain中没有(也不能添加),所以commonMain里的代码自然识别不到该库的类和方法。

可行解决方案

方案1:仅在Android端使用该库,将日历代码移至androidMain

如果日历UI仅需在Android端实现,不需要iOS端同步:

  • 所有涉及该日历库的代码都放到androidMain目录下,不要在commonMain中引用。
  • 若commonMain需要调用日历相关逻辑,可通过KMM的expect/actual机制封装:
    1. 在commonMain中定义期望接口:
      // commonMain/Greeting.kt
      package com.example.pilld
      
      expect class CalendarHandler() {
          fun getCalendarInfo(): String
      }
      
      class Greeting {
          private val platform: Platform = getPlatform()
          private val calendarHandler = CalendarHandler()
      
          fun greeting(): String {
              return "Hello, ${platform.name}! ${calendarHandler.getCalendarInfo()}"
          }
      }
      
    2. 在androidMain中实现具体逻辑(可直接使用日历库):
      // androidMain/CalendarHandler.kt
      package com.example.pilld
      
      import com.kizitonwose.calendar.core.CalendarDay
      
      actual class CalendarHandler actual constructor() {
          actual fun getCalendarInfo(): String {
              val today = CalendarDay.today()
              return "Today is ${today.dayOfMonth}/${today.month}/${today.year}"
          }
      }
      
    3. iOS端若不需要该逻辑,可在iosMain中实现空占位的CalendarHandler。

方案2:更换为支持KMM的跨平台日历方案

如果需要iOS端也实现类似日历功能:

  • 用你已在commonMain中添加的kotlinx-datetime做跨平台日期处理。
  • Android端用当前Compose日历库实现UI,iOS端用SwiftUI原生日历组件实现UI,两边的日期逻辑通过commonMain代码共享。
  • 或寻找真正支持KMM的跨平台日历库(注意甄别,很多库仅声称跨平台,实际仅支持单端)。

配置优化建议

你当前shared模块的Android块中重复添加了日历库依赖,只需在androidMain的dependencies中添加一次即可,Android块里的重复依赖可以删除。

内容的提问来源于stack exchange,提问作者confusedcoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:25:30