Kotlin-android: ligação de dados de referência não resolvida

143

Eu tenho a seguinte classe de fragmento escrita em Java usando a nova biblioteca de ligação de dados

import com.example.app.databinding.FragmentDataBdinding;

public class DataFragment extends Fragment {

    @Nullable
    private FragmentDataBinding mBinding;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_data, container, false);
        return mBinding.getRoot();
    }
}

Compila e corre bem.
Tentei reescrevê-lo no Kotlin e criei o seguinte:

import com.example.app.databinding.FragmentDataBdinding

class ProfileFragment : Fragment() {

    private var mBinding: FragmentDataBinding? = null

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_data, container, false)
        return mBinding!!.getRoot()
    }
}

Mas agora a etapa :app:compileDebugKotlingera o seguinte:

Erro: (16, 38) Referência não resolvida: ligação de dados
Erro: (37, 27) Referência não resolvida: FragmentDataBinding

Como posso usar a biblioteca de ligação de dados do Android com o Kotlin?

Meu nível superior build.gradle:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
        classpath 'com.android.databinding:dataBinder:1.0-rc4'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

Meu build.gradlediretório no aplicativo (apenas partes relevantes):

apply plugin: 'com.android.application'
apply plugin: 'com.android.databinding'
apply plugin: 'kotlin-android'

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}

buildscript {
    ext.kotlin_version = '0.14.451'
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
    }
}
repositories {
    mavenCentral()
    maven {
        url 'http://oss.sonatype.org/content/repositories/snapshots'
    }
}

Estou usando o Android Studio 1.4, Ferramentas de compilação versão 23.0.1, Android SDK 23, SDK tools 24.4.0

Mikhail
fonte
3
Sinta-se à vontade para votar na questão correspondente: https://youtrack.jetbrains.com/issue/KT-8007
Ghedeon
1
Você só precisa ter apply plugin: 'kotlin-kapt'no arquivo gradle do aplicativo na versão mais recente.
Hesam
ligação lateinit var privada: FragmentDataBinding É uma maneira melhor de inicializar
Dino Sunny

Respostas:

85

Tente usar esta configuração:

No build.gradle principal :

buildscript {
    ext.kotlin_version = '<kotlin-version>'
    ext.android_plugin_version = '2.2.0-alpha4'
    dependencies {
        classpath "com.android.tools.build:gradle:$android_plugin_version"
    //... rest of the content
    }
}

App build.gradle :

android {
    dataBinding {
        enabled = true
    }
}

dependencies {
    kapt "com.android.databinding:compiler:$android_plugin_version"
}

kapt {
    generateStubs = true
}
lrampazzo
fonte
1
@Irampazzo, 2.2.0-alphaXestá disponível e, para sua informação, a versão da ligação de dados é igual à do próprio plugin do android-gradle. para que você possa externalizar essa versão e usá-la como a versão do compilador.
Avinash R
1
Posso confirmar que esta resposta fixa o meu problema com ligação de dados e Kotlin
Rabie Jradi
12
Eu tive que adicionar apply plugin: 'kotlin-kapt'também. Veja stackoverflow.com/a/42974558/1916449
arekolek 20/17
Eu tentei isso. Agora isso me dá um erro de dependência circular. Alguma idéia sobre isso?
LeoOrion 28/05
Confira kotlinlang.org/docs/tutorials/… para obter a documentação oficial sobre isso.
Brian
72

Encontrei nova solução, espero que ajude.

Antes de mais nada, verifique se o plug-in foi aplicado:

apply plugin: 'kotlin-kapt'

então

android {
    ...
    ...
    dataBinding {
        enabled = true
    }
    ...
    ...
}

Você pode ter um erro na dependência:

USAR

kapt 'com.android.databinding:compiler:3.0.1'

ao invés de

compile 'com.android.databinding:compiler:3.0.1'

Você pode visitar aqui para uma nova versão

Obrigado.

Pratik Butani
fonte
6
Eu ainda tenho este problema :(
Mladen Rakonjac
Isso está funcionando para mim (Gradle invólucro 4.4, ferramentas 3.1.0)
Sergio
Adicionando o kapt 'com.android.databinding: compiler: 3.0.1' funciona para mim
Duran Jayson
Funcionou para mim adicionando apenas "apply plugin: 'kotlin-kapt". Obrigado.
Subhan Ali 11/09/18
acabou de adicionar esta linha está funcionando para mim (aplicar plugin: 'Kotlin-Kapt') Estúdio Android 3.2.1 - Kotlin plug-in 1.3.0
Mohamed ElSawaf
14

Atualização 2: Esta é uma resposta muito antiga; consulte a resposta de lrampazzo.

Funciona com 1.0-rc4, coloque

kapt 'com.android.databinding:compiler:1.0-rc4' 

em suas dependências

Obrigado Ghedeon, pelo link nos comentários

Atualização : Aqui está um projeto de exemplo hello world realmente simples

Jaydeep Solanki
fonte
Ainda recebo o mesmo erro, estou fazendo algo errado aqui? gist.github.com/xdgimf/820c433efa8307821788
Miguel Fermin
aqui está o meu arquivo build.gradle se você precisa de uma referência gist.github.com/jaydeep17/9960fdb0e5a1ba85e82d
Jaydeep Solanki
@ Jaydeep Apenas tentei, e está funcionando. No entanto, o Android studio não destaca a sintaxe e gera muitos erros de IDE com a mensagem Exception while analyzing expression at (12,23) in /projectpath/KotlinDataBinding/app/src/main/java/com/example/kotlindatabinding/MainActivity.kt:. Você tem os mesmos erros? E qual é a sua versão do Android Studio?
Mikhail
@Arkadiy Ele já foi relatado youtrack.jetbrains.com/issue/KT-8007 BTW eu estou no estúdio v1.5 Preview 2
Jaydeep Solanki
Esta não é mais a versão mais recente do plug-in. Causará dor desnecessária.
Avinash R
13

A versão do compilador Data Binding é igual à versão gradle no arquivo build.gradle do projeto:

// at the top of file 
apply plugin: 'kotlin-kapt'


android {
  dataBinding.enabled = true
}

dependencies {
  kapt "com.android.databinding:compiler:3.0.0-beta1"
}

e a versão gradle é

classpath 'com.android.tools.build:gradle:3.0.0-beta1'

Aqui está um exemplo de link para concluir o uso da biblioteca de ligação de dados no kotlin.

https://proandroiddev.com/modern-android-development-with-kotlin-september-2017-part-1-f976483f7bd6

Sijansd
fonte
dataBinding.enabled = true era o que eu estava esquecendo
Cesar Castro
7

Para resolver o problema, você deve colocar

apply plugin: 'kotlin-kapt'

no topo do build.gradle (Module: app), em seguida, coloque esta linha nas dependências

kapt "com.android.databinding:compiler:[YOUR_ANDROID_PLUGIN_VERSION]"

Você pode encontrar a versão do plugin android, vá para o menu

File > Project Structure > Project

Em seguida, sincronize novamente. Se você vir esse aviso, ignore-o.

Plug-ins Gradle de terceiros podem ser a causa

Sowattana Sigen
fonte
6

Experimente o Android Studio 2.0 (2.1)

No build.gradle

android{
   dataBinding {
        enabled = true
    }
...
}
dependencies {
 kapt 'com.android.databinding:compiler:2.0.0-rc1'
....
}

kapt {
    generateStubs = true
}

No meu projeto: buildToolsVersion = "23.0.3"

no nível superior build.gradle

dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0'
    }
Garf1eld
fonte
2
você deve usar a mesma versão para o compilador e o plug-in gradle das ferramentas de construção do Android. Caso contrário, poderá causar problemas de construção imprevisíveis.
Avinash R
Eu tive que adicionar o plug-in apply: 'kotlin-kapt'
Andrii Kovalchuk
6

este trabalho para mim no androidStudio ver3.1.3

apply plugin: 'kotlin-kapt'

dataBinding {
    enabled = true
}

mostrar amostra de uso

emad pirayesh
fonte
4

Ligação de dados de configuração no kotlin

build.gradle (aplicativo de pasta)

apply plugin: 'kotlin-kapt'

android {
   ...
   dataBinding {
      enabled = true
   }
}

dependencies {
   // data binding
   kapt "com.android.databinding:compiler:3.1.3"
}

Aprecie Kotlin ...

Jedsada Tiwongvorakul
fonte
aplique o plugin: 'kotlin-kapt' é realmente importante no Kotlin.
Rahul Rastogi
3

Atualização Importante

Você pode ver na documentação do Android.

O novo compilador na versão 3.2 está ativado por padrão.

Então, basta atualizar o seu Android Studio para a V3.2 ou mais recente . e remova todas as configurações desnecessárias.

Então, basta ativar o DataBinding no nível do aplicativo build.gradle.

android {
    dataBinding {
        enabled = true
    }
}

Ele fará todas as coisas automaticamente para você.

Você pode remover com segurança abaixo das linhas

  • Remover databinding.compiler

    kapt 'com.android.databinding:compiler:3.0.1'
  • Remover kapt

    kapt {
        generateStubs = true
    }

Minha configuração completa

build.gradle (Projeto)

kotlin_version = '1.2.71'    
classpath 'com.android.tools.build:gradle:3.2.0'

Use a versão mais recente do gradle . Use a versão mais recente do kotlin .

build.gradle (App)

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

compileSdkVersion 28
targetSdkVersion 28

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

Importante Não basta copiar e colar config. Veja esta resposta para configurar a versão do Kotlin.

gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
Khemraj
fonte
Meu projeto ainda está no lançamento do gradle 3.0.1, então isso não funcionou para mim.
naqi
Você pode atualizar seu Android Studio e gradle para obter mais estabilidade.
Khemraj
3

No meu caso, o erro foi que Unresolved reference: RegisterationUserBindingeu apenas usei o nome do meu layout fragment_registeration_userassim FragmentRegisterationUserBindinge o fiz no layout Databinding e o erro desapareceu.

EL TEGANI MOHAMED HAMMAD GABIR
fonte
Você é ótimo! Gastei muito tempo para aplicar várias sugestões para resolver o problema, mas desamparado até encontrar essa resposta. Alterar a ligação de acordo com o nome do layout do fragmento resolve o problema. Muito obrigado.
Ajay
feliz por ter ajudado você
EL TEGANI MOHAMED HAMMAD GABIR
2

Adicione o seguinte em você app build.gradle

kapt "com.android.databinding:compiler:$android_plugin_version"
apply plugin: 'kotlin-kapt' // This one at top where plugin belong to

Isto irá fazer o truque.

$android_plugin_versioné a versão de com.android.tools.build:gradlenaapplication build.gradle

Além disso, adicione isso ao seu módulo build.gradle

android { /// Existing Code kapt { generateStubs = true } }

RKS
fonte
0

Adicionar ligação de dados no projeto android usando quando você usa a linguagem kotlin.

Etapas abaixo

--Primeiro você precisa adicionar o plugin abaixo

**apply plugin: 'kotlin-kapt'**

--Segundo dataBinding ativado true

**dataBinding {
        enabled = true
    }**

Todo esse ponto foi adicionado em app.build.gradle após o hit "SYNC NOW"

Vamos, por exemplo, editar a atividade do perfil, como definir a variável de ligação no kotlin?

lateinit var buildProfileBinding: ActivityBuildProfileBinding

buildProfileBinding = getBinding()

Aqui, get binding é um método para lidar com qual tipo de objeto de ligação

protected <T extends ViewDataBinding> T getBinding() {
                return (T) binding;
            }
Shripal Shah
fonte
DataBinding Librabry kapt 'com.android.databinding: compiler: 2.3.1'
Shripal Shah
0

No meu caso, adicionando

kapt {
    generateStubs = true
}

Resolvido o problema para mim. Eu o ignorei na primeira vez, achei irrelevante para o problema:

Ligação de dados de referência não resolvida

Mas agora, a ligação de dados está funcionando bem.

Mahmoud
fonte
0

Quero compartilhar minha própria experiência. Para usar a ligação de dados com o Kotlin no android studio, basta adicionar

dataBinding {
    enabled = true
}

Depois disso, "sincronize" e, é muito importante, "criar projeto". Depois disso, todo o seu objeto estará ativo para uso.

sombrio
fonte
0

Antes de tentar usar FragmentDetailsBinding, você deve converter o layout correspondente (fragment_details.xml) para o layout de ligação de dados, envolvendo todo o layout no "" tag parent e movendo todos os xmlns para o tag de layout, então crie o projeto e pronto.

TarekB
fonte
-1

Apenas saia de todas as dependências de ligação de dados e use-a

android {
    dataBinding {
        enabled = true
    }
}
Kareem Alsaifi
fonte