如何在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机制封装:- 在
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()}" } } - 在
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}" } } - 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
相关产品推荐
相关产品推荐

