Kotlin-android: ฐานข้อมูลอ้างอิงที่ไม่ได้รับการแก้ไข


143

ฉันมีคลาสแฟรกเมนต์ต่อไปนี้เขียนใน Java โดยใช้ไลบรารี databinding ใหม่

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

มันรวบรวมและทำงานได้ดี
ฉันพยายามเขียนมันใหม่ใน Kotlin และทำสิ่งต่อไปนี้:

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

แต่ตอนนี้ขั้นตอน:app:compileDebugKotlinผลลัพธ์ต่อไปนี้:

ข้อผิดพลาด: (16, 38) ข้อมูลอ้างอิงที่ยังไม่ได้แก้ไข:
ข้อผิดพลาดdatabinding : (37, 27) ข้อมูลอ้างอิงที่ยังไม่ได้แก้ไข: FragmentDataBinding

ฉันจะใช้ห้องสมุด android-databinding กับ Kotlin ได้อย่างไร

ระดับบนสุดของฉัน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 (เฉพาะส่วนที่เกี่ยวข้อง):

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

ฉันใช้ Android Studio 1.4, สร้างเครื่องมือเวอร์ชัน 23.0.1, Android SDK 23, เครื่องมือ SDK 24.4.0


3
โปรดอย่าลังเลที่จะลงคะแนนสำหรับปัญหาที่เกี่ยวข้อง: https://youtrack.jetbrains.com/issue/KT-8007
Ghedeon

1
คุณต้องมีapply plugin: 'kotlin-kapt'ไฟล์ gradle ของแอปในเวอร์ชันล่าสุดเท่านั้น
Hesam

การผูกสายส่วนตัว: FragmentDataBinding เป็นวิธีการเริ่มต้นที่ดีกว่า
Dino Sunny

คำตอบ:


85

ลองใช้การกำหนดค่านี้:

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

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พร้อมใช้งานและ FYI เวอร์ชันของ data-binding จะเหมือนกับของ android-gradle-plugin เพื่อให้คุณสามารถส่งออกเวอร์ชันนั้นและใช้เป็นเวอร์ชันคอมไพเลอร์
Avinash R

1
ฉันสามารถยืนยันได้ว่าคำตอบนี้แก้ไขปัญหาของฉันด้วย databinding และ kotlin
Rabie Jradi

12
ฉันต้องเพิ่มapply plugin: 'kotlin-kapt'ด้วย ดูstackoverflow.com/a/42974558/1916449
arekolek

ฉันลองสิ่งนี้ ตอนนี้มันทำให้ฉันมีข้อผิดพลาดในการพึ่งพาแบบวงกลม มีความคิดเกี่ยวกับเรื่องนี้ไหม?
leoOrion

ตรวจสอบkotlinlang.org/docs/tutorials/…สำหรับเอกสารอย่างเป็นทางการเกี่ยวกับเรื่องนี้
Brian

72

ฉันพบโซลูชันใหม่หวังว่ามันจะช่วยคุณได้

ก่อนอื่นตรวจสอบว่าใช้ปลั๊กอินหรือไม่:

apply plugin: 'kotlin-kapt'

แล้วก็

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

คุณอาจมีข้อผิดพลาดในการพึ่งพา:

ใช้

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

แทน

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

คุณสามารถเยี่ยมชมที่นี่สำหรับรุ่นใหม่

ขอบคุณ.


6
ฉันยังมีปัญหานี้ :(
Mladen Rakonjac

สิ่งนี้ใช้งานได้สำหรับฉัน (เครื่องมือห่อหุ้มระดับ 4.4 เครื่องมือ 3.1.0)
Sergio

การเพิ่ม kapt 'com.android.databinding: คอมไพเลอร์: 3.0.1' ใช้งานได้สำหรับฉัน
Duran Jayson

มันใช้งานได้สำหรับฉันโดยเพิ่มเฉพาะ "ใช้ปลั๊กอิน: 'kotlin-kapt" ขอบคุณ
Subhan Ali

เพิ่งเพิ่มบรรทัดนี้ใช้งานได้สำหรับฉัน (ใช้ปลั๊กอิน: 'kotlin-kapt') Android Studio 3.2.1 - ปลั๊กอิน Kotlin 1.3.0
Mohamed ElSawaf

14

อัปเดต 2: นี่เป็นคำตอบที่เก่ามากแทนที่จะอ้างถึงคำตอบของ lrampazzo

มันทำงานร่วมกับ 1.0-rc4, ใส่

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

เป็นการพึ่งพาของคุณ

ขอบคุณ Ghedeon สำหรับลิงก์ในความคิดเห็น

อัปเดต : นี่คือตัวอย่างโครงการ Hello world ที่เรียบง่ายมาก


ฉันยังคงได้รับข้อผิดพลาดเดียวกันฉันทำอะไรผิดที่นี่? gist.github.com/xdgimf/820c433efa8307821788
Miguel Fermin

นี่คือไฟล์ build.gradle ของฉันหากคุณต้องการอ้างอิงgist.github.com/jaydeep17/9960fdb0e5a1ba85e82d
Jaydeep Solanki

@ Jaydeep เพิ่งลองและมันใช้งานได้ อย่างไรก็ตาม Android สตูดิโอไม่ได้เน้นไวยากรณ์และสร้างจำนวนมากของข้อผิดพลาด IDE Exception while analyzing expression at (12,23) in /projectpath/KotlinDataBinding/app/src/main/java/com/example/kotlindatabinding/MainActivity.kt:ด้วยข้อความ คุณมีข้อผิดพลาดเดียวกันหรือไม่? และเวอร์ชั่นสตูดิโอ Android ของคุณคืออะไร?
มิคาอิล

@Arkadiy ได้รับรายงานyoutrack.jetbrains.com/issue/KT-8007 BTW แล้วฉันอยู่ในสตูดิโอ v1.5 ดูตัวอย่าง 2
Jaydeep Solanki

นี่ไม่ใช่ปลั๊กอินเวอร์ชันล่าสุดอีกต่อไป มันจะทำให้เกิดอาการปวดที่ไม่จำเป็น
Avinash R

13

เวอร์ชันของ Data Binding compiler เหมือนกับเวอร์ชั่น gradle ในไฟล์ build.gradle โครงการของคุณ:

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


android {
  dataBinding.enabled = true
}

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

และรุ่น gradle คือ

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

นี่คือตัวอย่างลิงค์สำหรับใช้ databinding ไลบรารี่ใน kotlin

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


dataBinding.enabled = trueคือสิ่งที่ฉันลืม
ซีซาร์คาสโตร

7

เพื่อแก้ปัญหาคุณต้องใส่

apply plugin: 'kotlin-kapt'

ที่ด้านบนของ build.gradle (โมดูล: แอป) จากนั้นใส่บรรทัดนี้เป็นการอ้างอิง

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

คุณสามารถค้นหาเวอร์ชันปลั๊กอิน android ได้โดยไปที่เมนู

File > Project Structure > Project

จากนั้นซิงค์อีกครั้ง หากคุณเห็นคำเตือนนี้ให้เพิกเฉย

ปลั๊กอิน Gradle บุคคลที่สามอาจเป็นสาเหตุ


6

ลองใช้อันนี้. studio studio (2.1)

ในbuild.gradle

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

kapt {
    generateStubs = true
}

ในโครงการของฉัน: buildToolsVersion = "23.0.3"

ใน build.gradle ระดับบนสุด

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

2
คุณควรใช้เวอร์ชันเดียวกันสำหรับทั้งคอมไพเลอร์และ android build tools gradle plugin มิฉะนั้นอาจทำให้เกิดปัญหาการสร้างที่คาดเดาไม่ได้
Avinash R

ฉันต้องเพิ่มใช้ปลั๊กอิน: 'kotlin-kapt'
Andrii Kovalchuk


4

การกำหนดค่าการเชื่อมโยงข้อมูลใน kotlin

build.gradle (แอปโฟลเดอร์)

apply plugin: 'kotlin-kapt'

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

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

เพลิดเพลินกับ Kotlin ...


ใช้ปลั๊กอิน: 'kotlin-kapt' มีความสำคัญมากใน Kotlin
ราหุล Rastogi

3

การปรับปรุงที่สำคัญ

คุณสามารถเห็นสิ่งต่อไปนี้ เอกสารของ Android

คอมไพเลอร์ใหม่ในเวอร์ชัน 3.2 ถูกเปิดใช้งานโดยค่าเริ่มต้น

ดังนั้นเพียงอัปเดตAndroid Studioของคุณเป็น V3.2หรือใหม่กว่า และลบการกำหนดค่าที่ไม่จำเป็นทั้งหมด

ดังนั้นเพียงแค่เปิดใช้งานการผูกข้อมูลในระดับแอป build.gradleในระดับแอป

android {
    dataBinding {
        enabled = true
    }
}

มันจะทำทุกสิ่งให้คุณโดยอัตโนมัติ

คุณสามารถลบอย่างปลอดภัยด้านล่างบรรทัด -

  • ลบdatabinding.compiler

    kapt 'com.android.databinding:compiler:3.0.1'
  • ลบ kapt

    kapt {
        generateStubs = true
    }

config ของฉันสมบูรณ์

build.gradle (โครงการ)

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

ใช้รุ่นล่าสุด gradle ใช้kotlin เวอร์ชั่นล่าสุดรุ่นล่าสุด

build.gradle (แอป)

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"

สิ่งสำคัญอย่าเพิ่งคัดลอกและวางตั้งค่า ดูคำตอบนี้เพื่อตั้งค่าเวอร์ชั่น Kotlin

gradle-wrapper.properties

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

โครงการของฉันยังอยู่ในการปล่อย gradle 3.0.1 ดังนั้นนี่ไม่ได้ผลสำหรับฉัน
naqi

คุณสามารถอัปเดต Android Studio และไล่ระดับเพื่อให้มีเสถียรภาพมากขึ้น
Khemraj

3

ในกรณีของฉันข้อผิดพลาดคือUnresolved reference: RegisterationUserBindingฉันเพิ่งใช้ชื่อเลย์เอาต์ของฉันfragment_registeration_userเช่นนี้FragmentRegisterationUserBindingและทำให้เป็นรูปแบบ Databinding และข้อผิดพลาดก็หายไป


คุณทำได้ดีมาก! ฉันใช้เวลามากมายในการใช้คำแนะนำหลายอย่างเพื่อแก้ไขปัญหา แต่ทำอะไรไม่ถูกจนพบคำตอบนี้ การเปลี่ยนการโยงตามชื่อโครงร่างแฟรกเมนต์ช่วยแก้ไขปัญหา ขอบคุณมาก.
Ajay

ดีใจที่มันช่วยคุณ
EL TEGANI MOHAMED HAMMAD GABIR

2

เพิ่มการติดตามในตัวคุณ app build.gradle

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

นี้จะทำเคล็ดลับ

$android_plugin_versionเป็นรุ่นของcom.android.tools.build:gradleในapplication build.gradle

นอกจากนี้ยังเพิ่มสิ่งนี้ไปยังโมดูลของคุณ build.gradle

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


0

เพิ่ม Databinding ใน android project โดยใช้เมื่อคุณใช้ภาษา kotlin

ด้านล่างขั้นตอน

- ก่อนอื่นคุณต้องเพิ่มปลั๊กอินด้านล่าง

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

- การผูกข้อมูลสองครั้งเปิดใช้งานจริง

**dataBinding {
        enabled = true
    }**

ทุกจุดนี้เพิ่มเข้ามาใน app.build.gradle หลังจากกด "ซิงค์ทันที"

ให้เช่นคุณมีกิจกรรมโปรไฟล์แก้ไขแล้ววิธีการกำหนดตัวแปรผูกพันใน kotlin?

lateinit var buildProfileBinding: ActivityBuildProfileBinding

buildProfileBinding = getBinding()

ที่นี่รับการผูกเป็นวิธีการจัดการประเภทของวัตถุที่มีผลผูกพัน

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

DataBinding Librabry kapt 'com.android.databinding: คอมไพเลอร์: 2.3.1'
Shripal Shah

0

ในกรณีของฉันเพิ่ม

kapt {
    generateStubs = true
}

แก้ไขปัญหาให้ฉัน ฉันเพิกเฉยมันเป็นครั้งแรกฉันคิดว่ามันไม่เกี่ยวข้องกับปัญหา:

databinding การอ้างอิงที่ไม่ได้รับการแก้ไข

แต่ตอนนี้การผูกข้อมูลทำงานได้ดี


0

ฉันต้องการแบ่งปันประสบการณ์ของตัวเอง ในการใช้ดาต้าเบสผูกพันข้อมูลกับ Kotlin ใน android studio ก็เพียงพอแล้ว

dataBinding {
    enabled = true
}

หลังจากนั้น "ทำข้อมูลให้ตรงกัน" และสิ่งสำคัญคือ "สร้างโครงการ" หลังจากนั้นวัตถุทั้งหมดของคุณจะสามารถใช้งานได้


0

ก่อนที่คุณจะพยายามใช้ FragmentDetailsBinding คุณต้องตรวจสอบให้แน่ใจว่าคุณได้แปลงเค้าโครงที่สอดคล้องกัน (Fragment_details.xml) ไปเป็นเค้าโครงข้อมูลที่มีผลผูกพันโดยการห่อเค้าโครงทั้งหมดในแม่แบบแท็ก "" และย้าย xmlns ทั้งหมดไปยังแท็กเค้าโครงแล้วสร้างโครงการ


-1

เพิ่งออกจากการอ้างอิง databinding ทั้งหมดและใช้สิ่งนี้แทน

android {
    dataBinding {
        enabled = true
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.