Поддержка градиента протокола Buffer для Kotlin Android не работает?

У меня есть проект Android в Котлине, где он настроен правильно и работает

В Root build.gradle

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 

В приложении build.gradle

 apply plugin: 'kotlin-android' // ... implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" 

Все работает хорошо.

Он также поддерживает Protobuf в соответствии с https://github.com/google/protobuf-gradle-plugin

Где в приложении build.gradle есть

 apply plugin: 'com.google.protobuf' // ... protobuf { protoc { // Download from repositories artifact = 'com.google.protobuf:protoc:3.0.0' } plugins { javalite { // The codegen for lite comes as a separate artifact artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0' } } generateProtoTasks { all().each { task -> task.plugins { javalite { } } } } } sourceSets { main { java { srcDirs += file("${protobuf.generatedFilesBaseDir}/debug/javalite") } } } // ... api 'com.google.protobuf:protobuf-lite:3.0.0' 

Единственное, когда код, который обращается к кодам Protobuf, т.е. кодам в com.elyeproj.proto.* , Находится на Java, все работает хорошо

 package com.elyeproj.myapplication; import com.elyeproj.proto.Card; import com.elyeproj.proto.Heart; import com.elyeproj.proto.Result; import com.elyeproj.proto.Spade; public class MainPresenter { private MainView mainView; public MainPresenter(MainView mainView) { this.mainView = mainView; } public void fetchData() { Card card1 = Card.newBuilder().setHeart(Heart.newBuilder().build()).build(); Card card2 = Card.newBuilder().setSpade(Spade.newBuilder().build()).build(); Result result = Result.newBuilder().addCards(card1).addCards(card2).build(); mainView.showResult(result.toString()); } } 

Тем не менее, при обращении в Котлин

 package com.elyeproj.myapplication import com.elyeproj.proto.Card import com.elyeproj.proto.Heart import com.elyeproj.proto.Result import com.elyeproj.proto.Spade class MainPresenter(private val mainView: MainView) { fun fetchData() { val card1 = Card.newBuilder().setHeart(Heart.newBuilder().build()).build() val card2 = Card.newBuilder().setSpade(Spade.newBuilder().build()).build() val result = Result.newBuilder().addCards(card1).addCards(card2).build() mainView.showResult(result.toString()) } } 

Это приведет к ошибке во время компиляции с сообщением:

 Error:(6, 21) Unresolved reference: proto Error:(11, 21) Unresolved reference: Card Error:(11, 48) Unresolved reference: Heart Error:(12, 48) Unresolved reference: Spade Error:(13, 22) Unresolved reference: Result 

т.е. он не может получить доступ к тем протобуф-кодом (хотя в Android Studio он все равно может получить доступ к коду, например, автозаполнение кода может найти функции).

Похоже, что поддержка Protobuf Gradle и Kotlin не работают. Или я что-то пропустил?

Чтобы проверить это, вы можете получить доступ к коду в https://github.com/elye/issue_android_protobuf_light_java с помощью MainPresentation на Java, который компилируется отлично. Но если конвертирует в Котлин, это приведет к ошибке, как указано выше.

    Существует решение об использовании Kotlin, то есть использовать модуль Kotlin для генерации файла protobuf. Затем в качестве отдельного модуля он может быть использован. Подробнее см. https://medium.com/@elye.project/android-protobuf-in-kotlin-a1c33014a4e2 .

    Intereting Posts
    Невозможно создать экземпляр активности | Причина: kotlin.KotlinNullPointerException Конвертировать проект Android для использования Gradle Script Kotlin Kotlin: java.lang.NoSuchMethodError в тестах Android, тест Espresso не может работать с записью активности на Kotlin Копирование документов KDoc с одного метода на другой Тестирование Kotlin в студии android Литеральный синтаксис класса для параметризованных классов в Котлине Можно ли сохранить «Unit» в качестве возвращаемого типа функции Kotlin при вызове с Java? Kotlin: какой формат использовать для документации? Ошибка Kotlin при ссылке на активность из внутреннего класса Можно ли избежать повторения кода, когда объект должен вернуть измененную копию самого себя? Handy подтвердить диалог javafx в kotlin Как обеспечить класс kotlin для конфигураций запуска eclipse? Возможно ли получить доступ к типам Kotlin из Java? Разбор json со сломанным удаленным API