Kotlin-android: cơ sở dữ liệu tham chiếu chưa được giải quyết


143

Tôi đã theo dõi lớp phân đoạn được viết bằng Java bằng thư viện cơ sở dữ liệu mới

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

Nó biên dịch và chạy tốt.
Tôi đã cố gắng viết lại nó trong Kotlin và đã đưa ra những điều sau đây:

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

Nhưng bây giờ bước :app:compileDebugKotlinđầu ra như sau:

Lỗi: (16, 38) Tham chiếu chưa được giải quyết:
Lỗi dữ liệu: (37, 27) Tham chiếu chưa được giải quyết: FragmentDataBinding

Làm cách nào tôi có thể sử dụng thư viện dữ liệu android với Kotlin?

Cấp cao nhất của tôi 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.gradletrong ứng dụng dir (chỉ những phần có liên quan):

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

Tôi đang sử dụng Android Studio 1.4, Công cụ xây dựng phiên bản 23.0.1, Android SDK 23, công cụ SDK 24.4.0


3
Xin vui lòng, bỏ phiếu cho vấn đề tương ứng: https://youtrack.jetbrains.com/su/KT-8007
Ghedeon

1
Bạn chỉ cần có apply plugin: 'kotlin-kapt'trong tập tin lớp ứng dụng trong phiên bản gần đây nhất.
Hesam

private lateinit var ràng buộc: FragmentDataBinding Là cách khởi tạo tốt hơn
Dino Sunny

Câu trả lời:


85

Hãy thử sử dụng cấu hình này:

Trong bản dựng chính.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
    }
}

Xây dựng ứng dụng.gradle :

android {
    dataBinding {
        enabled = true
    }
}

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

kapt {
    generateStubs = true
}

1
@Irampazzo, đã 2.2.0-alphaXcó sẵn và FYI phiên bản liên kết dữ liệu giống như phiên bản của plugin android-gradle. vì vậy bạn có thể đưa ra phiên bản đó và sử dụng nó làm phiên bản của trình biên dịch.
Avinash R

1
Tôi có thể xác nhận rằng câu trả lời này đã khắc phục sự cố của tôi với databinding và kotlin
Rabie Jradi

12
Tôi cũng phải thêm apply plugin: 'kotlin-kapt'. Xem stackoverflow.com/a/42974558/1916449
arekolek

Tôi đã thử điều này. Bây giờ nó cho tôi một lỗi phụ thuộc tròn. Bất cứ ý tưởng về điều này?
leoOrion

Kiểm tra kotlinlang.org/docs/tutorials/ Nhật để có tài liệu chính thức về điều này.
Brian

72

Tôi tìm thấy giải pháp mới, hy vọng nó sẽ giúp bạn.

Trước hết hãy kiểm tra xem plugin có được áp dụng hay không:

apply plugin: 'kotlin-kapt'

sau đó

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

Bạn có thể có một lỗi trong phụ thuộc:

SỬ DỤNG

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

thay vì

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

Bạn có thể truy cập vào đây cho phiên bản mới

Cảm ơn bạn.


6
Tôi vẫn gặp vấn đề này :(
Mladen Rakonjac

Điều này đang làm việc với tôi (lớp bao bọc 4.4, công cụ 3.1.0)
Sergio

Thêm kapt 'com.android.databinding: trình biên dịch: 3.0.1' hoạt động với tôi
Duran Jayson

Nó hoạt động với tôi bằng cách chỉ thêm "áp dụng plugin: 'kotlin-kapt". Cảm ơn.
Subhan Ali

vừa thêm dòng này đang hoạt động với tôi (áp dụng plugin: 'kotlin-kapt') Android Studio 3.2.1 - Plugin Kotlin 1.3.0
Mohamed ElSawaf

14

Cập nhật 2: Đây là một câu trả lời thực sự cũ, thay vào đó hãy tham khảo câu trả lời của lrampazzo.

Nó hoạt động với 1.0-RC4, đặt

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

vào sự phụ thuộc của bạn

Cảm ơn Ghedeon, vì liên kết trong các bình luận

Cập nhật : Đây là một dự án ví dụ xin chào thế giới thực sự đơn giản


Tôi vẫn nhận được lỗi tương tự, tôi đang làm gì sai ở đây? gist.github.com/xdgimf/820c433efa8307821788
Miguel Fermin

đây là tập tin build.gradle của tôi nếu bạn cần một tài liệu tham khảo gist.github.com/jaydeep17/9960fdb0e5a1ba85e82d
Jaydeep Solanki

@Jaydeep Mới dùng thử, và nó hoạt động. Tuy nhiên, studio Android không làm nổi bật cú pháp và tạo ra nhiều lỗi IDE với thông báo Exception while analyzing expression at (12,23) in /projectpath/KotlinDataBinding/app/src/main/java/com/example/kotlindatabinding/MainActivity.kt:. Bạn có những lỗi tương tự? Và phiên bản studio android của bạn là gì?
Mikhail

@Arkadiy Nó đã được báo cáo youtrack.jetbrains.com/su/KT-8007 BTW Tôi đang ở studio v1.5 Preview 2
Jaydeep Solanki

Đây không còn là phiên bản mới nhất của plugin. Nó sẽ gây ra nỗi đau không cần thiết.
Avinash R

13

Phiên bản của trình biên dịch Data Binding giống như phiên bản gradle trong tệp build.gradle dự án của bạn:

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


android {
  dataBinding.enabled = true
}

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

và phiên bản lớp là

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

Dưới đây là một liên kết ví dụ để hoàn thành sử dụng thư viện dữ liệu trong kotlin.

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


dataBinding.enabled = truelà những gì tôi đã quên
Cesar Castro

7

Để giải quyết vấn đề, bạn phải đặt

apply plugin: 'kotlin-kapt'

ở đầu build.gradle (Module: ứng dụng), sau đó đặt dòng này trong phần phụ thuộc

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

Bạn có thể tìm phiên bản plugin Android bằng cách vào menu

File > Project Structure > Project

Sau đó đồng bộ lại. Nếu bạn thấy cảnh báo này, hãy bỏ qua nó.

Trình cắm Gradle của bên thứ 3 có thể là nguyên nhân


6

Hãy thử điều này.Andrid studio 2.0 (2.1)

Trong build.gradle

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

kapt {
    generateStubs = true
}

Trong dự án của tôi: buildToolsVersion = "23.0.3"

trong cấp cao nhất build.gradle

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

2
bạn nên sử dụng cùng một phiên bản cho cả trình biên dịch và trình cắm lớp công cụ xây dựng Android. Nếu không, nó có thể gây ra các vấn đề xây dựng không thể đoán trước.
Avinash R

Tôi đã phải thêm plugin áp dụng: 'kotlin-kapt'
Andrii Kovalchuk

6

công việc này đối với tôi trong androidStudio ver3.1.3

apply plugin: 'kotlin-kapt'

dataBinding {
    enabled = true
}

hiển thị mẫu sử dụng


4

Liên kết dữ liệu cấu hình trong kotlin

build.gradle (ứng dụng thư mục)

apply plugin: 'kotlin-kapt'

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

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

Thưởng thức ...


áp dụng plugin: 'kotlin-kapt' thực sự quan trọng trong Kotlin.
Rahul Rastogi

3

Cập nhật quan trọng

Bạn có thể xem trong tài liệu của Android.

Trình biên dịch mới trong phiên bản 3.2 được bật theo mặc định.

Vì vậy, chỉ cần cập nhật Android Studio của bạn lên V3.2 hoặc mới hơn . và loại bỏ tất cả các cấu hình không cần thiết.

Vì vậy, chỉ cần kích hoạt dataBinding ở cấp ứng dụng build.gradle.

android {
    dataBinding {
        enabled = true
    }
}

Nó sẽ làm tất cả mọi thứ cho bạn tự động.

Bạn có thể SAFELY XÓA dưới dòng-

  • Xóa databinding.compiler

    kapt 'com.android.databinding:compiler:3.0.1'
  • Tẩy kapt

    kapt {
        generateStubs = true
    }

Cấu hình hoàn chỉnh của tôi

build.gradle (Dự án)

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

Sử dụng gradle phiên bản mới nhất . Sử dụng kotlin phiên bản mới nhất .

build.gradle (Ứng dụng)

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"

Quan trọng Không chỉ sao chép và dán cấu hình. Xem câu trả lời này để thiết lập phiên bản Kotlin.

gradle-wrapper.properies

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

Dự án của tôi vẫn đang được phát hành lớp 3.0.1 vì vậy điều này không phù hợp với tôi.
naqi

Bạn có thể cập nhật Android Studio và gradle để đạt được sự ổn định hơn.
Khemraj

3

Trong trường hợp của tôi, lỗi là Unresolved reference: RegisterationUserBindingtôi chỉ sử dụng tên bố cục của mình fragment_registeration_usernhư thế này FragmentRegisterationUserBindingvà làm cho nó trong bố cục Databinding và lỗi đã biến mất.


Bạn tuyệt lắm! Tôi đã dành rất nhiều thời gian để áp dụng nhiều đề xuất để giải quyết vấn đề nhưng bất lực cho đến khi tìm thấy câu trả lời này. Thay đổi ràng buộc theo tên bố cục đoạn giải quyết vấn đề. Cảm ơn rất nhiều.
Ajay

rất vui vì nó đã giúp bạn
EL TEGani MOHAMED HAMMAD GABIR

2

Thêm vào sau bạn app build.gradle

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

Điều này sẽ làm các mẹo.

$android_plugin_versionlà phiên bản com.android.tools.build:gradletrongapplication build.gradle

Ngoài ra, thêm nó vào mô-đun của bạn build.gradle

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


0

Thêm Databinding trong Android Project bằng cách sử dụng ngôn ngữ kotlin.

Các bước dưới đây

--Đầu tiên bạn cần thêm plugin dưới đây

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

- Dữ liệu thứ hai được bật đúng

**dataBinding {
        enabled = true
    }**

Tất cả điểm này được thêm vào trong app.build.gradle sau khi nhấn "SYNC NOW"

Cho phép Ví dụ bạn đã chỉnh sửa hoạt động hồ sơ thì làm thế nào để xác định biến ràng buộc trong kotlin ??

lateinit var buildProfileBinding: ActivityBuildProfileBinding

buildProfileBinding = getBinding()

Ở đây, có được ràng buộc là phương thức để xử lý loại đối tượng liên kết

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

DataBinding Librabry kapt 'com.android.databinding: trình biên dịch: 2.3.1'
Shripal Shah

0

Trong trường hợp của tôi, thêm

kapt {
    generateStubs = true
}

Giải quyết vấn đề cho tôi. Tôi đã bỏ qua nó lần đầu tiên, tôi nghĩ nó không liên quan đến vấn đề:

Cơ sở dữ liệu tham chiếu chưa được giải quyết

Nhưng bây giờ, ràng buộc dữ liệu đang hoạt động tốt.


0

Tôi muốn chia sẻ kinh nghiệm của riêng tôi. Để sử dụng dữ liệu dữ liệu với Kotlin trong studio android là đủ để thêm

dataBinding {
    enabled = true
}

Sau đó, "đồng bộ hóa" và, rất quan trọng, để "tạo dự án". Sau đó, tất cả các đối tượng của bạn sẽ được kích hoạt để sử dụng.


0

Trước khi bạn cố gắng sử dụng FragmentDetailsBinding, bạn phải đảm bảo rằng bạn đã chuyển đổi bố cục tương ứng (Fragment_details.xml) sang bố cục liên kết dữ liệu bằng cách gói toàn bộ bố cục trong thẻ "" cha mẹ và di chuyển tất cả xmlns sang thẻ bố cục sau đó xây dựng dự án và đó là nó


-1

Chỉ cần thoát khỏi tất cả các phụ thuộc cơ sở dữ liệu và sử dụng thay thế

android {
    dataBinding {
        enabled = true
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.