Kotlin-android: penyatuan data referensi yang tidak terselesaikan


143

Saya telah mengikuti kelas fragmen yang ditulis dalam Java menggunakan perpustakaan penyatuan data baru

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

Ini mengkompilasi dan berjalan dengan baik.
Saya mencoba untuk menulis ulang di Kotlin dan muncul sebagai berikut:

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

Tapi sekarang langkah :app:compileDebugKotlinoutput sebagai berikut:

Kesalahan: (16, 38) Referensi yang tidak terselesaikan: penyatuan data
Kesalahan: (37, 27) Referensi yang belum terselesaikan: FragmentDataBinding

Bagaimana saya bisa menggunakan perpustakaan penyatuan data android dengan Kotlin?

Tingkat atas saya 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()
    }
}

build.gradleDir dalam aplikasi saya (hanya bagian yang relevan):

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

Saya menggunakan Android Studio 1.4, Build tools versi 23.0.1, Android SDK 23, SDK tools 24.4.0


3
Silakan, bebas memilih untuk isu yang terkait: https://youtrack.jetbrains.com/issue/KT-8007
Ghedeon

1
Anda hanya perlu memiliki apply plugin: 'kotlin-kapt'file aplikasi gradle dalam versi terbaru.
Hesam

private lateinit var binding: FragmentDataBinding Adalah cara yang lebih baik untuk menginisialisasi
Dino Sunny

Jawaban:


85

Coba gunakan konfigurasi ini:

Di build.gradle utama :

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

Aplikasi build.gradle :

android {
    dataBinding {
        enabled = true
    }
}

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

kapt {
    generateStubs = true
}

1
@Irampazzo, 2.2.0-alphaXtersedia, dan FYI versi pengikatan data sama dengan versi android-gradle-plugin itu sendiri. sehingga Anda dapat mengeksternalisasi versi itu dan menggunakannya sebagai versi kompiler.
Avinash R

1
Saya dapat mengkonfirmasi bahwa jawaban ini memperbaiki masalah saya dengan penyatuan data dan kotlin
Rabie Jradi

12
Saya harus menambahkan apply plugin: 'kotlin-kapt'juga. Lihat stackoverflow.com/a/42974558/1916449
arekolek

Saya mencoba ini. Sekarang ini memberi saya kesalahan ketergantungan melingkar. Ada ide tentang ini?
leoOrion

Lihatlah kotlinlang.org/docs/tutorials/… untuk dokumentasi resmi mengenai hal ini.
Brian

72

Saya menemukan solusi baru, semoga akan membantu Anda.

Pertama-tama periksa apakah plugin diterapkan:

apply plugin: 'kotlin-kapt'

kemudian

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

Anda mungkin memiliki kesalahan dalam ketergantungan:

MENGGUNAKAN

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

dari pada

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

Anda dapat mengunjungi di sini untuk versi baru

Terima kasih.


6
Saya masih memiliki masalah ini :(
Mladen Rakonjac

Ini bekerja untuk saya (pembungkus grader 4.4, alat 3.1.0)
Sergio

Menambahkan kapt 'com.android.databinding: compiler: 3.0.1' berfungsi untuk saya
Duran Jayson

Ini bekerja untuk saya dengan menambahkan hanya "apply plugin: 'kotlin-kapt". Terima kasih.
Subhan Ali

baru saja menambahkan baris ini berfungsi untuk saya (terapkan plugin: 'kotlin-kapt') Android Studio 3.2.1 - Plugin Kotlin 1.3.0
Mohamed ElSawaf

14

Pembaruan 2: Ini adalah jawaban yang sangat lama, alih-alih merujuk pada jawaban lrampazzo.

Ini bekerja dengan 1.0-rc4, put

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

ke dalam dependensi Anda

Terima kasih Ghedeon, untuk tautannya di komentar

Pembaruan : Ini contoh proyek hello world yang sangat sederhana


Saya masih mendapatkan kesalahan yang sama, apakah saya melakukan sesuatu yang salah di sini? gist.github.com/xdgimf/820c433efa8307821788
Miguel Fermin

inilah file build.gradle saya jika Anda memerlukan referensi gist.github.com/jaydeep17/9960fdb0e5a1ba85e82d
Solanki

@ Jaydeep Baru saja mencobanya, dan itu berhasil. Namun Android studio tidak menyoroti sintaks dan menghasilkan banyak kesalahan IDE dengan pesan Exception while analyzing expression at (12,23) in /projectpath/KotlinDataBinding/app/src/main/java/com/example/kotlindatabinding/MainActivity.kt:. Apakah Anda memiliki kesalahan yang sama? Dan apa versi studio android Anda?
Mikhail

@Arkadiy Sudah dilaporkan youtrack.jetbrains.com/issue/KT-8007 BTW Saya di studio v1.5 Pratinjau 2
Jaydeep Solanki

Ini bukan lagi versi terbaru dari plugin. Itu akan menyebabkan rasa sakit yang tidak perlu.
Avinash R

13

Versi kompilasi Binding Data sama dengan versi gradle di file build.gradle proyek Anda:

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


android {
  dataBinding.enabled = true
}

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

dan versi gradle adalah

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

Berikut adalah contoh tautan untuk menyelesaikan penggunaan pustaka penyatuan data di kotlin.

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


dataBinding.enabled = trueadalah apa yang saya lupa
Cesar Castro

7

Untuk Memecahkan masalah, Anda harus meletakkan

apply plugin: 'kotlin-kapt'

di bagian atas build.gradle (Module: app), lalu letakkan baris ini dalam dependensi

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

Anda dapat menemukan versi plugin android dengan masuk ke menu

File > Project Structure > Project

Kemudian Sinkronkan Lagi. Jika Anda melihat peringatan ini, abaikan saja.

Plug-in Gradle pihak ketiga mungkin menjadi penyebabnya


6

Coba ini. Studio Android 2.0 (2.1)

Di build.gradle

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

kapt {
    generateStubs = true
}

Dalam proyek saya: buildToolsVersion = "23.0.3"

di build.gradle tingkat atas

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

2
Anda harus menggunakan versi yang sama untuk kompiler dan plugin gradle alat build android. Jika tidak, hal itu dapat menyebabkan masalah pembangunan yang tidak terduga.
Avinash R

Saya harus menambahkan plugin yang berlaku: 'kotlin-kapt'
Andrii Kovalchuk

6

ini bekerja untuk saya di androidStudio ver3.1.3

apply plugin: 'kotlin-kapt'

dataBinding {
    enabled = true
}

tampilkan contoh penggunaan


4

Pengikatan data konfigurasi di kotlin

build.gradle (aplikasi folder)

apply plugin: 'kotlin-kapt'

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

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

Nikmati Kotlin ...


terapkan plugin: 'kotlin-kapt' sangat penting di Kotlin.
Rahul Rastogi

3

Pembaruan Penting

Anda dapat melihat di dokumentasi Android.

Kompiler baru dalam versi 3.2 diaktifkan secara default.

Jadi Hanya Perbarui Anda Android Studio untuk V3.2 atau yang lebih baru . dan hapus semua konfigurasi yang tidak perlu.

Jadi cukup aktifkan dataBinding di tingkat aplikasi build.gradle.

android {
    dataBinding {
        enabled = true
    }
}

Ini akan melakukan semua hal untuk Anda secara otomatis.

Anda dapat dengan aman menghapus di bawah garis-

  • Hapus databinding.compiler

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

    kapt {
        generateStubs = true
    }

Konfigurasi lengkap saya

build.gradle (Proyek)

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

Gunakan gradle versi terbaru . Gunakan kotlin versi terbaru .

build.gradle (Aplikasi)

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"

Penting. Jangan hanya menyalin dan menempelkan konfigurasi. Lihat jawaban ini untuk mengatur versi Kotlin.

gradle-wrapper.properties

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

Proyek saya masih pada rilis gradle 3.0.1 jadi ini tidak bekerja untuk saya.
naqi

Anda dapat memperbarui Android Studio dan meningkatkan mutu untuk mencapai stabilitas yang lebih tinggi.
Khemraj

3

Dalam kasus saya, kesalahannya adalah Unresolved reference: RegisterationUserBindingsaya hanya menggunakan nama tata letak saya fragment_registeration_userseperti ini FragmentRegisterationUserBindingdan membuatnya dalam tata letak Databinding dan kesalahan hilang.


Kamu hebat! Saya menghabiskan banyak waktu untuk menerapkan beberapa saran untuk menyelesaikan masalah tetapi tidak berdaya sampai menemukan jawaban ini. Mengubah ikatan menurut nama tata letak fragmen menyelesaikan masalah. Terima kasih banyak.
Ajay

senang itu membantu Anda
EL TEGANI MOHAMED HAMMAD GABIR

2

Tambahkan yang mengikuti Anda app build.gradle

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

Ini akan melakukan triknya.

$android_plugin_versionadalah versi com.android.tools.build:gradledalamapplication build.gradle

Juga, tambahkan ini ke modul Anda build.gradle

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


0

Tambahkan Penyatuan Data di Proyek android menggunakan ketika Anda telah menggunakan bahasa kotlin.

Langkah-langkah di bawah ini

--Pertama Anda perlu menambahkan plugin di bawah ini

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

- Penjilidan data kedua diaktifkan benar

**dataBinding {
        enabled = true
    }**

Semua poin ini ditambahkan di app.build.gradle setelah menekan "SYNC NOW"

Mari misalnya Anda telah mengedit aktivitas profil lalu bagaimana mendefinisikan variabel yang mengikat di kotlin ??

lateinit var buildProfileBinding: ActivityBuildProfileBinding

buildProfileBinding = getBinding()

Di sini, dapatkan penjilidan adalah metode untuk menangani jenis objek penjilidan mana

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

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

0

Dalam kasus saya, menambahkan

kapt {
    generateStubs = true
}

Memecahkan masalah bagi saya. Saya mengabaikannya pertama kali, saya pikir itu tidak relevan dengan masalah:

Penyatuan data referensi yang tidak terselesaikan

Tapi sekarang, pengikatan data berfungsi dengan baik.


0

Saya ingin membagikan pengalaman saya sendiri. Untuk menggunakan penyatuan data data dengan Kotlin di android studio sudah cukup untuk ditambahkan

dataBinding {
    enabled = true
}

Setelah itu "sinkronkan" dan, sangat penting, untuk "membuat Proyek". Setelah itu semua objek Anda akan aktif untuk digunakan.


0

Sebelum Anda mencoba menggunakan FragmentDetailsBinding, Anda harus memastikan Anda mengonversi tata letak yang sesuai (fragment_details.xml) ke tata letak pengikatan data dengan membungkus seluruh tata letak di tag induk "" dan memindahkan semua xmlns ke tata letak tag kemudian membangun proyek dan hanya itu


-1

Cukup keluar dari semua dependensi penyatuan data dan gunakan ini sebagai gantinya

android {
    dataBinding {
        enabled = true
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.