Kotlin-android: enlace de datos de referencia sin resolver

143

Tengo la siguiente clase de fragmento escrita en Java usando la nueva biblioteca de enlace de datos

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();
    }
}

Se compila y funciona bien.
Traté de reescribirlo en Kotlin y se me ocurrió lo siguiente:

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()
    }
}

Pero ahora el paso :app:compileDebugKotlingenera lo siguiente:

Error: (16, 38) Referencia sin resolver: enlace de datos
Error: (37, 27) Referencia sin resolver: FragmentDataBinding

¿Cómo puedo usar la biblioteca de enlace de datos de Android con Kotlin?

Mi nivel 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()
    }
}

Mi build.gradledirectorio en la aplicación (solo 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'
    }
}

Estoy usando Android Studio 1.4, Build tools versión 23.0.1, Android SDK 23, SDK tools 24.4.0

Mikhail
fuente
3
Por favor, siéntase libre de votar por el tema correspondiente: https://youtrack.jetbrains.com/issue/KT-8007
Ghedeon
1
Solo necesita tener el apply plugin: 'kotlin-kapt'archivo gradle de la aplicación en la versión más reciente.
Hesam
enlace lateinit privado var: FragmentDataBinding es una mejor manera de inicializar
Dino Sunny

Respuestas:

85

Intenta usar esta configuración:

En 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
fuente
1
@Irampazzo, 2.2.0-alphaXestá disponible, y para su información, la versión de enlace de datos es la misma que la del complemento android-gradle. para que pueda externalizar esa versión y usarla como la versión del compilador.
Avinash R
1
Puedo confirmar que esta respuesta solucionó mi problema con el enlace de datos y el kotlin
Rabie Jradi
12
Tuve que agregar apply plugin: 'kotlin-kapt'también. Ver stackoverflow.com/a/42974558/1916449
arekolek
Intenté esto Ahora me da un error de dependencia circular. ¿Alguna idea sobre esto?
leoOrion
Visite kotlinlang.org/docs/tutorials/… para obtener documentación oficial sobre esto.
Brian
72

Encontré una nueva solución, espero que te ayude.

En primer lugar, compruebe si se aplica el complemento:

apply plugin: 'kotlin-kapt'

luego

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

Es posible que tenga un error en la dependencia:

UTILIZAR

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

en vez de

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

Puedes visitar aquí para una nueva versión

Gracias.

Pratik Butani
fuente
66
Todavía tengo este problema :(
Mladen Rakonjac
Esto está funcionando para mí (gradle wrapper 4.4, herramientas 3.1.0)
Sergio
Agregar kapt 'com.android.databinding: compiler: 3.0.1' funciona para mí
Duran Jayson
Funcionó para mí agregando solo "apply plugin: 'kotlin-kapt". Gracias.
Subhan Ali
Acabo de agregar que esta línea funciona para mí (aplique el complemento: 'kotlin-kapt') Android Studio 3.2.1 -
Complemento
14

Actualización 2: Esta es una respuesta muy antigua, en cambio, consulte la respuesta de lrampazzo.

Funciona con 1.0-rc4, pon

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

en tus dependencias

Gracias Ghedeon, por el enlace en los comentarios.

Actualización : Aquí hay un proyecto de ejemplo de hello world realmente simple

Jaydeep Solanki
fuente
Todavía recibo el mismo error, ¿estoy haciendo algo mal aquí? gist.github.com/xdgimf/820c433efa8307821788
Miguel Fermin
aquí está mi archivo build.gradle si necesita una referencia gist.github.com/jaydeep17/9960fdb0e5a1ba85e82d
Jaydeep Solanki
@ Jaydeep Lo acabo de probar y está funcionando. Sin embargo, Android Studio no resalta la sintaxis y genera muchos errores IDE con el mensaje Exception while analyzing expression at (12,23) in /projectpath/KotlinDataBinding/app/src/main/java/com/example/kotlindatabinding/MainActivity.kt:. ¿Tienes los mismos errores? ¿Y cuál es tu versión de estudio de Android?
Mikhail
@Arkadiy Ya se ha informado youtrack.jetbrains.com/issue/KT-8007 BTW Estoy en studio v1.5 Preview 2
Jaydeep Solanki el
Esta ya no es la última versión del complemento. Causará dolor innecesario.
Avinash R
13

La versión del compilador de enlace de datos es la misma que la versión gradle en el archivo build.gradle de su proyecto:

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


android {
  dataBinding.enabled = true
}

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

y la versión gradle es

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

Aquí hay un enlace de ejemplo para completar el uso de la biblioteca de enlace de datos en kotlin.

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

Sijansd
fuente
dataBinding.enabled = trueera lo que estaba olvidando
Cesar Castro
7

Para resolver el problema, tienes que poner

apply plugin: 'kotlin-kapt'

en la parte superior de build.gradle (Módulo: aplicación), luego ponga esta línea en dependencias

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

Puede encontrar la versión del complemento de Android yendo al menú

File > Project Structure > Project

Luego sincronice nuevamente. Si ve esta advertencia, ignórela.

Los complementos de Gradle de terceros pueden ser la causa

Sowattana Sigen
fuente
6

Prueba esto.Andrid studio 2.0 (2.1)

En build.gradle

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

kapt {
    generateStubs = true
}

En mi proyecto: buildToolsVersion = "23.0.3"

en el nivel superior build.gradle

dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0'
    }
Garf1eld
fuente
2
debe usar la misma versión para el compilador y el complemento gradle de herramientas de compilación de Android. De lo contrario, puede causar problemas de compilación impredecibles.
Avinash R
Tuve que agregar el complemento de aplicación: 'kotlin-kapt'
Andrii Kovalchuk
6

esto funciona para mí en androidStudio ver3.1.3

apply plugin: 'kotlin-kapt'

dataBinding {
    enabled = true
}

muestra muestra de uso

emad pirayesh
fuente
4

Enlace de datos de configuración en kotlin

build.gradle (aplicación de carpeta)

apply plugin: 'kotlin-kapt'

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

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

Disfruta Kotlin ...

Jedsada Tiwongvorakul
fuente
aplique el complemento: 'kotlin-kapt' es realmente importante en Kotlin.
Rahul Rastogi
3

Actualización importante

Puedes ver en la documentación de Android.

El nuevo compilador en la versión 3.2 está habilitado de forma predeterminada.

Así que solo actualice su Android Studio a V3.2 o posterior . y elimine toda la configuración innecesaria.

Entonces, solo habilite dataBinding en el nivel de la aplicación build.gradle.

android {
    dataBinding {
        enabled = true
    }
}

Hará todas las cosas por usted automáticamente.

PUEDE QUITARSE SEGURAMENTE debajo de las líneas-

  • Eliminar databinding.compiler

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

    kapt {
        generateStubs = true
    }

Mi configuración completa

build.gradle (Proyecto)

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

Utiliza la última versión de gradle . Use la última versión de kotlin .

build.gradle (aplicación)

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 No solo copie y pegue la configuración. Consulte esta respuesta para configurar la versión de Kotlin.

gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
Khemraj
fuente
Mi proyecto todavía está en la versión 3.0.1 de Gradle, así que esto no funcionó para mí.
naqi
Puede actualizar su Android Studio y gradle para lograr más estabilidad.
Khemraj
3

En mi caso, el error fue Unresolved reference: RegisterationUserBindingque simplemente utilicé mi nombre de diseño de fragment_registeration_useresta manera FragmentRegisterationUserBindingy lo hice en el diseño de enlace de datos y el error desapareció.

EL TEGANI MOHAMED HAMMAD GABIR
fuente
¡Eres genial! Pasé mucho tiempo aplicando múltiples sugerencias para resolver el problema, pero indefenso hasta que encontré esta respuesta. Cambiar el enlace de acuerdo con el nombre del diseño del fragmento resuelve el problema. Muchas gracias.
Ajay
me alegro de que te haya ayudado
EL TEGANI MOHAMED HAMMAD GABIR
2

Añadir seguimiento en ti app build.gradle

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

Esto hará el truco.

$android_plugin_version es la versión de com.android.tools.build:gradle enapplication build.gradle

Además, agregue esto a su módulo build.gradle

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

RKS
fuente
0

Agregue Databinding en Android Project usando cuando haya usado el lenguaje kotlin.

A continuación los pasos

--Primero necesita agregar el complemento a continuación

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

--Segundo enlace de datos habilitado verdadero

**dataBinding {
        enabled = true
    }**

Todo este punto agregado en app.build.gradle después de presionar "SINCRONIZAR AHORA"

Permite, por ejemplo, editar actividad de perfil, ¿cómo definir la variable de enlace en kotlin?

lateinit var buildProfileBinding: ActivityBuildProfileBinding

buildProfileBinding = getBinding()

Aquí, obtener enlace es un método para manejar qué tipo de objeto de enlace

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

En mi caso, agregando

kapt {
    generateStubs = true
}

Resolvió el problema para mí. Lo ignoré la primera vez, pensé que era irrelevante para el problema:

Enlace de datos de referencia sin resolver

Pero ahora, el enlace de datos funciona bien.

Mahmoud
fuente
0

Quiero compartir mi propia experiencia. Para usar el enlace de datos con Kotlin en Android Studio es suficiente agregar

dataBinding {
    enabled = true
}

Después de eso "sincronízalo" y, es muy importante, "hacer Project". Después de eso, todo su objeto estará activo para usar.

gloomyad
fuente
0

Antes de intentar usar FragmentDetailsBinding, debe asegurarse de convertir el diseño correspondiente (fragment_details.xml) en un diseño de enlace de datos envolviendo todo el diseño en la etiqueta "" padre y mover todos los xmlns a la etiqueta de diseño, luego construir el proyecto y listo.

TarekB
fuente
-1

Simplemente salga de todas las dependencias de enlace de datos y use esto en su lugar

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