Символ $ CompletionFailure: файл класса для ActivityDeparturesBinding не найден - PullRequest
3 голосов
/ 27 мая 2019

У меня есть отдельная библиотека Android в отдельном проекте для приложения Android.Однако я связываю библиотеку напрямую (ссылаясь на библиотечный модуль напрямую по пути или сгенерированному AAR), я получаю следующую ошибку:

A problem was found with the configuration of task ':app:kaptDevelopDebugKotlin'.
> Cannot write to file '/home/m0skit0/Repos/repo/app-android/app/build/intermediates/data-binding/develop/debug/bundle-bin' specified for property 'dataBindingArtifactOutputDir' as it is a directory.

e: error: cannot access ActivityDeparturesBinding
  class file for com.blablabla.databinding.ActivityDeparturesBinding not found
  Consult the following stack trace for details.
  com.sun.tools.javac.code.Symbol$CompletionFailure: class file for com.blablabla.databinding.ActivityDeparturesBinding not found

* What went wrong:
Execution failed for task ':app:kaptDevelopDebugKotlin'.

Это отображается сразу после задачи :app:transformDataBindingWithDataBindingMergeArtifactsForDevelopDebug

Однакокласс существует, с полным каноническим именем.Он принадлежит библиотеке и корректно автоматически генерируется (без каких-либо ошибок) процессором привязки данных Android в обоих проектах.Библиотека правильно компилируется.Больше нет трассировки стека, даже если компиляция выполняется с --stacktrace.

. Я попытался связать библиотеку с компиляцией, реализацией и API, все с тем же результатом.

Версия Gradle - 4.4.


ОБНОВЛЕНИЕ:

Обновление до Gradle 5 не решило проблему.Переименование XML не решило проблему.

Я также обнаружил, что ошибка возникает, только когда я ссылаюсь на класс ActivityDeparturesBinding в моем коде, даже если часть, на которую он ссылается, никогда не вызывается.Только импорт без ссылки на него не вызывает ошибку.


UPDATE2:

Это действие, использующее макет:

class DeparturesActivity : BaseVinPlateActivity<DeparturesViewModel, ActivityDeparturesBinding>() {

    companion object {
        fun getStartIntent(context: Context) = Intent(context, DeparturesActivity::class.java)
    }

    @Inject
    override lateinit var viewModel: DeparturesViewModel

    override val layout: Int = R.layout.activity_departures

    override fun injectThis(component: ActivityComponent) {
        component.inject(this)
    }

    override fun getToolbarTitleId(): Int = R.string.departures_title

    override fun initializeDataBindings(dataBinding: ActivityDeparturesBinding) {
        dataBinding.viewmodel = viewModel
    }
}

abstract class BaseVinPlateActivity<T: BaseVinPlateViewModel, U: ViewDataBinding> : CompoundsBaseActivity()  {

    protected abstract var viewModel: T
    protected abstract val layout: Int

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == BARCODE_RESULT_CODE_ACTIVITY && resultCode == Activity.RESULT_OK) {
            val barcodeResult = data?.getStringExtra(BARCODE_RESULT_ACTIVITY)
            viewModel.setBarcodeResult(barcodeResult)
        }
    }

    override fun initializeView() {
        super.initializeView()
        val dataBinding = inflateDataBinding<U>(layout)
        initializeDataBindings(dataBinding)
        with (viewModel) {
            setBindValidator(Validator(dataBinding))
            loadData()
        }
    }

    protected abstract fun initializeDataBindings(dataBinding: U)
}

Если я удаляюфункция initializeDataBindings(), ошибка исчезла.Обратите внимание, что комментировать только тело функции недостаточно, мне пришлось удалить всю функцию.

Это пахнет как ошибка компилятора / инструментов.

1 Ответ

1 голос
/ 05 июня 2019

Мы могли бы обойти ошибку компиляции несколькими способами (возможно, есть и другие способы).Лучший способ, которым мы придумали это преобразование абстрактной функции в абстрактное лямбда-свойство.

Родительский класс:

abstract class BaseVinPlateActivity<T: BaseVinPlateViewModel, U: ViewDataBinding> : CompoundsBaseActivity()  {

    protected abstract val initializeDataBinding: U.() -> Unit

    // Rest of code
}

Дочерний класс:

class DeparturesActivity : BaseVinPlateActivity<DeparturesViewModel, ActivityDeparturesBinding>() {

    override val initializeDataBinding: ActivityDeparturesBinding.() -> Unit = { viewmodel = this@DeparturesActivity.viewModel }

    // Rest of code    
}
...