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。
- 在模块级
build.gradle(或build.gradle.kts)中添加依赖:
dependencies { implementation 'com.jakewharton.threetenabp:threetenabp:1.4.6' }
- 在Application类中初始化库:
class MyApplication : Application() { override fun onCreate() { super.onCreate() AndroidThreeTen.init(this) } }
- 代码无需修改,库会自动处理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
相关产品推荐
相关产品推荐

