Kotlin-android: nierozwiązane wiązanie danych referencyjnych

143

Mam następującą klasę fragmentów napisaną w Javie przy użyciu nowej biblioteki wiązania danych

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

Kompiluje się i działa dobrze.
Próbowałem przepisać to w Kotlinie i wymyśliłem:

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

Ale teraz krok :app:compileDebugKotlinwyświetla następujące informacje:

Błąd: (16, 38) Nierozwiązane odwołanie: wiązanie danych
Błąd: (37, 27) Nierozwiązane odwołanie: FragmentDataBinding

Jak mogę używać biblioteki powiązań danych z systemem Android w Kotlin?

Mój najwyższy poziom 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()
    }
}

Mój katalog build.gradlew aplikacji (tylko istotne części):

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

Używam Android Studio 1.4, narzędzi do kompilacji w wersji 23.0.1, zestawu SDK systemu Android 23, narzędzi SDK 24.4.0

Michaił
źródło
3
Zapraszam do głosowania na odpowiedni problem: https://youtrack.jetbrains.com/issue/KT-8007
Ghedeon
1
Musisz tylko mieć apply plugin: 'kotlin-kapt'plik gradle aplikacji w najnowszej wersji.
Hesam
prywatne wiązanie zmiennej lateinit: FragmentDataBinding Jest lepszym sposobem na zainicjowanie
Dino Sunny

Odpowiedzi:

85

Spróbuj użyć tej konfiguracji:

W głównym 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
    }
}

Aplikacja build.gradle :

android {
    dataBinding {
        enabled = true
    }
}

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

kapt {
    generateStubs = true
}
lrampazzo
źródło
1
@Irampazzo, 2.2.0-alphaXjest dostępny, a FYI wersja wiązania danych jest taka sama, jak w przypadku samej wtyczki android-gradle. więc możesz udostępnić tę wersję na zewnątrz i użyć jej jako wersji kompilatora.
Avinash R
1
Mogę potwierdzić, że ta odpowiedź rozwiązała mój problem z wiązaniem danych i kotlinem
Rabie Jradi
12
Musiałem apply plugin: 'kotlin-kapt'też dodać . Zobacz stackoverflow.com/a/42974558/1916449
arekolek
Próbowałem tego. Teraz daje mi cykliczny błąd zależności. Masz jakiś pomysł na ten temat?
leoOrion
Sprawdź kotlinlang.org/docs/tutorials/…, aby uzyskać oficjalną dokumentację na ten temat.
Brian
72

Znalazłem nowe rozwiązanie, mam nadzieję, że ci pomoże.

Przede wszystkim sprawdź, czy zastosowana wtyczka:

apply plugin: 'kotlin-kapt'

następnie

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

Możesz mieć błąd w zależności:

POSŁUGIWAĆ SIĘ

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

zamiast

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

Możesz odwiedzić tutaj nową wersję

Dziękuję Ci.

Pratik Butani
źródło
6
Nadal mam ten problem :(
Mladen Rakonjac,
To działa dla mnie (gradle wrapper 4.4, narzędzia 3.1.0)
Sergio,
Dodanie kapt 'com.android.databinding: kompilator: 3.0.1' działa dla mnie
Duran Jayson
U mnie zadziałało, dodając tylko "zastosuj wtyczkę: 'kotlin-kapt". Dzięki.
Subhan Ali
właśnie dodałem, że ta linia działa dla mnie (zastosuj wtyczkę: 'kotlin-kapt') Android Studio 3.2.1 - wtyczka Kotlin 1.3.0
Mohamed ElSawaf
14

Aktualizacja 2: To jest naprawdę stara odpowiedź, zamiast tego odwołaj się do odpowiedzi lrampazzo.

Działa z 1.0-rc4, put

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

do twoich zależności

Dzięki Ghedeon za link w komentarzach

Aktualizacja : Oto naprawdę prosty przykładowy projekt Hello World

Jaydeep Solanki
źródło
Nadal pojawia się ten sam błąd, czy robię coś nie tak? gist.github.com/xdgimf/820c433efa8307821788
Miguel Fermin
oto mój plik build.gradle, jeśli potrzebujesz referencji gist.github.com/jaydeep17/9960fdb0e5a1ba85e82d
Jaydeep Solanki
@Jaydeep Właśnie to wypróbowałem i działa. Jednak Android studio nie wyróżnia składni i generuje wiele błędów IDE z komunikatem Exception while analyzing expression at (12,23) in /projectpath/KotlinDataBinding/app/src/main/java/com/example/kotlindatabinding/MainActivity.kt:. Czy masz te same błędy? A jaka jest Twoja wersja Android Studio?
Michaił
@Arkadiy To już zostało zgłoszone youtrack.jetbrains.com/issue/KT-8007 BTW Jestem w studio v1.5
Wersja
To nie jest już najnowsza wersja wtyczki. Spowoduje to niepotrzebny ból.
Avinash R
13

Wersja kompilatora powiązania danych jest taka sama, jak wersja programu Gradle w pliku build.gradle projektu:

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


android {
  dataBinding.enabled = true
}

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

a wersja gradle to

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

Oto przykładowe łącze umożliwiające pełne wykorzystanie biblioteki wiązania danych w kotlin.

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

Sijansd
źródło
dataBinding.enabled = truebyło to, o czym zapomniałem
Cesar Castro
7

Aby rozwiązać problem, musisz umieścić

apply plugin: 'kotlin-kapt'

u góry build.gradle (Module: app), a następnie umieść tę linię w zależnościach

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

Możesz znaleźć wersję wtyczki Androida, przechodząc do menu

File > Project Structure > Project

Następnie zsynchronizuj ponownie. Jeśli zobaczysz to ostrzeżenie, zignoruj ​​je.

Przyczyną mogą być wtyczki Gradle innych firm

Sowattana Sigen
źródło
6

Spróbuj tego.Andrid studio 2.0 (2.1)

W build.gradle

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

kapt {
    generateStubs = true
}

W moim projekcie: buildToolsVersion = "23.0.3"

na najwyższym poziomie build.gradle

dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0'
    }
Garf1eld
źródło
2
powinieneś używać tej samej wersji zarówno dla kompilatora, jak i wtyczki gradle narzędzi do budowania Androida. W przeciwnym razie może to spowodować nieprzewidywalne problemy z kompilacją.
Avinash R
Musiałem dodać wtyczkę aplikacji: 'kotlin-kapt'
Andrii Kovalchuk
6

ta praca dla mnie w androidStudio ver3.1.3

apply plugin: 'kotlin-kapt'

dataBinding {
    enabled = true
}

pokaż próbkę użycia

emad pirayesh
źródło
4

Powiązanie danych konfiguracyjnych w kotlin

build.gradle (aplikacja folderu)

apply plugin: 'kotlin-kapt'

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

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

Ciesz się Kotlinem ...

Jedsada Tiwongvorakul
źródło
zastosuj wtyczkę: 'kotlin-kapt' jest bardzo ważny w Kotlinie.
Rahul Rastogi
3

Ważna aktualizacja

Możesz zobaczyć w dokumentacji Androida.

Nowy kompilator w wersji 3.2 jest domyślnie włączony.

Więc wystarczy zaktualizować swoją Android Studio V3.2 lub nowsza . i usuń wszystkie niepotrzebne config.

Po prostu włącz DataBinding na poziomie aplikacji build.gradle.

android {
    dataBinding {
        enabled = true
    }
}

Zrobi wszystko automatycznie.

Możesz BEZPIECZNIE USUNĄĆ poniższe linie-

  • Usuń databinding.compiler

    kapt 'com.android.databinding:compiler:3.0.1'
  • Usunąć kapt

    kapt {
        generateStubs = true
    }

Moja pełna konfiguracja

build.gradle (projekt)

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

Użyj najnowszej wersji Gradle . Użyj najnowszej wersji Kotlin .

build.gradle (aplikacja)

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"

Ważne Nie tylko kopiuj i wklejaj config. Zobacz tę odpowiedź, aby skonfigurować wersję Kotlin.

gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
Khemraj
źródło
Mój projekt jest nadal w wersji 3.0.1, więc to nie zadziałało.
naqi
Możesz zaktualizować Android Studio i gradle, aby uzyskać większą stabilność.
Khemraj
3

W moim przypadku błąd polegał na tym, Unresolved reference: RegisterationUserBindingże po prostu użyłem mojej nazwy układu w fragment_registeration_userten sposób FragmentRegisterationUserBindingi zrobiłem to w układzie Databinding, a błąd zniknął.

EL TEGANI MOHAMED HAMMAD GABIR
źródło
Jesteś wspaniały! Spędziłem dużo czasu, aby zastosować wiele sugestii, aby rozwiązać problem, ale bezradny, dopóki nie znalazłem tej odpowiedzi. Zmiana powiązania zgodnie z nazwą układu fragmentów rozwiązuje problem. Wielkie dzięki.
Ajay
cieszę się, że ci pomogło
EL TEGANI MOHAMED HAMMAD GABIR
2

Dodaj w sobie obserwujących app build.gradle

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

To wystarczy.

$android_plugin_versionto wersja com.android.tools.build:gradlewapplication build.gradle

Dodaj to również do swojego modułu build.gradle

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

RKS
źródło
0

Dodaj wiązanie danych w Android Project używając, gdy używasz języka kotlin.

Poniżej kroki

- Najpierw musisz dodać poniższą wtyczkę

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

--Drugie wiązanie danych włączone prawda

**dataBinding {
        enabled = true
    }**

Wszystko to zostało dodane w app.build.gradle po kliknięciu „SYNCHRONIZUJ TERAZ”

Pozwala na przykład edytować aktywność profilu, to jak zdefiniować zmienną wiążącą w kotlin?

lateinit var buildProfileBinding: ActivityBuildProfileBinding

buildProfileBinding = getBinding()

Tutaj get binding jest metodą do obsługi typu obiektu powiązania

protected <T extends ViewDataBinding> T getBinding() {
                return (T) binding;
            }
Shripal Shah
źródło
DataBinding Librabry kapt 'com.android.databinding: kompilator: 2.3.1'
Shripal Shah
0

W moim przypadku dodanie

kapt {
    generateStubs = true
}

Rozwiązał problem za mnie. Zignorowałem to za pierwszym razem, pomyślałem, że nie ma to związku z problemem:

Nierozwiązane powiązanie danych odniesienia

Ale teraz wiązanie danych działa dobrze.

Mahmoud
źródło
0

Chcę podzielić się własnym doświadczeniem. Aby użyć powiązania danych z Kotlin w Android Studio wystarczy dodać

dataBinding {
    enabled = true
}

Następnie „zsynchronizuj” i, bardzo ważne, „utwórz projekt”. Po tym wszystkim twój obiekt będzie aktywny.

ponury
źródło
0

Zanim spróbujesz użyć FragmentDetailsBinding, musisz się upewnić, że przekonwertowałeś odpowiedni układ (fragment_details.xml) na układ wiązania danych przez zawinięcie całego układu w element nadrzędny tagu "" i przeniesienie wszystkich xmlns do tagu układu, a następnie skompilowanie projektu i to wszystko

TarekB
źródło
-1

Po prostu usuń wszystkie zależności związane z danymi i użyj tego zamiast tego

android {
    dataBinding {
        enabled = true
    }
}
Kareem Alsaifi
źródło