从kotlin

时间:2018-02-13 23:54:54

标签: java android android-gradle kotlin

问题:

这个问题很可能已经从所有其他类似的问题中得到了回答,但我似乎无法让它发挥作用。

  • 如果我从主源集中的java文件中引用另一种风格(不同的源集)中的特定java文件,它就可以工作。

  • 如果我尝试从主要源集中的Kotlin文件引用同一个文件,则会抱怨它无法看到它("未解析的引用")。

  • 如果我将同一个文件移动到主要的源集,它就可以工作(所以它不是文件本身)。

  • 如果我将Java文件转换为Kotlin它可以工作(这是我目前的解决方案),但我想知道为什么它不起作用,因为它并不总是如此易于转换,无需转换即可使用。

根据我的谷歌搜索,它似乎与Gradle中的源集相关,但我不想在Java文件夹旁边放置一个单独的Kotlin文件夹,所以我不确定是否需要这个。另外,我同时拥有Java和Kotlin的另一个项目没有配置并且工作正常。

我将productFlavors与flavorDimensions一起使用,并拥有一个名为" dimension1Dimension2"的源集。 (我试图引用的Java文件所在的位置)。

查看下面的设置,我可能做错了什么或丢失了什么?这个项目主要是Java,所以我刚刚开始添加Kotlin。我看不出与我的其他项目有什么不同,主要是Kotlin和一些Java。

另一件奇怪的事情是,它适用于三种口味中的一种。维度1有两种类型,维度2有三种类型。只有其中一种维度类型可以使用。

也许代码更清晰:

flavorDimensions "product", "mode"    
productFlavors {
        mock { // only this one works (e.g. <company_name>Mock is the source set)
            applicationIdSuffix = ".mock"
            dimension "mode"
        }
        dev {
            applicationIdSuffix = ".dev"
            dimension "mode"
        }
        prod {
            dimension "mode"
        }
        demo {
            applicationIdSuffix = ".demo"
            dimension "product"
            buildConfigField "String", "UPDATE_DIRECTORY", "\"/release/\""
            buildConfigField "boolean", "SHOW_STREAM_STATUS", "false"
        }
        <company_name> {
            applicationIdSuffix = ".<company_name>"
            dimension "product"
        }
    }

设定:

  • Kotlin版本:1.2.21
  • Gradle版本:3.0.1
  • 插件:
    • 申请插件:&#39; kotlin-android&#39;
    • 申请插件:&#39; kotlin-kapt&#39;
    • 应用插件:&#39; kotlin-android-extensions&#39;
  • 项目级别依赖项:
    • classpath&#34; org.jetbrains.kotlin:kotlin-gradle-plugin:$ kotlin_version&#34;
  • 应用程序级别依赖项:
    • 实施&#34; org.jetbrains.kotlin:kotlin-stdlib-jdk8:$ kotlin_version&#34;
  • 在项目设置中使用Java 8

1 个答案:

答案 0 :(得分:4)

所以我遇到了同样的问题,因为我们的应用程序是一个生产应用程序,所以我无法随时改变Kotlin的所有内容,我们无法立即将时间改为Kotlin - 遗产代码至少应该保留Java。

我向Google报告了一个错误:https://issuetracker.google.com/issues/110100405

瞧,一位Google工程师实际上非常快地回答了我的错误报告: - )

如果您不想阅读我们的对话,我会简短说明:

TL; DR版本:

这与Kotlin无法合作的原因是因为您的软件包设置错误。 我敢打赌,在你的某些风格中,你和我一样犯了同样的错误并创建了directories com.example.mypackage而不是创建名为com的父目录,然后是名为example的子目录,然后是名为mypackage的子子目录。

因此,如果您的文件夹看起来com.example.mypackage,请将其更改为com子目录,并且一切正常。

另一个可能最简单的解决方案是创建名称为com.example.mypackage的不同风格的软件包,但只有在您选择了要创建软件包的风格时才能这样做对

至于为什么,这不会产生Java的问题,我不知道,谷歌的人也没有,但它可能是一个IntelliJ问题,我可以向JetBrains报告,除非他们已经意识到这一点。

这也是一个很大的问题,Kotlin编译器只是发出一个模糊的错误说Unresolved reference,但这是另一天的谈话和另一个错误报告或增强。