Kotlin-Android: liaison de données de référence non résolue


143

J'ai la classe de fragment suivante écrite en Java à l'aide de la nouvelle bibliothèque de liaison de données

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

Il compile et fonctionne bien.
J'ai essayé de le réécrire dans Kotlin et j'ai trouvé ce qui suit:

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

Mais maintenant, l'étape :app:compileDebugKotlinproduit ce qui suit:

Erreur: (16, 38) Référence non résolue
: erreur de liaison de données : (37, 27) Référence non résolue: FragmentDataBinding

Comment puis-je utiliser la bibliothèque de liaison de données Android avec Kotlin?

Mon niveau supérieur 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()
    }
}

My build.gradlein app dir (uniquement les parties pertinentes):

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'
    }
}

J'utilise Android Studio 1.4, Build tools version 23.0.1, Android SDK 23, SDK tools 24.4.0


3
N'hésitez pas à voter pour le numéro correspondant: https://youtrack.jetbrains.com/issue/KT-8007
Ghedeon

1
Vous devez seulement avoir apply plugin: 'kotlin-kapt'dans le fichier de gradle d'application dans la version la plus récente.
Hesam

liaison private lateinit var: FragmentDataBinding est un meilleur moyen d'initialiser
Dino Sunny

Réponses:


85

Essayez d'utiliser cette configuration:

Dans main build.gradle :

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

Build de l' application . :

android {
    dataBinding {
        enabled = true
    }
}

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

kapt {
    generateStubs = true
}

1
@Irampazzo, 2.2.0-alphaXest disponible, et pour info, la version de la liaison de données est la même que celle d'Android-gradle-plugin lui-même. afin que vous puissiez externaliser cette version et l'utiliser comme version du compilateur.
Avinash R

1
Je peux confirmer que cette réponse a résolu mon problème de liaison de données et de kotlin
Rabie Jradi

12
J'ai dû ajouter apply plugin: 'kotlin-kapt'aussi. Voir stackoverflow.com/a/42974558/1916449
arekolek

J'ai essayé ça. Maintenant, cela me donne une erreur de dépendance circulaire. Une idée à ce sujet?
leoOrion

Consultez kotlinlang.org/docs/tutorials/… pour la documentation officielle à ce sujet.
Brian

72

J'ai trouvé une nouvelle solution, j'espère qu'elle vous aidera.

Tout d'abord, vérifiez si le plugin est appliqué:

apply plugin: 'kotlin-kapt'

puis

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

Vous pourriez avoir une erreur dans la dépendance:

UTILISATION

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

au lieu de

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

Vous pouvez visiter ici pour la nouvelle version

Je vous remercie.


6
J'ai toujours ce problème :(
Mladen Rakonjac

Cela fonctionne pour moi (Gradle wrapper 4.4, tools 3.1.0)
Sergio

L'ajout de kapt 'com.android.databinding: compiler: 3.0.1' fonctionne pour moi
Duran Jayson

Cela a fonctionné pour moi en ajoutant uniquement "apply plugin: 'kotlin-kapt". Merci.
Subhan Ali

vient d'ajouter cette ligne fonctionne pour moi (appliquer le plugin: 'kotlin-kapt') Android Studio 3.2.1 - Kotlin plugin 1.3.0
Mohamed ElSawaf

14

Mise à jour 2: C'est une réponse très ancienne, référez-vous plutôt à la réponse de lrampazzo.

Cela fonctionne avec 1.0-rc4, mettez

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

dans vos dépendances

Merci Ghedeon, pour le lien dans les commentaires

Mise à jour : Voici un exemple de projet Hello World très simple


J'obtiens toujours la même erreur, est-ce que je fais quelque chose de mal ici? gist.github.com/xdgimf/820c433efa8307821788
Miguel Fermin

voici mon fichier build.gradle si vous avez besoin d'une référence gist.github.com/jaydeep17/9960fdb0e5a1ba85e82d
Jaydeep Solanki

@Jaydeep Je viens de l'essayer, et ça marche. Cependant, le studio Android ne met pas en évidence la syntaxe et génère de nombreuses erreurs IDE avec message Exception while analyzing expression at (12,23) in /projectpath/KotlinDataBinding/app/src/main/java/com/example/kotlindatabinding/MainActivity.kt:. Avez-vous les mêmes erreurs? Et quelle est votre version de studio Android?
Mikhail

@Arkadiy Il a déjà été rapporté youtrack.jetbrains.com/issue/KT-8007 BTW Je suis en studio v1.5 Preview 2
Jaydeep Solanki

Ce n'est plus la dernière version du plugin. Cela causera une douleur inutile.
Avinash R

13

La version du compilateur de liaison de données est la même que la version gradle dans votre fichier build.gradle de projet:

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


android {
  dataBinding.enabled = true
}

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

et la version gradle est

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

Voici un exemple de lien pour terminer l'utilisation de la bibliothèque de liaison de données dans kotlin.

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


dataBinding.enabled = trueétait ce que j'oubliais
Cesar Castro

7

Pour résoudre le problème, vous devez mettre

apply plugin: 'kotlin-kapt'

en haut de build.gradle (Module: app), puis mettez cette ligne dans les dépendances

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

Vous pouvez trouver la version du plugin Android en allant dans le menu

File > Project Structure > Project

Puis synchronisez à nouveau. Si vous voyez cet avertissement, ignorez-le.

Les plug-ins Gradle tiers peuvent être la cause


6

Essayez ceci.Andrid studio 2.0 (2.1)

Dans build.gradle

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

kapt {
    generateStubs = true
}

Dans mon projet: buildToolsVersion = "23.0.3"

dans build.gradle de niveau supérieur

dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0'
    }

2
vous devez utiliser la même version pour le compilateur et le plugin gradle des outils de construction Android. Sinon, cela peut entraîner des problèmes de construction imprévisibles.
Avinash R

J'ai dû ajouter le plugin d'application: 'kotlin-kapt'
Andrii Kovalchuk

6

ce travail pour moi dans androidStudio ver3.1.3

apply plugin: 'kotlin-kapt'

dataBinding {
    enabled = true
}

afficher un exemple d'utilisation


4

Liaison des données de configuration dans kotlin

build.gradle (application de dossier)

apply plugin: 'kotlin-kapt'

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

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

Profitez de Kotlin ...


apply plugin: 'kotlin-kapt' est vraiment important dans Kotlin.
Rahul Rastogi

3

Mise à jour importante

Vous pouvez voir dans la documentation d'Android.

Le nouveau compilateur de la version 3.2 est activé par défaut.

Il suffit donc de mettre à jour votre Android Studio vers la V3.2 ou une version plus récente . et supprimez toutes les configurations inutiles.

Donc, activez simplement dataBinding au niveau de l'application build.gradle.

android {
    dataBinding {
        enabled = true
    }
}

Il fera tout pour vous automatiquement.

Vous pouvez ENLEVER EN TOUTE SÉCURITÉ sous les lignes-

  • Supprimer databinding.compiler

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

    kapt {
        generateStubs = true
    }

Ma configuration complète

build.gradle (Projet)

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

Utilisez la dernière version de gradle . Utiliser la dernière version de Kotlin .

build.gradle (application)

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"

Important Ne copiez et collez pas simplement la configuration. Voir cette réponse pour configurer la version Kotlin.

gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip

Mon projet est toujours sur la version gradle 3.0.1 donc cela n'a pas fonctionné pour moi.
naqi

Vous pouvez mettre à jour votre Android Studio et graduer pour obtenir plus de stabilité.
Khemraj

3

Dans mon cas, l'erreur était que Unresolved reference: RegisterationUserBindingje viens d'utiliser mon nom de mise en page fragment_registeration_usercomme celui-ci FragmentRegisterationUserBindinget que je l'ai fait dans la mise en page de liaison de données et l'erreur a disparu.


Vous êtes formidable! J'ai passé beaucoup de temps à appliquer plusieurs suggestions pour résoudre le problème mais impuissant jusqu'à ce que trouvé cette réponse. La modification de la liaison en fonction du nom de la mise en page du fragment résout le problème. Merci beaucoup.
Ajay


2

Ajoutez le suivi en vous app build.gradle

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

Ça fera l'affaire.

$android_plugin_versionest la version de com.android.tools.build:gradledansapplication build.gradle

Ajoutez également ceci à votre module build.gradle

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


0

Ajoutez Databinding dans Android Project en utilisant lorsque vous avez utilisé le langage kotlin.

Sous les étapes

- Vous devez d'abord ajouter le plugin ci-dessous

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

--Second dataBinding enabled true

**dataBinding {
        enabled = true
    }**

Tout ce point ajouté dans app.build.gradle après avoir frappé "SYNC NOW"

Par exemple, vous avez modifier l'activité du profil, puis comment définir la variable de liaison dans kotlin ??

lateinit var buildProfileBinding: ActivityBuildProfileBinding

buildProfileBinding = getBinding()

Ici, get binding est une méthode pour gérer le type d'objet de liaison

protected <T extends ViewDataBinding> T getBinding() {
                return (T) binding;
            }

DataBinding Librabry kapt 'com.android.databinding: compiler: 2.3.1'
Shripal Shah

0

Dans mon cas, ajouter

kapt {
    generateStubs = true
}

Résolu le problème pour moi. Je l'ai ignoré la première fois, j'ai pensé que cela n'avait rien à voir avec le problème:

Liaison de données de référence non résolue

Mais maintenant, la liaison de données fonctionne très bien.


0

Je veux partager ma propre expérience. Pour utiliser la liaison de données avec Kotlin dans Android Studio, il suffit d'ajouter

dataBinding {
    enabled = true
}

Après cela, «synchronisez-le» et, c'est très important, de «créer un projet». Après cela, tout votre objet sera actif à utiliser.


0

Avant d'essayer d'utiliser FragmentDetailsBinding, vous devez vous assurer que vous avez converti la mise en page correspondante (fragment_details.xml) en mise en page de liaison de données en enveloppant toute la mise en page dans la balise "" tag parent et en déplaçant tous les xmlns vers la balise de mise en page, puis créez le projet et c'est tout


-1

Sortez simplement de toutes les dépendances de liaison de données et utilisez ceci à la place

android {
    dataBinding {
        enabled = true
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.