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

Jetpack Compose Android预览中多API报错求助

Jetpack Compose预览界面API错误解决方法

针对你遇到的三个API错误,以下是具体的修复方案:


1. LazyVerticalGrid 实验性API警告

问题原因

LazyVerticalGrid属于Compose Foundation库中的实验性API,默认会触发警告提示。

修复方案

在使用该API的@Composable函数上添加@OptIn(ExperimentalFoundationApi::class)注解(这是当前Compose推荐的实验性API使用方式)。

修改后的Calendar函数代码:

@OptIn(ExperimentalFoundationApi::class)
@Composable
fun Calendar(
    months : List<Month>,
    modifier: Modifier = Modifier
){
    val gridCellNumber = 7
    LazyVerticalGrid(
        modifier = modifier ,
        cells = GridCells.Fixed(gridCellNumber)
    ){
        months.forEach { month ->
            item(
                span = { GridItemSpan(gridCellNumber) }
            ) { MonthLabel(month = month.title) }
            items(month.dateForecasts){
                DateCard(dataForecasts = it )
            }
        }
    }
}

2. java.time API 最低版本兼容问题(DayOfWeek/SUNDAY)

问题原因

java.time.DayOfWeek是API Level 26引入的类,你的项目minSdk为21,无法直接兼容。

修复方案

有两种可选方案:

方案一:使用AndroidX兼容库(推荐)

引入ThreeTenABP库,它是官方提供的java.time兼容库,支持低版本Android。

  1. 在模块级build.gradle(或build.gradle.kts)中添加依赖:
dependencies {
    implementation 'com.jakewharton.threetenabp:threetenabp:1.4.6'
}
  1. 在Application类中初始化库:
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        AndroidThreeTen.init(this)
    }
}
  1. 代码无需修改,库会自动处理API兼容。

方案二:替换为java.util.Calendar类(无需额外依赖)

将DayOfWeek替换为java.util.Calendar中的常量,修改MonthLabel函数:

@Composable
fun MonthLabel(
    month: String,
    modifier: Modifier = Modifier
){
    val weekdays = listOf(
        Calendar.SUNDAY,
        Calendar.MONDAY,
        Calendar.TUESDAY,
        Calendar.WEDNESDAY,
        Calendar.THURSDAY,
        Calendar.FRIDAY,
        Calendar.SATURDAY
    ).map { day ->
        // 获取短格式星期名称
        DateFormatSymbols().shortWeekdays[day] ?: ""
    }

    Column(
        modifier = modifier.fillMaxWidth()
    ) {
        Text(
            text = month ,
            modifier = Modifier.fillMaxWidth(),
            textAlign = TextAlign.Center,
            style = MaterialTheme.typography.h5.copy(fontWeight = FontWeight.SemiBold)
        )
        Row(modifier = Modifier.fillMaxWidth() ){
            weekdays.forEach{
                Text(
                    text = it,
                    textAlign = TextAlign.Center,
                    style = MaterialTheme.typography.body2,
                    modifier = Modifier.weight(1f,true)
                )
            }
        }
    }
}

3. java.time API 最低版本兼容问题(Month/JULY)

问题原因

java.time.Month同样是API Level 26引入的类,minSdk21无法直接使用。

修复方案

对应上述两种方案:

方案一:使用ThreeTenABP库

无需修改预览代码,库会自动兼容java.time.Month的调用。

方案二:替换为java.util.Calendar类或固定值

修改CalendarPreview函数,用Calendar获取月份天数,或直接使用固定天数:

@Preview(showBackground = true)
@Composable
fun CalendarPreview(){
    // 工具函数:获取指定月份的天数
    fun getDaysInMonth(month: Int): Int {
        val calendar = Calendar.getInstance()
        calendar.set(Calendar.MONTH, month)
        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH)
    }

    val months = listOf(
        Month(
            title = "July",
            dateForecasts = List(getDaysInMonth(Calendar.JULY)){
                DateForeCast(
                    date = "${it + 1}",
                    highTemperature = "70",
                    icon = R.drawable.cloud_cloudy_day_forecast_sun_icon
                )
            }
        ),
        Month(
            title = "August",
            dateForecasts = List(getDaysInMonth(Calendar.AUGUST)){
                DateForeCast(
                    date = "${it + 1}",
                    highTemperature = "70",
                    icon = R.drawable.cloud_cloudy_day_forecast_sun_icon
                )
            }
        )
    )
    WeatherAppTheme {
        Calendar(months = months )
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:30:57