Symbol $ CompletionFailure:找不到ActivityDeparturesBinding的类文件

时间:2019-05-27 16:37:17

标签: android gradle kotlin dagger-2 android-databinding

我在一个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()函数,该错误消失了。请注意,仅评论函数的主体是不够的,我不得不删除整个函数。

这闻起来像是编译器/工具的错误。

2 个答案:

答案 0 :(得分:1)

我们可以通过几种方法(可能还有更多的方法)绕过编译错误。我们想到的最好方法是将抽象函数转换为抽象lambda属性。

父类:

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    
}

答案 1 :(得分:0)

我知道已经很晚了,但是我想说类似的事情发生在我身上,在我的情况下,我有一个使用第三方库的库模块,然后在我的应用程序模块中我使用了匕首注入依赖关系,而我遇到这个问题的原因是,我相信dagger找不到此第三方库的类,因为它没有直接在应用程序的依赖关系中实现。因此,在我的案例中,排序方式是更改将第三方库添加到本地库模块中的方式,以便使用api而不是implementation