Kotlin-android: database di riferimento irrisolto


143

Ho seguito la seguente classe di frammenti scritta in Java usando la nuova libreria di database

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

Si compila e funziona bene.
Ho provato a riscriverlo in Kotlin e ho pensato a quanto segue:

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

Ma ora il passo :app:compileDebugKotlingenera quanto segue:

Errore: (16, 38) Riferimento non risolto: databinding
Errore: (37, 27) Riferimento non risolto: FragmentDataBinding

Come posso usare la libreria Android Databinding con Kotlin?

Il mio livello principale 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 (solo parti rilevanti):

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

Sto usando Android Studio 1.4, Build tools versione 23.0.1, Android SDK 23, SDK tools 24.4.0


3
Sentiti libero di votare per la questione corrispondente: https://youtrack.jetbrains.com/issue/KT-8007
Ghedeon

1
Hai solo bisogno di avere apply plugin: 'kotlin-kapt'nel file gradle app nella versione più recente.
Hesam

associazione privata lateinit var: FragmentDataBinding È un modo migliore per inizializzare
Dino Sunny

Risposte:


85

Prova a usare questa configurazione:

Nel build.gradle principale :

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
}

1
@Irampazzo, 2.2.0-alphaXè disponibile, e FYI la versione di data-binding è la stessa di quella di Android-Gradle-Plugin stesso. così puoi esternalizzare quella versione e usarla come versione del compilatore.
Avinash R

1
Posso confermare che questa risposta ha risolto il mio problema con il databinding e il kotlin
Rabie Jradi,

12
Ho dovuto aggiungere apply plugin: 'kotlin-kapt'anche. Vedere stackoverflow.com/a/42974558/1916449
arekolek

Ci ho provato Ora mi dà un errore di dipendenza circolare. Qualche idea su questo?
leoOrion,

Controlla kotlinlang.org/docs/tutorials/… per la documentazione ufficiale su questo.
Brian,

72

Ho trovato una nuova soluzione, spero che ti possa aiutare.

Prima di tutto controlla se il plugin è stato applicato:

apply plugin: 'kotlin-kapt'

poi

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

Potresti avere un errore nella dipendenza:

USO

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

invece di

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

Puoi visitare qui per la nuova versione

Grazie.


6
Ho ancora questo problema :(
Mladen Rakonjac il

Questo funziona per me (gradle wrapper 4.4, strumenti 3.1.0)
Sergio,

Aggiunta di kapt 'com.android.databinding: compilatore: 3.0.1' funziona per me
Duran Jayson,

Ha funzionato per me aggiungendo solo "applica plugin: 'kotlin-kapt". Grazie.
Subhan Ali,

ho appena aggiunto che questa linea funziona per me (applica il plugin: 'kotlin-kapt') Android Studio 3.2.1 - Kotlin plugin 1.3.0
Mohamed ElSawaf

14

Aggiornamento 2: questa è una risposta molto vecchia, invece fai riferimento alla risposta di lrampazzo.

Funziona con 1.0-rc4, put

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

nelle tue dipendenze

Grazie Ghedeon, per il link nei commenti

Aggiornamento : ecco un progetto di esempio ciao mondo davvero semplice


Ricevo ancora lo stesso errore, sto facendo qualcosa di sbagliato qui? gist.github.com/xdgimf/820c433efa8307821788
Miguel Fermin

ecco il mio file build.gradle se hai bisogno di un riferimento gist.github.com/jaydeep17/9960fdb0e5a1ba85e82d
Solanki,

@Jaydeep L'ho appena provato e funziona. Tuttavia Android Studio non evidenzia la sintassi e genera molti errori IDE con il messaggio Exception while analyzing expression at (12,23) in /projectpath/KotlinDataBinding/app/src/main/java/com/example/kotlindatabinding/MainActivity.kt:. Hai gli stessi errori? E qual è la tua versione di Android Studio?
Mikhail,

@Arkadiy È già stato segnalato youtrack.jetbrains.com/issue/KT-8007 A proposito, sono in studio v1.5 Anteprima 2
Jaydeep Solanki,

Questa non è più l'ultima versione del plugin. Causerà dolore inutile.
Avinash R

13

La versione del compilatore Data Binding è la stessa della versione gradle nel file build.gradle del progetto:

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


android {
  dataBinding.enabled = true
}

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

e la versione graduale è

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

Ecco un link di esempio per completare l'utilizzo della libreria di database in kotlin.

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


dataBinding.enabled = trueera quello che stavo dimenticando
Cesar Castro,

7

Per risolvere il problema, devi mettere

apply plugin: 'kotlin-kapt'

nella parte superiore di build.gradle (Modulo: app), quindi inserire questa riga nelle dipendenze

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

Puoi trovare la versione del plug-in Android dal menu

File > Project Structure > Project

Quindi sincronizzare di nuovo. Se vedi questo avviso, ignoralo.

I plug-in Gradle di terze parti potrebbero essere la causa


6

Prova questo. Android Studio 2.0 (2.1)

In build.gradle

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

kapt {
    generateStubs = true
}

Nel mio progetto: buildToolsVersion = "23.0.3"

in build.gradle di livello superiore

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

2
dovresti usare la stessa versione sia per il compilatore che per il plugin gradle degli strumenti di build Android. Altrimenti può causare problemi di build imprevedibili.
Avinash R

Ho dovuto aggiungere il plugin apply: 'kotlin-kapt'
Andrii Kovalchuk,

6

questo lavoro per me in androidStudio ver3.1.3

apply plugin: 'kotlin-kapt'

dataBinding {
    enabled = true
}

mostra esempio di utilizzo


4

Associazione dei dati di configurazione in kotlin

build.gradle (app cartella)

apply plugin: 'kotlin-kapt'

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

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

Goditi Kotlin ...


applica plugin: 'kotlin-kapt' è davvero importante in Kotlin.
Rahul Rastogi,

3

Aggiornamento importante

Puoi vedere nella documentazione di Android.

Il nuovo compilatore nella versione 3.2 è abilitato per impostazione predefinita.

Quindi basta aggiornare il tuo Android Studio alla versione 3.2 o successiva . e rimuovere tutte le configurazioni non necessarie.

Quindi basta abilitare dataBinding a livello di app build.gradle.

android {
    dataBinding {
        enabled = true
    }
}

Farà tutto automaticamente per te.

Puoi RIMUOVERE SICURAMENTE sotto le righe-

  • Rimuovere databinding.compiler

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

    kapt {
        generateStubs = true
    }

La mia configurazione completa

build.gradle (progetto)

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

Usa l'ultima versione gradle . Usa l'ultima versione di 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 Non solo copiare e incollare config. Vedi questa risposta per impostare la versione di Kotlin.

gradle-wrapper.properties

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

Il mio progetto è ancora in versione 3.0.1, quindi non ha funzionato per me.
naqi

Puoi aggiornare Android Studio e la pendenza per ottenere maggiore stabilità.
Khemraj,

3

Nel mio caso, l'errore era che Unresolved reference: RegisterationUserBindingho appena usato il mio nome di layout in fragment_registeration_userquesto modo FragmentRegisterationUserBindinge l'ho fatto nel layout di Databinding e l'errore è andato via.


Sei grande! Ho impiegato molto tempo per applicare molteplici suggerimenti per risolvere il problema, ma impotente fino a trovare questa risposta. La modifica dell'associazione in base al nome del layout del frammento risolve il problema. Molte grazie.
Ajay,

felice che ti abbia aiutato
EL TEGANI MOHAMED HAMMAD GABIR

2

Aggiungi il seguito in te app build.gradle

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

Questo farà il trucco.

$android_plugin_version è la versione di com.android.tools.build:gradle inapplication build.gradle

Inoltre, aggiungi questo al tuo modulo build.gradle

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


0

Aggiungi il Databinding nel progetto Android usando quando hai usato il linguaggio kotlin.

Sotto i passaggi

- Prima devi aggiungere il plugin qui sotto

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

- Secondo dataBinding abilitato true

**dataBinding {
        enabled = true
    }**

Tutto questo punto è stato aggiunto in app.build.gradle dopo aver premuto "SYNC NOW"

Consente ad esempio di modificare l'attività del profilo, quindi come definire la variabile di associazione in kotlin ??

lateinit var buildProfileBinding: ActivityBuildProfileBinding

buildProfileBinding = getBinding()

Qui, ottenere il binding è il metodo per gestire il tipo di oggetto di binding

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

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

0

Nel mio caso, aggiungendo

kapt {
    generateStubs = true
}

Risolto il problema per me L'ho ignorato la prima volta, ho pensato che fosse irrilevante per il problema:

Databinding di riferimento non risolto

Ma ora, l'associazione dati funziona bene.


0

Voglio condividere la mia esperienza. Per utilizzare la banca dati di dati con Kotlin in Android Studio è sufficiente aggiungere

dataBinding {
    enabled = true
}

Dopodiché "sincronizzalo" ed è molto importante "realizzare il Progetto". Dopodiché tutto il tuo oggetto sarà attivo da usare.


0

Prima di provare a utilizzare FragmentDetailsBinding devi assicurarti di aver convertito il layout corrispondente (fragment_details.xml) in layout di associazione dei dati avvolgendo l'intero layout in "" tag parent e spostando tutti gli xmlns nel tag layout, quindi costruisci il progetto e il gioco è fatto


-1

Basta uscire da tutte le dipendenze di database e usare invece questo

android {
    dataBinding {
        enabled = true
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.