更新到 Kotlin 1.3.30 会破坏 Dagger 2.21 的构建

Posted

技术标签:

【中文标题】更新到 Kotlin 1.3.30 会破坏 Dagger 2.21 的构建【英文标题】:Update to Kotlin 1.3.30 breaks build with Dagger 2.21 【发布时间】:2019-09-02 22:52:00 【问题描述】:

从 Kotling 1.3.21 更新到 1.3.30 后生成错误:

AppComponent.java:16: error: [Dagger/MissingBinding]    
   java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,
   javax.inject.Provider<androidx.lifecycle.ViewModel>> 
   cannot be provided without an @Provides-annotated method.

在对 Kotlin、Dagger 和 Architecture 组件具有相似依赖关系的两个不同项目中重现。

我怀疑它与 kotlin 1.3.30 中最近的 kapt 更新有某种关系: https://blog.jetbrains.com/kotlin/2019/04/kotlin-1-3-30-released/

尝试禁用/启用文章中的 kapt 选项,尝试 gradle clean,使缓存无效,没有任何帮助。 只有降级到 1.3.21 的项目才能成功构建。

【问题讨论】:

向社区提出帮助解决此问题的谦虚请求。也许有人已经解决了这个问题。 【参考方案1】:

on GitHub 和 on YouTrack 已报告此错误。这应该会在 Kotlin 版本 1.3.31 发布后修复。

更新: Kotlin 1.3.31 已发布,因此请务必更新您的 Kotlin 版本!


GitHub 上列出的 Kotlin 1.3.30 的解决方法是使用 Java 注释而不是 Kotlin 来表示 ViewModelKey,或者您可以降级回 Kotlin 1.3.21。

/**
 * Workaround in Java due to Dagger/Kotlin not playing well together as of now
 * https://github.com/google/dagger/issues/1478
 */
@MapKey
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewModelKey 
    Class<? extends ViewModel> value();


【讨论】:

将您的 kotlin 版本降级为 1.3.21 改用java类...你救了我。 仅供参考:1.3.31 在我这边没有解决它。我仍然需要使用 Java 解决方法。 @Forke 有趣。我之前只是快速尝试了一下,它似乎对我有用。您是否进行了干净的构建并清除了构建缓存?它可能是缓存问题或完全不同的问题 我在安装新版本时出错,但在 gradle 文件中配置了旧版本。现在工作。感谢您的更新!【参考方案2】:

Upgrade dagger version 和 kotlin version 到 latest

annotation class 应该可以工作。

目前最新版本是:-

匕首版 :- 2.23.2

Kotlin 版本 :- 1.3.41

【讨论】:

以上是关于更新到 Kotlin 1.3.30 会破坏 Dagger 2.21 的构建的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 更新了Roadmap,未来会有哪些新变化?

可可豆荚更新破坏了一些东西,现在“豆荚更新”会产生错误

Java 11 , Kotlin , Android Studio, TypeScript 重要更新来了

升级到 Flutter 2.0 会破坏 Flutter Firebase Web 项目

你看到的黑洞照片,全靠这位程序媛的算法;京东一员工疑似自杀;视觉中国的图片侵权追踪系统鹰眼系统曝光;Kotlin 1.3.30

Kotlin 1.3 到底会更新什么?