Kotlin中Map.forEach报需API 24的lint错误,修改代码仍未解决
问题原因
你遇到的是Android Lint的误报问题,根本原因如下:
- Kotlin标准库为
Map提供的forEach是跨平台兼容的扩展函数,本身不需要Android API 24支持,在API 21设备上可以正常运行。 - 低版本Android Gradle Plugin(AGP)内置的Lint规则存在bug,会把Kotlin的
Map.forEach扩展函数错误识别为Java 8新增的java.util.Map#forEach接口默认方法,后者确实是Android API 24才加入的接口,因此触发了NewApi报错。 - 你修改的解构赋值写法调用的仍然是同一个Kotlin扩展函数,因此不会消除Lint的误判。
解决方案
- 升级AGP到7.0及以上版本
该误报问题已经在AGP 7.0版本中修复,如果你的项目可以升级构建工具版本,这是最彻底的解决方式。 - 替换为for循环写法
如果暂时无法升级AGP,可以将forEach调用替换为Kotlin的for循环遍历写法,Lint不会对这种写法产生误判:
eventKey.firebaseKey?.let { key -> properties?.also { for ((propertyKey, value) in it) { eventData.put(propertyKey.property, value) } } }
- 加注解忽略Lint警告
你可以直接给对应方法或者代码块添加@Suppress("NewApi")注解忽略该警告,因为实际运行不存在兼容问题:
@Suppress("NewApi") fun event(eventKey: EventKey, properties: Map<EventProperty, Any>) { eventKey.firebaseKey?.let { key -> properties?.forEach { entry -> eventData.put(entry.key.property, entry.value) } } }
内容的提问来源于stack exchange,提问作者Compose Learner
相关产品推荐
相关产品推荐

